diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..b10b426374d528986f027a4f06c106c8df415b02 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +/target/ +/corpus/private/ +/corpus/recovered/ +/evidence/ +/.DS_Store +__pycache__/ +/fuzz/target/ +/fuzz/corpus/ +/fuzz/artifacts/ +/fuzz/coverage/ +/tools/w7/payload/vendor/ diff --git a/API-AUDIT.md b/API-AUDIT.md new file mode 100644 index 0000000000000000000000000000000000000000..7e696f24ab7f6948b45feec8a7589e6d75793dcd --- /dev/null +++ b/API-AUDIT.md @@ -0,0 +1,69 @@ +# Public API audit + +The current API is reasonable for a Rust reader/canvas prototype and the supported +text-edit diagnostic tool. It is an experimental interoperability API, not yet a +stable application SDK. The workspace move preserves every public name and its +behavior; this audit adds contract documentation without introducing wrappers or +changing serialization. + +## Consumer boundary + +```text +owned snapshot bytes + └─ Store::parse committed storage; checksum diagnostics + └─ RevisionIndex::parse revision identities and dependencies + └─ Document::parse semantic views; checksum damage rejected + ├─ pages() active section pages in stored order + └─ text_runs() text with inherited formatting and links + +snapshot + typed identities + UTF-16 range + replacement + └─ commit_file_text lock → compare snapshot → append → flush + └─ Result<(), CommitError> success or explicit publication state +``` + +A document represents one `.one` or `.onetoc2` file, not a notebook directory. +The directory, section ordering, native references and report assets are currently +assembled by the tooling. A second crate can use the semantic model directly and +keep its layout/cache state separate. Mutating the public model changes only the +inspection view; writers reparse the supplied snapshot and enforce their own +invariants. + +## Findings and decisions + +| Area | Assessment | Recommendation | +| --- | --- | --- | +| Read/write separation | Good: parsed views cannot accidentally save themselves. Snapshot comparison rejects stale writes before publication. | Keep explicit commit operations; do not add a mutable document plus generic `save()`. | +| Commit outcomes | Good: `NotCommitted`, `Unknown` and `Committed` distinguish retry behavior. An error can still mean the edit persisted. | Keep this distinction at every UI/FFI boundary. Variant documentation now states the caller action. | +| Borrowing and lifetimes | The model owns decoded strings but borrows payloads. Consumers must retain its source snapshot/store. An application object holding both bytes and borrowed views would require a different ownership design. | Let the canvas prototype determine whether its actual access pattern needs an owned model. Do not add a self-referential owner or duplicate document DTO in advance. | +| Semantic error classification | `Error` exposes diagnostic text and an offset, with no typed reason. I/O failures already have `ErrorKind`; semantic distinctions such as unsupported edits and temporarily missing contexts require text matching today. | Before adding automatic semantic recovery, choose a small typed classification based on the recovery actions it needs. A detailed variant for every parser message would enlarge the compatibility burden. | +| Editable text discovery | Readable text is broader than editable text: hidden fields, hyperlinks, equations, generated content, conflicts and protected content can be readable but rejected for writing. Currently callers can try `replace_text` and inspect its result; candidate discovery duplicates some checks in the random-edit example. | For the diagnostic tool, obtain eligibility from the writer's actual validation. If a public eligibility API is added, share that validation rather than maintain a second list of rules. | +| Identity transport | `ExGuid` is typed, ordered, hashable and serializes to its display string. It has no `FromStr` or `Deserialize`. Existing tools retain or look up typed IDs instead of parsing them. | A Rust canvas can keep typed IDs. A JSON editing endpoint should either map strings back to IDs from its snapshot or justify a canonical parser with round-trip tests. | +| Raw storage exports | `Header`, nodes, references, property arenas and both revision layers are public. They are useful for diagnostics, but expose implementation details to consumers. | Keep them available during interoperability work; have the UI depend on `onestore::document` plus edit functions. Moving them into a separate module now would create churn without an established consumer requirement. | +| Public fields and enums | Inspection fields are mutable and enums are exhaustive. Downstream code can depend on the exact shape. | Treat the current Rust and JSON shapes as experimental. Whether to restrict construction or allow future enum variants is an API-evolution tradeoff to decide with the first consumer, not an assumed stability promise. | +| Document boundaries | `pages()` excludes conflicts/history, returns no visible pages for encryption, and rejects TOC files. All referenced contexts remain in the model. | These boundaries are now documented on the method. Readers must inspect the root kind when distinguishing a locked section from an empty section. | +| Units and defaults | Coordinates are points, edit/run offsets are UTF-16 units, Time32 values use the 1980 epoch, and `Format` preserves absence separately from explicit false. | Keep the native distinctions; renderers should use resolved runs and convert offsets explicitly when crossing into UTF-8 or browser selection APIs. | +| In-memory replacements | `replace_text` and `replace_property_bytes` return complete byte images without locking or persistence. Overwriting a live file with those bytes would bypass the commit protocol. | Their documentation now directs existing-file updates to the corresponding commit functions. Raw scalar editing still requires the caller to maintain document semantics. | +| Scope and dependencies | The library stays native and synchronous, with no network runtime, renderer, process management or platform UI dependency. Internal writer helpers remain crate-private. | Keep the core boundary. Put diagnostic serving and rendering in consumers; expose a C ABI only against concrete embedding needs. | + +The two decisions worth reviewing before the diagnostic tool are semantic error +classification and edit eligibility. Neither requires a broad API redesign. +The lifetime/ownership question can be informed by the separate canvas prototype. + +## Verification + +- Root workspace tests: `evidence/m8/workspace-tests.log`. +- Clippy and formatting: `workspace-clippy.log`, `workspace-format.log`. +- Rustdoc and compiled documentation example: `workspace-docs.log`, + `workspace-doctests.log`. +- All eight cargo-fuzz targets build against the relocated library: + `workspace-fuzz-build.log`. +- Python verification tools: 36 tests in `workspace-python.log`. +- An independent crate under `evidence/m8/api-consumer` uses only public APIs to + create a section, traverse pages/runs, serialize identities, commit a Unicode + edit, reject a stale snapshot through typed commit/I/O state, and reopen the + exact resulting text. Output: `evidence/m8/api-consumer.log`. + +The audit examined exported declarations and their implementations in storage, +revision resolution, document interpretation, creation, editing and persistence. +It does not freeze the API or turn the earlier native compatibility evidence into +a new platform guarantee. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000000000000000000000000000000000000..dcab381a17e62e126615d9f449b7f3f18915a5d8 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,169 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "md5" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebb8d8732c6a6df3d8f032a82911cfc747e00efb95cc46e8d0acd5b5b88570c" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "onestore" +version = "0.1.0" +dependencies = [ + "getrandom", + "md5", + "nix", + "serde", + "serde_json", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "syn" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..ea4b407f93bd02410ede11922e847368ad6d3f6b --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,4 @@ +[workspace] +members = ["crates/*"] +exclude = ["fuzz"] +resolver = "3" diff --git a/FEATURES.md b/FEATURES.md new file mode 100644 index 0000000000000000000000000000000000000000..7a156aa4db2204639b7d0394bab79c61cfb58293 --- /dev/null +++ b/FEATURES.md @@ -0,0 +1,29 @@ +# Milestone 6 feature matrix + +The matrix follows MS-ONE's document families, including features absent from the +personal corpus. Each row requires an independently authored native fixture, +Rust interpretation checks, and a review-report inspection before acceptance. +A retained opaque payload is evidence of preservation, not interpreted coverage. + +| Family | Required cases | Specification Evidence | +| --- | --- | --- --- | +| Notebook structure | Multiple notebooks, section groups, section ordering/colors, duplicate names, empty sections | 2.2.14–18, 2.2.91–96 [Native feature controls](corpus/m6/native-features-01/ORACLE.md); [Rust scale](evidence/m6/rust-scale-final-01.log) | +| Pages | Titles/alternate titles, order, subpages, duplicate text/titles, authors/timestamps, RTL | 2.2.19, 2.2.29–31, 2.2.58, 2.3.74 [Direction/origin controls](corpus/m6/native-page-direction-03); [private review](evidence/m6/private-current-report-05/qa/review.json) | +| Outline hierarchy | Positioned outlines, nesting, outline groups, indentation, collapsed/hidden content | 2.2.20–23, 2.3.8, 2.3.18–19 [Structure](corpus/m6/native-structure-01/ORACLE.md); [saved collapse](corpus/m6/rust-collapse-control-01/ORACLE.md) | +| Text | ASCII/Unicode preference, surrogate pairs, combining marks, mixed scripts, empty/long paragraphs | 2.1.4, 2.2.5, 2.2.23, 2.2.89 [100 native histories](evidence/m6/native-histories-independent-03.log); [break controls](corpus/m6/native-break-controls-02) | +| Character formatting | Mixed runs, font/size/color/highlight, bold/italic/underline/strike, super/subscript, language | 2.2.43–45, 2.2.76–77, 2.3.9–16 [Native probes](corpus/m6/native-probes-01/ORACLE.md); [private native comparison](evidence/m6/private-current-compare-01.log) | +| Paragraph formatting | Named styles, alignment, spacing, RTL, style inheritance | 2.2.44, 2.2.80, 2.2.83, 2.3.81–83 [Structure](corpus/m6/native-structure-01/ORACLE.md); [feature report inspection](evidence/m6/features-report-05/qa/review.json) | +| Lists | Bullets, numbering, restarts, mixed indentation, custom fonts/formats | 2.2.25, 2.2.57, 2.3.20, 2.3.43 [Structure](corpus/m6/native-structure-01/ORACLE.md); [numbering controls](corpus/m6/native-features-01/ORACLE.md) | +| Tables | Multiple rows/columns, nested content, widths, shading, borders, locked columns | 2.2.26–28, 2.2.66, 2.2.70, 2.2.97 [Widths/locks](corpus/m6/native-structure-01/ORACLE.md); [RTL](corpus/m6/native-page-direction-03); [shading limitation](corpus/m6/cell-shading-control-01/ORACLE.md) | +| Links | External/internal links, formatted labels, embedded text-run data | 2.2.78, 2.2.82, 2.2.90, 2.3.75–77 [Native link controls](corpus/m6/native-link-controls-01); [empty-label regression](corpus/m6/native-empty-link-01) | +| Images | Multiple formats, sizes, alt text, filenames, internal/external containers, background/printout images | 2.2.24, 2.2.36, 2.2.59, 2.2.75, 2.2.79 [Native formats/roles](corpus/m6/native-features-01/ORACLE.md); [browser inspection](evidence/m6/features-report-05/qa/review.json) | +| Files and media | Attachments, original filenames, recording identifiers, audio/video payloads and associated text | 2.2.32–33, 2.2.60–61, 2.2.71–72 [Native attachment/recording controls](corpus/m6/native-features-01/ORACLE.md) | +| Ink and embedded objects | Strokes, placement, native payload/export comparison, math and embedded text-run objects | Native ink corpus; 2.3.79–80 [Native ink](corpus/native-ink/cold-ui-ink); [math](corpus/m6/native-math-01/ORACLE.md): payload/run preservation, opaque rendering | +| Tags and tasks | Standard/custom tags, multiple tags, checked/unchecked state, task status/dates | 2.1.9, 2.2.41–42, 2.2.84–88, 2.3.85–96 [Native task controls](corpus/m6/native-features-01/ORACLE.md); [private tags](evidence/m6/private-current-compare-01.log) | +| History and recovery | Version pages/contexts, recycle-bin pages, conflicts and their source relationships | 2.1.1–2, 2.1.17, 2.2.34–40, 2.2.86 [Private history review](evidence/m6/private-current-report-05/qa/review.json); [live conflicts/recovery](corpus/m6/live-collaboration-15/ORACLE.md) | +| Protection and unknowns | Locked section identity/ciphertext, unknown JCIDs/properties, malformed structures | MS-ONESTORE encryption; MS-ONE 2.1.5, 2.1.12 [Existing corpus checks](evidence/m6/corpus-regression-01.log); [document fuzzing](evidence/m6/document-public-fuzz-08.log): ciphertext/raw data preserved | +| Scale and interactions | Rust/native large notebooks, many pages/objects/assets, repeated identities/text, mixed feature histories | All applicable rows [Independent native histories](evidence/m6/native-histories-independent-03.log); [Rust scale](evidence/m6/rust-scale-final-01.log) | + +[M6-ACCEPTANCE.md](M6-ACCEPTANCE.md) records the native builds, comparisons, +report inspections, regression campaigns and interpretation boundaries. `evidence/m6/spec-objects.json` +is the current object-definition inventory extracted from the supplied markdown. diff --git a/M6-ACCEPTANCE.md b/M6-ACCEPTANCE.md new file mode 100644 index 0000000000000000000000000000000000000000..cf3c8872f1e33d0441f0fbd93c3902ec257e4270 --- /dev/null +++ b/M6-ACCEPTANCE.md @@ -0,0 +1,102 @@ +# Milestone 6 verification + +The deliverable is a read-only document model and reading report. Its acceptance +boundary is the copied personal notebook: automated native comparisons plus a +page-by-page review with no known easily spottable content failures. Native PDF +references preserve access to the original canvas arrangement. + +## Personal notebook + +[The current report](evidence/m6/private-current-report-05/index.html) includes the +user-approved newer `Video.one`. [Its source manifest](corpus/private/current-source-manifest.json) +identifies that snapshot; [the original frozen manifest](corpus/private/source-manifest.json) +remains separate. The original files are never edited by the library tests. + +| Check | Evidence | +| --- | --- | +| 26 current/recycle pages, 109 tags, 188,560 explicit character-format comparisons | [Fresh-cache comparison](evidence/m6/private-current-compare-01.log) | +| 18 historical pages, including all three versions of the updated Video page | [Album](evidence/m6/private-history-final-01.log), [Video](evidence/m6/private-video-current-history-cold-compare-01.log), [deleted page](evidence/m6/private-deleted-history-final-01.log) | +| All 45 report pages reviewed: ordinary, historical, recycle-bin and default template | [Review record](evidence/m6/private-current-report-05/qa/review.json) | +| Frozen copy, approved current copy and live sources match their respective manifests | [Integrity check](evidence/m6/source-integrity-current-01.json) | + +The updated current page was inspected through eight browser viewports and two +native PDF pages. Unchanged page bodies inherit their earlier review only after +an exact rendered-content comparison. All exported image payloads decode. +History labels use America/Los_Angeles. Seventeen historical dates match native +UI evidence; copying the sole deleted-page version changes its native displayed +date, so the report retains the source revision timestamp and records that +normalization separately. + +## Independent and adversarial checks + +| Campaign | Result and evidence | +| --- | --- | +| Native edit histories | [100 histories / 2,000 independently specified operations](evidence/m6/native-histories-independent-03.log); [101 resulting pages compared](evidence/m6/native-histories-final-02.log) | +| Shrinking | [Seed 21](evidence/m6/history-shrink-21/minimal.json) reduced from 20 operations to 3 in 37 fresh-clone replays; [empty-link regression](corpus/m6/native-empty-link-01) | +| Rust scale generation | [128 sections / 2,097,152 Unicode scalars](evidence/m6/rust-scale-final-01.log), including reverse section ordering after native import | +| Document fuzzing | [65,736 runs / 121 seconds](evidence/m6/document-public-fuzz-08.log) after the collapse-field change; prior [100,398-run campaign](evidence/m6/document-public-fuzz-07.log) and [11,423 private-seed runs](evidence/m6/document-private-fuzz-03.log) | +| Rust checks | [All targets](evidence/m6/rust-regression-06.log), [clippy](evidence/m6/clippy-final-04.log) | +| Native/report tooling | [18 tests](evidence/m6/tool-regression-15.log), including deliberate oracle failures and TIFF/native pixel parity | +| Existing writer and fault cases | [Writer](evidence/m6/writer-regression-01.log), [collaboration/FLUSH regression](evidence/m6/collaboration-regression-02.log) | +| Expanded live matrix | [Seven passing cases](corpus/m6/live-collaboration-15/ORACLE.md), [fresh-cache comparison](evidence/m6/live-collaboration-cold-compare-15.log), [native conflict view](corpus/m6/live-collaboration-cold-15/conflict.png) | + +The document fuzzer mutates property streams inside native files and repairs +object checksums, reaching document interpretation beyond header rejection. +It traverses referenced historical revisions and resolves text runs. Native +histories have a separate expected-operation model; matching two views derived +from the Rust decoder is not counted as independent verification. + +The live matrix covers disjoint edits, competing edits, Samba restart, per-client +transport loss, whole-file lock contention, OneNote process termination and abrupt +VM termination. The process/VM cases recover already server-persisted edits. +They do not establish unsynchronized-cache durability or physical power-loss +safety. Earlier stage-5 cases separately cover lost successful SMB FLUSH replies. + +## Interpretation and oracle boundaries + +- Native XML omits partial black highlights. Native PDF rectangles supply a + separate check; the reader retains the stored highlight. +- RTL native XML column order differs from physical left-to-right storage order. + Independent PDF coordinates establish the conversion. Page-origin translation, + locked/unlocked column widths and printout borders have isolated controls. +- A saved paragraph collapse default differs from a client's transient expanded + view. [The native UI control](corpus/m6/native-expanded-control-ui-01/ORACLE.md) + and [Rust-authored control](corpus/m6/rust-collapse-control-01/ORACLE.md) distinguish them. +- Ink, structured equations, encrypted content and unknown properties retain + payloads or source identities. Preservation is not decryption or interpretation. + Structured equation runs expose a native-reference placeholder; ordinary inline + math text remains readable. +- TIFF browser previews match OneNote's exported pixels while original TIFF bytes + remain available. Native image conversion is not a license to replace source data. +- [Cell shading](corpus/m6/cell-shading-control-01/ORACLE.md) follows the documented + stored COLORREF value. A fresh OneNote 2010 cache opens the control but omits + shading from XML and renders the cell white; native rendering parity for that + property is not claimed. + +Verification uses OneNote 2010 build 14.0.4763.1000 in disposable Windows 7 clones. +The earlier storage/collaboration corpus used build 14.0.7015.1000 on the physical +machine. Each run records its environment and cleanup. These finite campaigns +support this milestone's review boundary, not a claim of universal compatibility +or absence of bugs. + +## Reproduce + +Use a new output directory for each native capture or report: + +```sh +cargo test --all-targets +cargo clippy --all-targets -- -D warnings +cargo build --example document +PYTHONPATH=tools python3 -m unittest discover -s tools -p 'test_*.py' +python3 tools/native_runner.py COPIED_NOTEBOOK NEW_CAPTURE --pdf +python3 tools/verify-document.py COPIED_NOTEBOOK NEW_CAPTURE/read +python3 tools/notebook_report.py COPIED_NOTEBOOK NEW_REPORT \ + --native NEW_CAPTURE/read --timezone America/Los_Angeles +cargo +nightly fuzz run document -- -max_total_time=120 -max_len=512 -rss_limit_mb=2048 +python3 tools/native_collaboration.py NEW_CAPTURE --linux OWNED_LAB_NAME +``` + +Python native comparison/report tests require Pillow and pdfplumber. Historical +report references use repeated `--versions CAPTURE_DIRECTORY` arguments after +`verify-document.py --versions CAPTURE_DIRECTORY/version-ui.json` has checked +source hashes and associated the native copies with stored revisions. diff --git a/MILESTONE6.md b/MILESTONE6.md new file mode 100644 index 0000000000000000000000000000000000000000..cf1959a5a02eb53d867a1d974cb44143aa2ef1d5 --- /dev/null +++ b/MILESTONE6.md @@ -0,0 +1,183 @@ +# Milestone 6: a reviewable OneNote document model + +Completed milestone; verification and review artifacts are recorded in +[M6-ACCEPTANCE.md](M6-ACCEPTANCE.md). Clover chose +extracting a real notebook into a readable document model as the first hands-on +result. This milestone combines document-format work with repeatable native +verification; completion requires no known easily spottable bugs in her notebook +after automated native comparisons and an independent page-by-page inspection. +Her review should find subtle design issues, not serve as the basic QA pass. + +## What Clover receives + +A local, read-only review report generated from the copied personal notebook, +with notebook/section/page navigation, readable content, extracted media, and a +document-structure view. The report exposes paragraph nesting and ordering, +text-run styles, outline coordinates, tables, links, tags, and source identities. +It accompanies a machine-readable model and an asset directory, so the result is +useful to future applications as well as inspectable by a person. + +The report presents a readable interpretation of the document. It does not claim +to reproduce OneNote's layout engine. Coordinate values and native reference +captures let Clover assess spatial information without depending on a new canvas +renderer. Ink, recording data, encrypted sections, and unrecognized structures +must remain explicitly accounted for, with retained payloads or source references +as appropriate. Unsupported interpretation must never turn into silent omission. + +Feedback should be attached to identifiable pages/objects and answer: + +- Does the section/page hierarchy match the notebook, including subpages and order? +- Does the representation preserve meaningful paragraph/list/table structure? +- Are text, formatting, links, images, attachments, and tags correctly associated? +- Where does spatial arrangement communicate something the readable view loses? +- Which opaque content prevents this model from supporting a useful reader? + +The review ends with concrete corrections or priorities for the document model. +Editing API design follows that feedback; no GUI editor is part of this milestone. + +## Sequence and gates + +| Step | Deliverable | Gate before proceeding | +| --- | --- | --- | +| 1. Repeatable native oracle | Automated fresh-clone runs using the existing VM controllers, named disposable notebooks, bounded captures, and unconditional teardown | Existing reader/writer native cases replay successfully; intentional content corruption causes a failed comparison; a failed run retains a reproducible artifact bundle and leaves no owned VM running | +| 2. Document semantics | A typed view over the resolved store graph, independent of COM and filesystem transport | Every interpreted feature has a native fixture and assertions for its semantic invariants; unknown and encrypted content is represented explicitly | +| 3. Real-notebook review | Machine-readable export, assets, and a human-readable report derived from the same model | All copied sections/pages are accounted for, source hashes remain unchanged, and supported content matches newly captured native evidence | +| 4. Adversarial validation | Seeded native edit histories, parser fuzzing, and replay of existing commit/concurrency cases | The feature/failure matrix passes, discrepancies have regression cases, and the acceptance report distinguishes exact matches, allowed native normalization, and opaque content | + +## Document scope + +Start with notebook and section structure, ordered pages/subpages, titles, outlines, +paragraphs, and Unicode text runs. Add character/paragraph formatting, list and +indentation semantics, tables, hyperlinks, images, attachments, and note tags. +Expose conflict pages and recycle-bin membership separately from ordinary pages; +retain their relationship to their source page/section. Account for observed +unrecognized page-like metadata instead of filtering it out of the report. + +MS-ONE text-run boundaries use character positions with rules distinct from Rust +UTF-8 byte indices. Fixtures must cover surrogate pairs, combining marks, RTL text, +mixed formatting, empty paragraphs, repeated text, and embedded objects. Titles, +cached title strings, styles, and layout metadata need explicit interpretation; +generic scalar decoding alone cannot establish those relationships. + +Keep document interpretation above `onestore`'s revision/property graph. Retain +access to raw identities and values for unknown properties. Add types only where +they express document semantics or prevent invalid interpretation; keep the initial +export/API provisional until Clover has reviewed actual notebook content. + +## Independent verification + +```text +Authored operation history ──→ expected document semantics + │ + └─→ real OneNote edit/save → captured .one + native XML/payloads + │ + └─→ Rust document model + │ + compare all three ─┘ + +Existing Rust scalar edit → fresh native read/edit/save → Rust reread +``` + +Native capture runs use a fresh clone/cache for each independent acceptance case. +Tests of a continuing collaboration session deliberately retain that session's +cache, then use a separate fresh verifier after synchronization. Completion must +be observed through file/content state, not inferred from an arbitrary sleep or a +successful asynchronous COM call. COM IDs are cache identities, not persistent +notebook identities. + +Compare page relationships/order, paragraph boundaries, text runs/styles, table +cells, positions, links, and payload bytes. Hashes establish artifact integrity; +they do not establish semantic correctness. Native XML supplies an independent +view of supported content. Selected UI captures cover facts COM omits, especially +conflicts and visual interpretation. Whole-file byte equality after a native save +is not the oracle because OneNote rewrites metadata and representation. + +Build native-only control cases for observed normalization, including the previous +table-width and ink z-order changes. Comparison exceptions require specific +evidence and a narrow assertion; broad removal of timestamps, IDs, or geometry +must not conceal meaningful changes. + +Use a small independent test model for generated operations; expected values must +not be reconstructed by the same Rust decoder being checked. Shrink a failed +history by removing operations and simplifying their parameters, replaying each +candidate from a clean starting state. Preserve seed, operation history, input and +output files, model diff, native XML/payloads, app/server versions, and relevant +trace excerpts. A regression must reproduce the observed discrepancy before its +fix can be accepted. + +Build a specification-derived feature matrix, including features absent from the +personal and stock notebooks. Produce large synthetic notebooks both through Rust +and through real OneNote; compare independent generation paths and exercise size, +ordering, repetition, and mixed-feature interactions. Any unsupported feature must +be explicitly accounted for and investigated, not silently omitted from coverage. + +Initial randomized target: 100 reproducible native histories of roughly 20 +operations, spanning the supported feature matrix. This is a campaign budget, +not a statistical safety claim. Native-generated files then seed fast local +reader fuzzing. Continue the existing stateful short-I/O/partial-persistence +commit tests; run the existing collaboration scenarios with two Windows clients +and the disposable Linux server. Process termination, Samba restart, transport +loss, and abrupt VM termination are distinct fault cases and must be reported as +such. VM termination does not simulate physical host power loss. + +## Tooling findings and setup work + +The implementation is in `tools/w7`. Windows instances use sparse qcow2 overlays +on a sealed base, unique hostnames/MACs/control targets, and an authenticated agent. +Linux instances also use overlays. A VDE network connects Windows clients to one +Linux Samba appliance at `192.168.77.1`; the Mac has forwarded SSH and SMB ports. +The MCP's up/down/status operations are enough for ordinary fresh-clone tests. +Reuse those controllers from the test runner rather than implementing another +QEMU lifecycle. Add a narrow controlled-crash facility only when fault cases need +it, with ownership checks and restart/recovery of the same overlay. + +Start with two Windows clients and one Linux server. Windows uses x86 CPU +emulation on this host; the suggested 25-client capacity has not been measured. +Increase concurrency from measured test throughput and resource use. One Linux +lab address means server restart/configuration tests require exclusive ownership +of that server; ordinary cases can use separate notebook directories. + +The scout confirmed: + +- Windows 7 clone `m6scout`, PowerShell 5.1.14409.1005, OneNote 14.0.4763.1000. + The earlier physical-machine corpus used OneNote 14.0.7015.1000. Record both + builds' evidence separately; success on one must not be silently attributed to + the other. +- The clone desktop was 800×600, so existing 1280×720 AHK coordinates cannot be + reused without setting and verifying display configuration. +- Z: mapped to `\\10.0.0.1\agent` (zenith). The disposable Linux share is a + different destination, `\\192.168.77.1\agent`. Parameterize shared paths rather + than reusing the old A: convention or remapping Z:. +- Linux reported Samba 4.22.10 and an ext4 data filesystem. Windows read a + Linux-created marker and Linux read a Windows-created marker through that share. +- A fresh native cache opened the template-free Rust notebook and returned its + expected paragraph through COM. The captured XML is under + `evidence/milestone6-scout/page.xml`. Cache reset remains necessary when reusing + file identities within a clone. +- Procmon started through `win7_spawn` and wrote a PML capture. The unfiltered + short capture grew to about 126 MB; filter by test process/path and bound capture + duration before using it in a campaign. Trace contents were not analyzed in this + scout, and the transient PML was removed with the clone. +- All six VM-tooling tests passed with the scout running. One test assumed the + first control port was free; it now checks that the registered target points to + the allocated port, while retaining the separate uniqueness assertion. +- Both scout VMs were stopped and deleted after the smoke checks. Neither the + sealed images nor the personal notebook were edited. + +Existing native scripts assume a parked personal Windows profile, fixed A: paths, +and specific display coordinates. Adapt their orchestration for disposable clones +while retaining the guards used for the physical laptop. Windows base identity, +Linux package/server versions, and relevant configuration must accompany every +run; cloud-init currently installs packages at clone creation time. + +## Completion and review boundary + +The milestone is ready after the copied notebook passes automated comparison and +an independent page-by-page inspection with no known easily spottable bugs. +Corrections found during that inspection need reproductions and regression checks +before handoff. Clover's subsequent review addresses subtle representation and +design decisions. Deliver the report, model, +assets, acceptance matrix, and reproduction command together. Preserve originals +and export evidence before automatically deleting all machines created by the +run. The next decision is which document operations to expose for editing based +on that review, rather than another general approval to continue infrastructure. diff --git a/MILESTONE7.md b/MILESTONE7.md new file mode 100644 index 0000000000000000000000000000000000000000..3a705c278ee5d9c52da39ff096df1333da96a3fb --- /dev/null +++ b/MILESTONE7.md @@ -0,0 +1,429 @@ +# Milestone 7: concurrent editing + +Acceptance gates passed for the tested macOS Rust, OneNote 2010 and Linux Samba +configuration. The edited notebook has fresh native references and an HTML +review; independent operation histories verify overlapping clients, retained +conflicts and the final notebook after native application closure. + +## Gates + +1. Document edits: publish text and dependent run boundaries atomically; check + Unicode boundaries, preserve untouched objects and opaque properties, reject + unsupported edits before writing. Validate native round trips before racing. +2. Random-edit CLI: select a page and seed, record the exact intended operation, + source identity and commit outcome. Operate on disposable notebook copies. +3. Local concurrency: independent reader/writer processes, synchronized starts, + stale snapshots, lock contention, randomized delays and interrupted commits. + Verify every successful observation and explain every accepted edit. +4. Native concurrency: grow from three native clients plus multiple Rust + processes to larger measured workloads. Mix disjoint and same-paragraph + changes, ordinary reads, synchronization, disconnects and restarts. Prove + operation overlap from recorded intervals; do not count open idle clients. +5. Adversarial replay: retain seeds, operation logs and snapshots; shrink failures + and add regressions. Compare the independent operation model with current + native content and explicitly reachable conflicts, then cold-reopen results. +6. Review and cleanup: inspect the edited report and native references, rerun + prior gates, verify original source hashes, delete owned machines, and record + observed client counts, operations, faults and the limits of the evidence. + +Disjoint acknowledged changes must survive. Competing changes must be accounted +for by their observed ordering or accessible conflict content; historical bytes +alone do not prove recovery. Unknown commit outcomes require rereading before a +retry. Native COM page snapshots must not replay untouched stale containers. + +Crash tests distinguish application cache state, server-persisted state and +storage durability. No finite campaign proves all schedules or hardware +power-loss behavior. + +## Replay + +Use fresh output directories and Linux VM names; the native harness deletes its +owned machines on exit. The Linux lab address allows one server run at a time. + +```sh +python3 tools/native_collaboration.py evidence/m7/new-stress --linux new-stress --stress-clients 3 --stress-operations 150 --sync-every 0 --rust-writers 4 --rust-readers 3 --edit --seed 913 +python3 tools/native_runner.py evidence/m7/new-stress/stress-closed/notebook evidence/m7/new-cold --expected-pages 1 +python3 tools/verify-document.py evidence/m7/new-stress/stress-closed/notebook evidence/m7/new-cold/read +python3 tools/native_stress.py evidence/m7/new-stress evidence/m7/new-cold/read +python3 tools/native_collaboration.py evidence/m7/new-conflict --linux new-conflict --conflict-clients 3 --rust-writers 3 --rust-readers 2 --stress-operations 5 --seed 917 +cargo +nightly fuzz run edit_text -- -max_total_time=300 -max_len=128 -rss_limit_mb=2048 +``` + +## Evidence + +- `evidence/m7/text-edit-native-02`: a length-changing Unicode edit reopened in + a fresh OneNote VM; 297 explicit formatting comparisons passed on one page. +- `evidence/m7/local-concurrency-02`: ten Rust writers and six readers; + 600 acknowledged commits and 8,101 checked observations. The final notebook + reopened in a fresh native cache (`local-concurrency-native-02`). +- `evidence/m7/edit-text-multi-fuzz-03.log`: 31,394 stateful executions with + six independently stale writer snapshots and interrupted publication. This + simulates interleavings; native concurrency is a separate gate. +- `evidence/m7/native-concurrency-01` and `native-concurrency-02`: three native + clients, four Rust writers and three Rust readers exposed a macOS SMB lock + failure. Native COM acknowledgments were not durable synchronization: the + stalled server copy did not contain those cached native edits. These runs + failed acceptance and all of their machines were deleted. +- `evidence/m7/lock-race-default`: a notebook-free, four-process reproducer + detected overlapping exclusive holders using an independent local marker, + plus stranded locks when switching read-only and read/write opens. Explicit + unlock alone did not fix it. Uniform access modes still violated exclusion. +- `evidence/m7/lock-race-atomic`: atomic open-and-lock passed all three access + modes without overlap. The macOS file adapter now uses that operation. +- `evidence/m7/smb-rust-only-04`: the formerly stalled workload completed all + 120 commits, 940 verified reads and 203 overlapping writer calls after that + change. Broader acceptance remains active; this does not establish a native + multi-client pass. + +- `evidence/m7/lock-race-atomic-16`: sixteen processes, 4,516 acquired locks + across read-only, read/write and alternating access; no marker overlap. +- `evidence/m7/smb-rust-only-05`: ten writers and six readers completed 1,000 + commits and 14,913 verified observations. The saved result subsequently + failed fresh-cache native acceptance (`smb-concurrency-native-05`): OneNote + returned zero pages after five minutes. The dependency-checkpoint fix and subsequent native checks below explain + and resolve this failure; Rust parsing alone was insufficient acceptance. +- `evidence/m7/native-concurrency-03`: all 90 native edits and 120 Rust edits + converged, but the overlap gate correctly rejected the run. Native calls + began 4.5–5.4 seconds after the first Rust commit; Rust finished at 2.7 + seconds. The shared-file start marker was delayed. The harness now waits + for each native client's first-edit acknowledgment before releasing Rust. +- `evidence/m7/local-stateful-01`: eight writers and five readers, 800 random + length-changing Unicode replacements, 9,820 verified observations. The + independent oracle applies recorded UTF-16 edit intents to each committed + state and checks all reader observations against the resulting history. +- `evidence/m7/edit-text-multi-fuzz-04.log`: 26,377 renewed stateful fuzz + executions completed without a failure. +- `evidence/m7/native-concurrency-04`: all 90 native edits and 120 Rust edits + converged, but overlap remained zero. Rust's first successful commit occurred + 10.21 seconds after its start signal, following thousands of busy reads while + native clients synchronized after every edit. Atomic open requests deny-all + sharing on this mount; native open handles can postpone Rust admission. +- `evidence/m7/native-threshold-02` and `native-threshold-03`: a fresh section + containing the same final text opened normally. The long-history section + opened after shortening revision dependencies while preserving its resolved + graph; coalescing file-node fragments alone did not help. Tested histories + through 676 transactions opened; 701 and longer failed. This bounds an + observed compatibility failure, not a documented format limit. +- The writer now appends an independent current-object snapshot before dependency + depth would exceed 512, retaining all older revisions. Section snapshots reuse + immutable property and attachment declarations; TOC snapshots remap CompactIDs + into a complete table. `checkpoint-boundaries-01.log` covers two boundaries in + both native section and TOC fixtures, with every historical revision checked. + `checkpoint-publication-01.log` checks interrupted text publication at the + boundary against complete old/new text and formatting states. +- `evidence/m7/local-checkpoint-01`: ten writers and six readers completed + 1,500 randomized Unicode replacements, 22,995 checked observations and 11,966 + overlapping writer calls. `checkpoint-native-01` cold-opened its saved result; + native text exactly matched the independently replayed edit history. +- `evidence/m7/edit-text-checkpoint-fuzz-05.log`: 4,558 stateful executions in + 302 seconds, including cached snapshots immediately before a full checkpoint, + with interrupted publication and character/formatting oracles. No failure. + `checkpoint-regression-02.log`, `checkpoint-clippy-01.log`, and + `tool-regression-03.log` record passing Rust checks and 22 Python tests. +- `evidence/m7/checkpoint-attachment-native-01`: a native section retained its + text, images, attachment and formatting through 2,052 scalar edits and repeated + snapshots. Fresh-cache reading passed 483 explicit character-format checks; + all native page XML matched the earlier reference except page modification + time, recorded separately in `retention.json`. +- `evidence/m7/checkpoint-toc-native-01`: the native two-page notebook reopened + after 1,026 TOC edits crossing two dependency checkpoints. The generator and + input/output hashes are retained in `evidence/m7/checkpoint-fixtures`. +- `checkpoint-toc-native-02` repeated the TOC check with native PDFs: two pages, + two tags and 3,562 explicit character-format comparisons passed. PDF geometry + verified the existing black-highlight case that native XML omits. +- `native-concurrency-05` established 633 clock-bounded native/Rust call overlaps + under background synchronization. Its original oracle incorrectly treated + transaction numbers as permanent across native renumbering. Replaying intent + content validated all 800 Rust commits and 6,370 reads through one counter + decrease. The run stopped before explicit native convergence; after cleanup, + one native paragraph lacked its final three cache-acknowledged edits. It is + not an acceptance pass. The content-history oracle now rejects branches, + missing acknowledgements, partial observations and reads inconsistent with + recorded real-time bounds; its regressions are in `test_native_stress.py`. +- `native-concurrency-06`: three native writers, four Rust writers and three + Rust readers passed the overlapping background-sync gate. All 600 native edits + and 800 Rust commits converged in every native client and the shared file; + 7,252 Rust reads matched the intent history, with 609 conservatively + clock-bounded native/Rust call overlaps. A separate cold-cache capture follows + in `native-concurrency-cold-06`. +- `random-edit-smb-01.json` and `random-edit-smb-01.one`: the CLI created a + separate edited file on Samba, with byte equality verified directly at the + server. Examples share the commit adapter's standard-fsync fallback when + macOS full-sync is unsupported. Rust commit/edit regressions and clippy passed + (`flush-regression-01.log`, `flush-clippy-01.log`). +- `native-concurrency-cold-06`: a separate fresh OneNote cache retained all + 1,400 intended edits from the successful mixed run. Native comparison passed + 54,330 explicit character-format checks, and exact paragraph text matched + the independently replayed operations. All associated machines were deleted. + +- `native-concurrency-07`: five native writers, eight Rust writers and five Rust + readers completed 1,000 native edits and 1,600 Rust commits, with 21,152 checked + reads and 296 clock-bounded native/Rust call overlaps. All six paragraphs + converged. `native-concurrency-cold-07` independently retained all 2,600 intended + edits and passed 95,034 explicit format comparisons. Every owned VM was deleted. +- `edit-text-checkpoint-fuzz-06.log`: 10,596 stateful executions in 901 seconds, + without failure. `edit-text-insertion-fuzz-07.log`: 4,639 executions in 301 + seconds including legacy and empty text properties, without failure. +- Random edits on the private corpus exposed unsupported legacy Unicode + promotion and absent initial text properties. The writer now adds Unicode + text while preserving the original legacy property, as MS-ONE 2.2.23 permits. + `text-insertion-boundaries-02.log` checks native fixtures, unrelated objects, + historical revisions, short writes and interrupted publication. +- A title edit previously left navigation caches stale. Text and cached titles + now publish in one revision and transaction; `title-atomicity-04.log` and + `title-regression-02.log` check rename/clear, history and interrupted short + writes. `private-random-native-01/title-verification.log` demonstrates that + the strengthened independent verifier rejects the earlier faulty copy. + CachedTitleStringFromPage's mandatory empty value applies to nonempty Unicode + titles; original legacy titles may retain it. The writer's modified-title + checks enforce that condition without rejecting untouched legacy content. +- `edit-text-title-fuzz-08.log`: 7,383 executions in 301 seconds, adding a native + title fixture and assertions relating title text, metadata and alternate title + after every persisted observation. No failure. The later single-title-object + admission guard was separately covered by `title-regression-02.log`. +- `title-empty-native-01`: a cleared title cold-opened successfully; two pages, + two tags and 3,394 explicit format checks passed, with four native-PDF highlight + checks. OneNote regenerated its empty page name from body text during opening; + this check establishes text/format retention, not stored automatic-title parity. +- `private-random-campaign-04`: five seeded edits on each of 26 current pages, + 130 total. An independent UTF-16 splice model checks all resolved styles, + unrelated nodes, metadata, contexts, historical revisions and payload hashes + after every edit. All ten frozen source files remained byte-identical. + `private-random-native-02/verification-02.log` records a fresh-cache pass on + all 26 pages, 109 tags and 186,325 explicit format comparisons, with five native + PDF highlight checks. The capture VM was deleted. +- `title-all-targets-01.log` records passing Rust all-target tests; + `title-clippy-01.log` has no warnings. `random-native-oracles-01.log` records + 30 passing Python tests, including content-chain replacement histories and + deliberate title-cache damage. +- `private-random-report-04`: the edited copy is rendered with all 45 stored + pages and 26 current native references. Browser inspection covered the edited + Video page; all 2,357 local links resolve (`link-check.json`). The original + source remains untouched. +- `native-random-08`: randomized replacements and bold/italic changes exposed + a test-driver error. On its second edit, Win7's framework left OneNote's + `🦀` entity undecoded, so the script treated entity spelling as text. + The independent intent oracle rejected that history. This run is not a pass; + all four machines were deleted. `tools/native/text.ps1` now decodes supplementary + numeric entities before the framework decoder, preserving escaped literals. + `native-text-test-01/failure-artifacts/text-result.json` records six passing + Windows decoder regressions. Its unrelated native-capture phase was correctly + stopped by the profile-isolation guard because this text-only author script + had not initialized a test profile; the VM was deleted. +- `automatic-title-native-01`: 18 application-authored automatic-title cases + captured trimming, empty paragraphs, formatting, entities and long text. + Input and stored metadata are retained with the native page names. Additional + Unicode-boundary and outline-order cases are being measured before extending + automatic-title updates. +- `automatic-title-native-02` captured ten more application-authored cases. + Automatic names select an outline by position (top before bottom, then left), + use the first text line, and trim whitespace. The 255-UTF-16-unit boundary + includes a complete supplementary character when it starts at unit 254, + yielding 256 units. Both fixture sets pass native comparison: 19/11 pages and + 11,680/5,304 explicit format checks. The first set also establishes OneNote's + XML omission of an otherwise empty outline containing only ASCII spaces; + the oracle permits that case while still rejecting omitted text, lists or tags. + These are measured compatibility rules, not a completed automatic-title writer. +- `title-checkpoint-atomicity-02.log` passes interrupted multi-object title + publication both on the native fixture and at a full dependency checkpoint, + using 17/257-byte short writes respectively. +- `native-random-09` replayed seed 912 after the native decoder fix: three + original OneNote writers, four Rust writers and three Rust readers completed + 450 native replacements with bold/italic changes and 600 Rust Unicode + replacements. All four paragraphs converged; 8,564 reads matched the + independently chained replacement intents, with 260 clock-bounded native/Rust + call overlaps. The final native formatting matched each actor's last recorded + intent. All three Windows VMs and the Linux server were deleted. +- `native-random-cold-09`: a separate fresh cache retained the exact final + text produced by all 1,050 replacement intents. Native comparison passed + 1,974 explicit format checks; an independent replay also checked 456 character + bold/italic values against the recorded native editing intent. The cold VM + was deleted. +- `random-noop-01` records seed 301 replacing ` café ` with itself and producing + identical output. The CLI now turns an identical replacement into an insertion. + `test_random_edit_campaign.py` verifies both new-file and in-place operation; + `tool-regression-06.log` records 31 passing Python tests and + `final-clippy-04.log` is clean. + +- `automatic-title-native-03`: twelve additional native cases distinguish + explicit titles (full length, leading whitespace removed, trailing whitespace + retained, first line) from automatic body summaries (trimmed and bounded). + Empty lines/paragraphs/outlines fall through to later text; table cells supply + automatic titles. All 13 captured pages pass 9,744 native format comparisons. +- The writer now publishes automatic navigation metadata when body text changes + and when an explicit title is cleared, choosing body outlines by position. + New sections use the same bounded automatic-title encoding. No public API was + added. `automatic-title-regression-03.log` passes edit/writer regressions; + `automatic-title-edit-tests-01.log` covers native line/UTF-16 boundaries and + multi-object interrupted publication. Historical objects and all non-title + metadata fields remain checked independently. +- `automatic-title-edits-01` applies 26 independently checked edits to the 13-page + native fixture. `automatic-title-edits-native-01` then passes fresh-cache text, + cached navigation title and 6,992 character-format comparisons. Its VM was + deleted. `title-empty-native-02` independently confirms the corrected cleared + title's navigation label, two pages, two tags and 3,394 format checks, with four + PDF black-highlight checks; its VM was deleted. +- `edit-text-automatic-title-fuzz-09.log`: 6,550 stateful executions in 301 seconds + after automatic-title changes, with no failure. `automatic-title-all-targets-01.log` + passes all Rust targets; `automatic-title-clippy-01.log` has no warnings. +- `private-random-campaign-05` passes another 130 edits against the whole-document + and payload-preservation oracle. All ten frozen source files remained unchanged. +- `private-random-native-03` cold-opens that edited copy: 26 pages, 109 tags, + 186,325 format checks, five PDF highlight checks, and cached navigation titles + pass. Its VM was deleted. `private-random-report-05` contains the edited pages + and fresh native references; all 2,357 local links in 46 HTML files resolve. +- `automatic-title-native-04/05` establish RTL outline ordering by descending + x anchor (width does not affect it), reversed RTL table-cell order, skipped + attachments, and whitespace trimming after UTF-16 truncation. The two public + fixtures in `corpus/m7/automatic-titles` retain native provenance. Ten direct + body-edit regressions cover the RTL/attachment selection rules. +- `automatic-title-edits-02/03` apply 21/18 independently checked edits to these + fixtures. Fresh native captures pass seven/six pages, cached navigation labels, + and 2,064/6,288 format checks. Both VMs were deleted. All Rust targets and + clippy pass in `automatic-title-all-targets-02.log` and + `automatic-title-clippy-03.log`. +- `native-random-10` repeats the ten-client replacement workload with seed 913: + 450 native edits, 600 Rust commits, 5,595 reads, and 466 clock-bounded native/Rust + call overlaps. All four paragraphs converge. `native-random-cold-10` passes + 1,740 format comparisons; intent replay independently checks all 1,050 edits + and 392 native bold/italic character values. All associated VMs were deleted. +- `tools/native_stress.py RUN CAPTURE/read` now replays saved editing intents + directly against fresh native XML, including exact paragraph multiplicity and + native formatting intent. `tool-regression-08.log` records 33 passing tests, + including rejection of missing/extra content, incorrect formatting, lost edits + and split surrogate pairs. +- `recovery-01` repeats all seven shared-notebook scenarios after the writer + changes: disjoint edits, reachable competing edits, server restart, transport + reconnect, lock contention, application restart and VM restart. Both Windows + clients and the Linux server were deleted. `recovery-cold-01` opens the final + saved notebook in a new cache and passes text, navigation and 641 character + format checks; its VM was deleted. +- The conflict oracle follows current page-manifest references only. + `conflict-oracle-regressions-01.log` checks the native offline-edit fixture and + rejects treating unreferenced history or detached object spaces as recovery. + `tool-regression-09.log` records 34 passing Python tests. +- `edit-text-rtl-fuzz-10.log` adds the native RTL title and non-title body + candidates to the stateful interrupted-edit workload: 4,531 executions in + 301 seconds, no failure. +- `mixed-conflict-01` FAILS acceptance. Three native clients edited the same + paragraph offline while three Rust writers committed 15 appends and two Rust + readers observed them. After reconnection, all three native alternatives were + reachable, but the final Rust text was absent from the current page and its + conflict pages. The pre-reconnect notebook and every convergence snapshot are + retained. All three Windows VMs and the Linux server were deleted. Rust edits + changed the text object's modification time while ancestor paragraph/outline/ + page times stayed unchanged; native edits changed those ancestors too. That + difference is a hypothesis for investigation, not an established cause. +- `mixed-conflict-02` reduces the workload to one native client, two Rust writers, + one reader and two Rust commits. Both competing results remain reachable; this + reduction does not reproduce the failure. Its Windows and Linux VMs were deleted. +- `mixed-conflict-cold-01` independently opens the failed final notebook in a + fresh cache. The native conflict UI shows only the three native alternatives; + clipboard captures recover the exact Unicode text of both conflict pages. + The Rust result is also absent from all exported stored revision objects in + the last convergence snapshot (`mixed-conflict-01/lost-edit.json`). Native + comparison passes 200 format checks on the surviving main page; that reader + agreement does not validate retention of the missing edits. The VM was deleted. +- `mixed-conflict-03` tests ancestor modification timestamps with the original + three-native/three-Rust-writer workload, using the separate + `evidence/m7/ancestor-timestamp-probe.py`. The first reconnect capture referenced + three conflict spaces without default revisions, so the strict reader stopped + the run. After client teardown, two references remained unresolved. All VMs + were deleted. `mixed-conflict-cold-03` nevertheless opens the saved file in a + fresh OneNote cache with the full Rust text; its VM was deleted. This is an + inconclusive experiment, not acceptance of a timestamp fix. +- The native checkpoint observer now preserves each distinct incomplete snapshot + and retries missing document contexts for at most two minutes. Other parse + errors still fail immediately, and retention still requires every competing + result to be reachable. This allows the next experiment to distinguish an + intermediate cross-space save from a persistent missing conflict. +- `mixed-conflict-04` repeats the timestamp experiment with that observer. One + incomplete snapshot resolves, then all three native alternatives and the full + 15-commit Rust result are reachable. All Windows and Linux VMs were deleted. +- Text edits now publish existing ancestor modification timestamps in the same + transaction as text, run boundaries and navigation caches. Preservation tests + independently follow raw object references and compare every unrelated field; + interrupted title/checkpoint publication also checks all modification times. + `ancestor-edit-regressions-04.log`, `ancestor-all-targets-01.log`, + `ancestor-clippy-01.log` and `ancestor-tool-regressions-01.log` pass. + Native acceptance of the atomic implementation is recorded below, separately + from the timestamp experiment. +- `mixed-conflict-05` stopped before any Rust commit: disconnecting native NICs + stranded an existing SMB handle and correctly excluded Rust. The setup now + holds the file's exclusive lock while disconnecting clients. Rust readers + back off during contention. All owned VMs were deleted; the final stopped + clone's removal is recorded in `cleanup-confirmed.json`. +- `private-random-campaign-06` applies 130 edits with seed 918 and verifies all + ten frozen source files unchanged. Fresh native capture + `private-random-native-04/verification-02.log` passes 26 pages, 109 tags, + 188,956 character-format comparisons and five black-highlight paragraphs. + Its PDF maps a rendered combining-accent glyph to a space. The PDF oracle + checks the uniquely located paragraph and the unhighlighted glyph's inline + region; missing ordinary text, ambiguous matches and black rectangles in that + region fail. `tool-regression-14.log` passes all 35 Python tests. + `private-random-report-06` associates all 26 current pages with the fresh + native references; all 2,357 local links resolve. Its VM was deleted. +- `edit-text-ancestor-fuzz-11.log` exercises stateful edits and interrupted + publication after ancestor timestamp propagation: 4,236 runs in 301 seconds, + no failure. +- `mixed-conflict-06` passes with the atomic implementation: three native + alternatives and the full 15-commit Rust result remain reachable after all + three native clients close. A transient incomplete save resolves before + acceptance. All Windows and Linux VMs were deleted. `mixed-conflict-cold-06` + opens the closed result in a fresh cache; native conflict UI clipboard + captures independently match all four intended results exactly. That VM was + deleted too. The ordinary page comparison passes separately; its zero + explicit format checks do not substitute for the four intent comparisons. +- The native clone cleanup now handles the VM helper's `SystemExit` on shutdown + timeout, terminates the owned VM and deletes its overlay. The regression + checks deletion and the teardown record; `tool-regression-17.log` passes all + 36 Python tests, and the private native comparison still passes. +- `native-random-11` never reached notebook editing: YAML parsed its all-digit + WAN MAC address as a sexagesimal integer, so cloud-init could not configure + the interface. The failed boot log is preserved and its VM was deleted. + Quoting both MAC addresses fixes the seed. `linux-lab-regression-01.log` + passes the two lifecycle tests; `native-random-12` reuses the same VM name + and deterministic MAC after deletion and reaches ready Windows clients. +- `native-random-12` passes seed 918 with the ancestor fix: three native + writers, four Rust writers and three Rust readers; 450 native edits, 600 + Rust commits, 2,471 checked reads and 428 clock-bounded overlapping native/Rust + calls. All four intended paragraphs converge and native formatting matches + the recorded operations. All task-owned Windows and Linux VMs were deleted. +- `native-random-cold-12` independently reopens that result and compares every + recorded native/Rust edit with the native XML. Its VM was deleted. +- `same-second-build` is an isolated controlled-clock build with one recorded + source substitution: a text edit uses its baseline element timestamp. + `same-second-equivalence/result.json` confirms that its resolved revision + exactly matches a production-library edit completed in the same actual + second. The production clock and library are unchanged. `mixed-conflict-07` + uses that build to test baseline-equal timestamps with three native writers, + three Rust writers and two Rust readers. +- `mixed-conflict-07` passes: the four page-content element timestamps remain + exactly equal to the cached baseline across all 15 Rust commits, and all + four competing results survive reconnect and application closure. The three + Windows VMs and Linux server were deleted. This distinguishes valid equal + timestamps from the inconsistent descendant/ancestor times in the original + failing writer; it does not require inventing future timestamps. +- `mixed-conflict-cold-07` independently opens the same-second result and + captures exact Unicode clipboard text from the main page and all three + native conflict pages. All four results match the recorded intent, and the + VM was deleted. Conflict retention now counts duplicate text instead of + collapsing it into a set: `exact-retention.json` rechecks both successful + closed notebooks against the exact four-result multiset. +- `native-random-13` passes seed 919 with twelve clients: four native writers, + five Rust writers and three Rust readers; 600 native edits, 750 Rust commits, + 1,903 checked reads and 456 clock-bounded overlapping native/Rust calls. + All five intended paragraphs converge. The harness now captures + `stress-closed` after every native client closes; fresh-cache acceptance uses + this snapshot instead of the earlier live checkpoint. +- `native-random-cold-13` opens that closed snapshot in a fresh native cache: + all 1,350 recorded edits match exactly across five paragraphs, with 1,672 + explicit character-format comparisons and 390 checks against the native + writers' formatting intents. Its VM and all campaign VMs were deleted. +- Final cleanup records are `final-teardown-check.json` and + `final-source-check.json`: 21 owned Windows clone identities and five Linux + VM identities are absent, and all ten frozen private source files retain + their hashes. `tool-regression-19.log` passes 36 Python tests. The HTML review + is `private-random-report-06/index.html`; its 26 current pages link to the + verified native references. Physical power-loss and unsynchronized native + cache durability remain outside these guarantees. diff --git a/MILESTONE8.md b/MILESTONE8.md new file mode 100644 index 0000000000000000000000000000000000000000..846b90a819d3b37ea0ba37d5f3c440304d3b5f26 --- /dev/null +++ b/MILESTONE8.md @@ -0,0 +1,84 @@ +# Workspace, crash recovery and diagnostic editing + +Goal resumed after the user accepted the workspace split and public API audit. +API boundary changes remain authorized when justified by implementation needs. + +## Acceptance gates + +1. **Workspace:** move the existing library, tests and examples into + `crates/onestore`, preserve the root corpus and example executable paths, + and pass Rust, Python and fuzz build checks. A sibling crate can consume + the library without reaching into its source directory. +2. **Public API audit:** review exported types, ownership, validation, edit + contracts and consumer ergonomics; verify a separate crate can read and edit + through public APIs; present [API-AUDIT.md](API-AUDIT.md) before continuing. +3. **Storage interruption:** verify durable images after every write/flush + boundary, including dropped unflushed writes, partial persistence, counter + rollover and revision checkpoints. Reopen the persisted image, continue + editing it, retain reproducible failures, and independently validate a + representative image matrix with OneNote. +4. **Abrupt VM stops:** stop disposable Windows clients and the Samba server + without guest shutdown during normal concurrent editing. Preserve disks, + restart the same machines, compare acknowledged operations and reachable + conflicts, and cold-open the recovered server notebook in fresh OneNote. + Track native cache acceptance separately from server durability. +5. **Diagnostic editor:** extend the HTML reading report with supported text + edits on a task-owned notebook copy. Edits use the Rust library, reject stale + snapshots, preserve unrelated content and expose ambiguous commit outcomes + without automatic replay. Verify browser interaction, two-reader stale-edit + handling, Unicode and native round trips. This is a diagnostic interface; + canvas rendering and product UI remain separate work. +6. **Closure:** rerun affected checks, review the implementation for unnecessary + state and abstractions, verify source hashes, retain evidence and replay + commands, delete owned VMs, and provide the running diagnostic tool. + +Abrupt VM stops discard guest memory while the host remains powered. Simulated +storage loss exercises the library's ordered-flush contract; neither establishes +the physical drive's behavior during actual host power loss. + +## Evidence + +Evidence belongs under `evidence/m8/`. Original notebooks are never edited. + +### Workspace and API review checkpoint + +The workspace gate passed: 56 Rust integration tests (one intentional local +fuzz-seed generator ignored), 36 Python tests, all example builds, all eight fuzz +target builds, Clippy, formatting, rustdoc and its compiled example. The external +API consumer also passes. Logs are listed in [API-AUDIT.md](API-AUDIT.md). + +The user accepted the public API audit and authorized continuation. The checkpoint +changed source locations and documented existing contracts, preserving signatures +and runtime behavior. No VMs were started for that checkpoint. + +### Storage interruption campaign + +`power-loss-02` passed 2,508 persisted-image checks and subsequent edits across +native Unicode text, 255→256 and 65535→65536 counter rollover, an attachment page, +and a pending 512-revision checkpoint. Each write/flush boundary is exercised with +six persistence policies, including complete loss of unflushed writes and partial, +reordered persistence. Comparisons cover every resolved current object, including +raw properties and payloads. Acknowledged publication must select the complete +new state; earlier cuts may select only the complete old or new state. + +`power-loss-03` repeats the same checks with exact source and failure-image +retention added to the harness. `edit-text-fuzz-01.log` records 4,327 stateful +inputs over 302 seconds without failure. The 22 retained boundary images from +`power-loss-02` are undergoing fresh OneNote captures in `power-native-01`. + +Replay: + +```sh +cargo run --release -p onestore --example power_loss -- /new/matrix-directory +python3 tools/power_loss_native.py /new/matrix-directory /new/native-directory +cargo +nightly fuzz run edit_text -- -max_total_time=300 -timeout=60 -max_len=128 +``` + +The TOC extension (`power-toc-01`) passes another 918 persisted images and +subsequent color edits, including counter rollover and a pending checkpoint. +`power-loss-04` passes the combined 3,426-image matrix with exact source/failure +retention after the harness refactor. The native gate uses the 22 retained images +from `power-loss-02` and 13 from `power-toc-01`; captures verify those exact source +hashes. All 22 section captures in `power-native-01` passed. The TOC captures in +`power-toc-native-01` also compare OneNote's notebook color to the persisted value +and are still running at this checkpoint. diff --git a/PROGRESS.md b/PROGRESS.md new file mode 100644 index 0000000000000000000000000000000000000000..066a5d4df0cec5e6db10f8fb44734f8d2815eb72 --- /dev/null +++ b/PROGRESS.md @@ -0,0 +1,227 @@ +# OneNote interoperability + +Target: an embeddable Rust library that reads and writes revision stores, +preserves unedited content, and collaborates with OneNote 2010 over SMB. + +| Stage | Acceptance evidence | State | +| --- | --- | --- | +| 1. Corpus | Native single-operation fixtures, private corpus integrity, independent cold reopen, semantic assertions, reproducible provenance | Passed current corpus gate | +| 2. Storage | Committed revision/object resolution, opaque preservation, malformed-input tests and fuzzing against native fixtures | Passed current corpus gate | +| 3. Writer | Create and edit through the native open/edit/save/read loop without collateral changes | Passed current corpus gate | +| 4. Durability | Injected write/flush failures, interrupted commits, acknowledged persistence, native recovery | Passed implemented scalar-commit gate | +| 5. Collaboration | Observed locks and I/O, deliberate contention, competing edits and reconnect convergence | Passed tested scalar collaboration gate | + +The personal source is `/Volumes/clover/Documents/OneNote`. It is read only. +`corpus/private/original` holds the copied baseline; `source-manifest.json` records +SHA-256 hashes and source modification times. Native automation must operate on +disposable copies, with the personal Windows registry and cache parked first. + +Wayback already contained `C:\one-tests\profile-original.reg` and +`C:\one-tests\profile-original-cache` at task start. Native tests used an isolated +profile with UnfiledNotesSection at `C:\one-tests\Loose.one`. After the stage-5 +captures, Restore returned the original registry and cache to their active paths; +Status confirmed restoration, with test backups parked and OneNote closed. +The primary native run is `corpus/native/20260905-05`, generated by OneNote +14.0.7015.1000. Its nine snapshots were independently opened from fresh caches +under `cold-05-*`. Text, styles, outline position, table cells, image bytes, and +attachment bytes pass `python3 tools/verify-corpus.py`. Transactions in the +synthetic section grow from 4 to 28 across the captured operations. + +`corpus/native-ink` records two native mouse-drawn strokes and their cold-open +binary XML payloads. `evidence/stage1/native-ink.png` shows the page. +`corpus/native-delete` records a page before deletion and its cold-open recovery +from the notebook recycle bin. The AHK ink recipe requires the displayed +1280x720 maximized OneNote layout; semantic XML verifies that strokes survived. + +The private corpus has 26 pages including two recycle-bin pages. A fresh read +can return partial page content while loading; the reader now checks the final +hierarchy against all captured page IDs. `corpus/private/exact-native` passed an +independent cold read with 26 expected pages. It includes images, ink, tags, +lists, OCR, and media. All ten original source hashes and modification times +were rechecked unchanged after native testing. COM IDs change across cache +resets and must not serve as the file-identity oracle. + +`corpus/native-encrypted` records native password protection and a fresh-cache +unlock with password `fictitious-only`. The cold XML and attachment bytes pass +the corpus verifier. OneNote's UI introduced one leading empty paragraph; +that paragraph is retained in the fixture oracle. `read.ps1 -UseCurrentCache` +captures the manually unlocked test session; the caller closes its UI afterward. + +The corpus is a starting interoperability gate, not a complete feature matrix. +Shared-file conflicts now have native evidence in the stage-5 corpus; ordinary +user-visible page version history is outside this corpus gate. + +The Rust reader follows committed transactions, resolves revision dependencies, +global IDs, roles, contexts, roots, reference-count overrides, and file payloads. +Checks cover object and object-space cycles, missing targets, immutable data, +MD5 hashes, override CRCs, and reference counts. All revisions in the ten private +files pass the current unencrypted checks. The encrypted fixture retains opaque +ciphertext and explicitly refuses property traversal. + +Native compatibility findings: +- Transaction CRCs accumulate across prior sentinel entries and fragment links + are excluded. Native transaction fragments can leave four bytes after the link. +- Reference counts include repeated references from the same source object. +- Table-of-contents override CRCs include preceding object declaration counts, + although that format does not use object groups. +- Encryption-key containers can have zero padding after the footer when their + compressed chunk references round the size to eight bytes. + +Coverage-guided runs recorded under `evidence/stage2` completed 5,529,107 storage +inputs, 6,537,029 property inputs, and 2,998,472 revision inputs without crashes. +These are bounded initial runs, not durability or interoperability proofs. +An independent 100,000-level property nesting test checks parse and drop safety. +The extended revision run completed 20,718,981 inputs in 601 seconds with a +262,144-byte input limit and no crashes. `tools/verify-reader.py` independently +matches 26 private pages and 581 nonempty text objects by page, three hyperlink +targets, 18 image payloads byte for byte, and three native GIF-to-PNG conversions +pixel for pixel. It requires Pillow. Whitespace-only paragraphs and boilerplate +date/time text remain in the raw graph but are outside this text comparison. +One page-like object space has undocumented metadata JCID 0x0002003E; it remains +in the raw graph and is excluded from the ordinary-page inventory. + +Specs in `resources/md` are the implementation references. File-format conformance, +actual OneNote acceptance, and SMB durability are separate checks. + +The first stage-3 encoding of `replace_property_bytes` appended new chunks, +replaced the affected list path with fresh list identities, copied committed +transaction entries, and published new header references. Every original byte +outside the header remained unchanged. The stage-4 append protocol below +superseded that encoding; the stage-3 fixtures retain its native acceptance. + +`corpus/writer` records the first native cycle: Rust replaces the plain-text +fixture with `Portable plain text...`; OneNote reads that text from a fresh cache; +OneNote changes it back to `Fictitious plain text.` and saves; Rust reads and edits +that file again; a second fresh native read returns `Portable plain text...`. +The native test uses equal-length text. Storage tests also replace the scalar +with lengths 0 through 40 and re-resolve every prior revision unchanged. + +Stage 3 now includes template-free `create_section` and `create_table_of_contents`. +The first creates one page with one plain-text paragraph and an explicit author; +the second records ordered section filenames and their file identities. Native +fresh-cache reads verify Unicode including a surrogate pair, both newly created +notebook files, native editing/saving of the created section, and a subsequent +longer Rust text replacement. `replace_property_bytes` also edits `.onetoc2` +scalars; OneNote independently confirms the requested notebook color. +`tools/verify-writer.py` verifies the captured native semantics and artifact hashes. + +The writer preserves unknown data and every prior revision. Native XML comparison +of the ink fixture retains formatting, positions, tables, image data, two ink +strokes, and attachment bytes; the changed outline height is allowed to reflow. +Creation initially exposed two malformed sequences: an object group needs its +following dependency-override node, and a root-space selector must follow that +space's declaration. The reader now rejects both. An isolated byte-order probe +changed a rejected empty section into a native-readable one. Failed creation +experiments live under evidence rather than the accepted writer corpus. + +The native capture script now filters exact `.one` extensions: Windows wildcard +matching had also matched `.onetoc2` and created an extra empty section. Old +captures retain that provenance; newer reads verify one section and one page. +Writer fuzzing completed 2,386,509 scalar inputs and 2,900,483 template-free +section inputs without crashes. A subsequent combined section/TOC run covers +variable section counts and reference graphs (statistics in evidence/stage3). +The corpus gates describe these tested operations, not every MS-ONE feature. + +Stage 4 begins with a concrete failure: directly copying the standalone writer's +header over a live file leaves 82 of 1025 prefix-tear states invalid on the small +native text fixture. `examples/header_faults.rs` reproduces this. Standalone +serialization must not be mistaken for an in-place commit protocol. + +The stage-4 writer now extends the existing revision-manifest list and transaction +log instead of replacing their header pointers. Original committed nodes, property +blobs, and prior revisions remain unchanged; unused fragment tails and log capacity +are populated. Restoring the previous header resolves the previous graph. This +encoding now passes independent native reads; the earlier stage-3 evidence used +the standalone encoding. + +`commit_property_bytes` accepts a storage implementation through `CommitIo`. +Its caller must supply OneNote-compatible exclusion and durable ordered flushes. +A locked snapshot comparison precedes writes. Data and metadata flush before a +one-byte publication write. At counter-byte rollover the log includes empty +transactions up to the largest intermediate count; a flush of the highest changed +counter byte precedes cleanup of lower bytes. An interrupted cleanup still resolves +the new revision. Failures distinguish NotCommitted, Unknown, and Committed. +The in-memory crash model exercises short reads/writes, every I/O failure point, +and arbitrary subsets of unflushed byte changes for ordinary commits and 255→256. +It passes, including log-fragment rollover; this is not yet a native crash test. +Updated append scalar fuzzing completed 465,817 inputs in 181 seconds, no crashes. +The combined section/TOC creation fuzz run completed 350,293 inputs in 181 seconds. + +The Windows laptop became reachable again with no Procmon or OneNote process; +the user confirmed its battery had run out. The personal profile and cache +remained isolated. Procmon 4.1 produced no trace, and +the native agent is not elevated. Shared testing continued without that driver. +`corpus/append/round-01` records independent cold native reads of plain and complex +appended edits, TOC color, counter 255→256 and 65535→65536, their interrupted +cleanup states, and all eight combinations of the tested numeric metadata tears. +OneNote reads the expected old/new text, preserves the complex fixture's full XML +and attachment bytes, and can edit/save after an interrupted counter cleanup. +The manifest records artifact hashes; `tools/verify-writer.py` checks the captures. + +The crash model now includes read failures and has a shared implementation used by +`fuzz/fuzz_targets/commit.rs`. Stateful fuzzing completed 21,506 inputs in 302 +seconds with no crash, retrying from partially persisted files at ordinary and +255→256 commits. Full Rust tests, clippy, original corpus integrity, the private +reader oracle, and native writer comparisons pass. + +`commit_file_property` acquires a whole-file filesystem lock and serializes calls +inside the process because macOS SMB flock is reentrant within a process. POSIX +byte-range locking returned ENOTSUP on this mount. Flock produced a server-visible +exclusive 0+UINT64_MAX lock, blocked a Windows read, and rejected a second Mac +process's lock. Rust sync_all uses F_FULLFSYNC on macOS; when that extension is +unsupported, the adapter uses standard fsync. Apple's SMB source routes it through +the ordinary SMB flush path. A real committed edit through the mount passed a +subsequent independent cold OneNote read. This depends on the filesystem/server +honoring flush and exclusion; it does not claim physical server power-loss testing. +Native shared activity exposed read locks at 0xFFFFFFFB and write locks at +0xFFFFFFFD in `evidence/stage4/shared-native-locks-02.log`. + +Stage 5 acceptance is captured in `corpus/collaboration/round-01`, with artifact +hashes and `tools/verify-collaboration.py`. Each final notebook was independently +reopened from a fresh native cache on OneNote 2010 14.0.7015.1000. + +| Scenario | Observed result | +| --- | --- | +| Whole-file lock contention | The native edit/sync calls completed while the file remained byte-identical under the lock; the saved edit appeared after release and survived cold reopen | +| Different paragraphs | The main page contained both Rust's Unicode edit and the native outline edit | +| Same paragraph | Rust text remained on the main page; native competing text survived in a conflict object space | +| Native offline edit | With A: disconnected, the server retained the old text; another SMB session committed Rust text; native reconnect preserved both versions | +| Lost preparation FLUSH reply | `NotCommitted`; native cold read retained the old paragraph | +| Lost publication FLUSH reply | `Unknown`; native cold read recovered the new paragraph | +| Lost counter-cleanup FLUSH reply | `Committed`; native cold read recovered the new paragraph after 255→511→256 publication | + +The dedicated loopback SMB session recorded server-visible whole-file locks, +actual write ranges/counter values, and successful FLUSH replies withheld before +client delivery. The trace verifies a successful flush of counter 511 before +cleanup to 256. macOS revoked the disconnected file handles; the adapter returned +errors rather than treating reconnection as acknowledgement. The proxy was stopped +and its temporary mount directory removed after capture. A: was restored to its +existing `\\zenith.miku-sun.ts.net\agent` mapping; the unrelated Z: mapping and +personal macOS mounts were left in place. + +OneNote's COM hierarchy omits conflict pages. The reader resolves their metadata +JCID 0x20038 and retained text; the offline fixture additionally includes a native +UI screenshot showing the conflicting edit. The full-page COM update harness +produced a redundant conflict copy even for different paragraphs. Its first merge +also changed one table column from 39.14614105224609 to 38.61000061035156 points +and one ink z-order from 7 to 6. The verifier binds those exact changes and checks +retained image/ink payloads, table contents/styles, attachment bytes, quick styles, +and outline positions; it does not claim pixel-identical native layout. + +An unlocked snapshot caught during native saving referenced an object space that +had not yet been written. It is retained as `corpus/malformed/native-inflight.one`. +`read_file` now shares the commit exclusion, and writer preflight validates the +whole current graph. A regression verifies that even a no-op request against this +intermediate graph fails before any storage I/O. Diagnostic inventory and edit +selection also validate the graph before traversing it. + +Final coverage-guided revision fuzzing, seeded with native collaboration and +transport-recovery files, completed 1,453,528 inputs in 122 seconds without a crash +(608 MB peak RSS). The final stateful commit run completed 4,992 inputs in 91 +seconds without a crash (483 MB peak RSS), following the earlier 21,506-input run. +All Rust targets, clippy, the corpus/private reader oracles, writer comparisons, +and collaboration verification pass. The ten personal source files still match +their original hashes, sizes, and modification times. This completes the bounded +stage-5 scalar collaboration gate on the tested Windows/macOS/Samba combination; +physical power-loss durability and other client/server implementations are not +established by these protocol-failure captures. diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4294d7dd15e5f71360213b6c8ebfda9663019efb --- /dev/null +++ b/README.md @@ -0,0 +1,208 @@ +# onestore + +An experimental native Rust library for OneNote revision stores (`.one` and +`.onetoc2`). It reads committed object graphs, creates a small notebook without +a template, appends scalar-property and text edits with a recoverable commit protocol, +and interprets MS-ONE document structure, formatting, media, and historical pages. +The storage gates are recorded in [PROGRESS.md](PROGRESS.md); document-model +verification is recorded in [M6-ACCEPTANCE.md](M6-ACCEPTANCE.md). Concurrent-editing +verification is recorded in [MILESTONE7.md](MILESTONE7.md). + +Text edits publish ancestor modification timestamps with the changed content. +Omitting those timestamps caused acknowledged edits to disappear during native +conflict merging. The repaired eight-client replay retains all four competing +results after reconnection, application closure and fresh-cache native inspection; +see `mixed-conflict-06` in the milestone evidence. Use disposable copies for +notebook editing. + +## Workspace + +`crates/onestore` contains the library, examples and integration tests. New Rust +prototypes belong in sibling directories under `crates/` and depend on +`onestore = { path = "../onestore" }`. The root manifest discovers these crates. +The consumer boundary and API tradeoffs are recorded in [API-AUDIT.md](API-AUDIT.md). +Shared native fixtures, specifications, evidence and Python/VM tools stay at the +repository root; `fuzz/` remains an independent cargo-fuzz workspace. + +Run Cargo commands from the root. Select `-p onestore` when working only on the +library, or `--workspace` for checks across all crates. Example binary paths +remain `target/debug/examples/…` for the native verification tools. + +## Supported surface + +| API | Contract | +| --- | --- | +| `Store`, `RevisionIndex`, `ResolvedRevision` | Parse storage, resolve revisions and reference graphs, expose roots and objects | +| `PropertySets`, `Object::references` | Decode properties and ID streams while retaining raw values | +| `Object::file_reference`, `Store::file_data` | Identify internal/external payloads and read internal payload bytes | +| `document::Document`, `Revision::text_runs` | Interpret document objects and inherited text formatting while retaining unknown properties and revision identities | +| `create_section` | Create one page containing one plain-text paragraph and an author, including Unicode | +| `create_table_of_contents` | Create ordered section entries from filenames and file identities | +| `replace_property_bytes` | Append one scalar-property revision; preserve prior revisions and unrelated property values and references | +| `replace_text`, `commit_text`, `commit_file_text` | Replace a UTF-16 range within one ordinary text run; publish text, run boundaries and modification time together | +| `read_file` | Read a snapshot under whole-file exclusion | +| `commit_file_property` | Lock, compare the source snapshot, append and flush, then publish the revision | +| `CommitIo`, `commit_property_bytes` | Supply another storage backend with equivalent exclusion and ordered durability | + +Scalar edits accept encoded values and require the caller to maintain MS-ONE +semantics. Text edits maintain run boundaries, inherit the insertion run's formatting, +and promote legacy text to Unicode when needed. Explicit and body-derived +navigation titles update in the same transaction; unsupported fields, +protected objects and split surrogate pairs are +rejected before writing. Appended snapshots cap revision dependency depth at 512 +while retaining historical revisions. TOC snapshots can remap encoded CompactIDs +without changing their resolved references. Password-protected +sections retain their encrypted structure and payloads; the library does not +derive password keys or decrypt their pages. +External `.onebin` references identify payloads for the caller to obtain. Cloud +FSSHTTP synchronization and a C ABI are outside the implemented surface. + +## Try it + +Requires Rust 1.97 or later for the verified build. Examples create new destinations +and refuse to overwrite them. The Python report requires Pillow. + +```sh +cargo run --example create_notebook -- /tmp/one-demo 'Hello from Rust.' 'Example Author' +cargo run --example inventory -- /tmp/one-demo/synthetic.one +cargo run --example inspect -- /tmp/one-demo/synthetic.one +cargo run --example document -- /tmp/one-demo/synthetic.one /tmp/one-model +python3 tools/notebook_report.py /tmp/one-demo /tmp/one-report --timezone America/Los_Angeles +``` + +A seeded text edit on a disposable copy records its page, UTF-16 range, +replacement and outcome as JSON: + +```sh +cargo run --example random_edit -- /tmp/one-demo/synthetic.one /tmp/edited.one 42 +``` + +The report contains readable pages, document JSON, assets, source identities and +coordinates. It preserves paragraph nesting, lists, tables, links and tags. +Historical contexts, recycle-bin pages and default templates are represented +separately. Native ink and structured equations retain their source data and +appear explicitly as opaque content. The report is a reading view; its native +PDF references supply the original canvas layout. + +Read and validate a snapshot before interpreting its graph: + +```rust,no_run +use onestore::{read_file, RevisionIndex, Store}; + +fn main() -> Result<(), Box> { + let bytes = read_file("notebook/synthetic.one")?; + let store = Store::parse(&bytes)?; + if !store.checksum_mismatches.is_empty() { + return Err("Transaction checksum damage".into()); + } + let index = RevisionIndex::parse(&store)?; + index.validate_current()?; + Ok(()) +} +``` + +`Store::parse` exposes checksum mismatches for diagnostic readers; the writer +rejects them. The resolved graph borrows the snapshot. Select the object-space ID, +object ID, and property from that graph, then pass those IDs, the same snapshot, +and the replacement's encoded bytes to `commit_file_property`. The +`edit_property` example demonstrates selection by JCID/property/expected bytes, +with optional explicit IDs when conflict copies contain identical text. + +## Commit behavior + +```text +exclusive lock → exact snapshot comparison + → append data → flush + → prepare header metadata → flush + → publish transaction counter → flush + → finish counter rollover → flush → unlock +``` + +Stale snapshots fail before writing. Live readers must use equivalent exclusion. +Native conflict creation can still expose cross-space references before their +targets are saved; such snapshots must be rejected and reread while synchronization +proceeds. `read_file` and `commit_file_property` serialize within the process because +macOS SMB locks can be reentrant. The lock is nonblocking across processes; +contention requires a fresh read and a later retry. + +| Error state | Meaning and caller action | +| --- | --- | +| `NotCommitted` | This edit was not published. Preparation bytes may exist. Reread before retrying. | +| `Unknown` | Publication may have persisted despite the error. Reread and resolve the intended edit before retrying. | +| `Committed` | Publication was durably acknowledged; counter cleanup or lock release failed. Reopen the committed result instead of replaying the edit. | + +At counter rollover, empty transactions make intermediate published counts valid. +The highest changed byte is flushed before lower bytes are cleaned up. The +255→256 and 65535→65536 boundaries and interrupted cleanup states have independent +native acceptance captures. A no-op still flushes; a failed flush has an unknown +durability outcome. + +The filesystem adapter uses whole-file locking. On macOS it acquires the lock +as part of opening the file (`O_EXLOCK | O_NONBLOCK`): separate open and `flock` +calls allowed overlapping exclusive holders and stranded server locks under +multi-process SMB contention. `tools/smb_lock_race.py` reproduces that failure +without notebook parsing or writing. On the tested macOS SMB mount, +POSIX byte-range locks returned `ENOTSUP`; whole-file locks excluded native +OneNote's lock ranges. `sync_all` falls back to `fsync` on macOS only when +`F_FULLFSYNC` is unsupported. Successful SMB FLUSH replies were observed on the +wire. Correctness requires the backend to honor exclusion and ordered flushes. +The evidence covers transport failures, not physical server power loss or every +filesystem's lock implementation. + +## Verification + +```sh +cargo test --all-targets +cargo clippy --all-targets -- -D warnings +python3 tools/verify-corpus.py +python3 tools/verify-reader.py # requires Pillow and the local private corpus +python3 tools/verify-writer.py +python3 tools/verify-collaboration.py +python3 tools/verify-document.py /path/to/copied/notebook /path/to/native/read +``` + +The frozen private corpus is excluded from version control. Its verifier checks 26 pages, +581 text objects, hyperlink targets, exact image bytes, and native image conversions. +Synthetic corpus manifests bind binary fixtures to independent native XML and +attachment captures. `verify-corpus.py` also requires that private corpus. + +Storage tests exercise malformed references, deep properties, historical revision +preservation, short I/O, stale snapshots, counter tears, and every injected I/O +failure point at ordinary and rollover commits. The crash model persists arbitrary +subsets of unflushed bytes and is shared with the stateful commit fuzzer. + +```sh +cargo +nightly fuzz run revisions -- -max_total_time=120 -max_len=262144 -rss_limit_mb=2048 +cargo +nightly fuzz run commit -- -max_total_time=300 -max_len=4096 -rss_limit_mb=2048 +``` + +Fuzz targets cover storage, properties, revisions, scalar edits, creation, and +multi-edit interrupted commits. Seed the revision target with native `.one` files +using symlinks under `fuzz/corpus/revisions`; empty seed directories mostly exercise +header rejection. Bounded run counts and native findings live in `PROGRESS.md`. + +The document fuzzer mutates native property streams, repairs their checksums, and +traverses every retained revision and resolved text run. Its public seeds live in +the source target; private seeds are supplied only at runtime. Native edit-history +tests compare independently generated operations, OneNote XML and the Rust model; +failed histories can be replayed and shrunk in fresh disposable clones. The +document feature matrix is in [FEATURES.md](FEATURES.md), and the milestone's +acceptance contract is in [MILESTONE6.md](MILESTONE6.md). + +The stage-5 gate uses OneNote 2010 build 14.0.7015.1000 on Windows 7, a macOS SMB +mount, and Samba on zenith. [The collaboration corpus](corpus/collaboration/round-01) +captures native lock contention, different-paragraph merging, same-paragraph +conflicts, offline editing/reconnection, and lost successful FLUSH replies at +preparation, publication, and counter cleanup. Each final notebook was reopened +from a fresh native cache. Competing text survives as native conflict pages; +OneNote's COM hierarchy omits those pages, so the offline case also includes a +native UI capture. Full-page COM updates produced an extra conflict copy during +the disjoint case and two recorded geometry changes; the verifier checks those +exact changes as well as retained image, ink, table, and attachment content. + +`tools/native/profile.ps1` parks/restores the personal native profile and cache; +`cold.ps1`, `read.ps1`, and `collaborate.ps1` operate on disposable test roots. +`tools/zenith-locks` observes server locks. `tools/smb-proxy.py` traces and interrupts +a dedicated loopback test session; its control JSON selects the successful response +and occurrence to withhold. The captured trace and result files are the regression +oracle; replaying the native experiments requires the supplied Windows/share setup. diff --git a/corpus/append/round-01/complex/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/complex/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..a33d3bfd210f844e3db618e648ac898adeee09c6 Binary files /dev/null and b/corpus/append/round-01/complex/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/append/round-01/complex/notebook/synthetic.one b/corpus/append/round-01/complex/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..cd86f5bc4818f4d22b2df4c7aecbe40f6e1edb6b Binary files /dev/null and b/corpus/append/round-01/complex/notebook/synthetic.one differ diff --git a/corpus/append/round-01/manifest.json b/corpus/append/round-01/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..5f9666b2c04a25419645b9b9c4a37012bf700d2e --- /dev/null +++ b/corpus/append/round-01/manifest.json @@ -0,0 +1,415 @@ +{ + "provenance": "Rust append encoding; native OneNote 2010 14.0.7015.1000, independently cold caches. tx-65535 uses independently generated cumulative-CRC empty transactions. tx-511, tx-131071, tx-130816 are durable counter cleanup interruption states; metadata-0..7 enumerate old/new changed numeric header bytes with mixed GUID bytes. shared-rust-after was committed through macOS SMB flock and fsync.", + "files": [ + { + "path": "complex/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "complex/notebook/synthetic.one", + "bytes": 28296, + "sha256": "3990a286cb7e2b4f94e295a915f3d254645b8231d087c2566f4673dcb19cb5a2" + }, + { + "path": "metadata-0/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "metadata-0/notebook/synthetic.one", + "bytes": 114080, + "sha256": "bca790bb1c4ba245987e74946e208e3e4434235b12468171cfd75d7c46e92ff1" + }, + { + "path": "metadata-1/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "metadata-1/notebook/synthetic.one", + "bytes": 114080, + "sha256": "175bb2b208d429c9d30d09360cc837830b027ecf8f1421ada14006e8cb4f62bc" + }, + { + "path": "metadata-2/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "metadata-2/notebook/synthetic.one", + "bytes": 114080, + "sha256": "d84bd1a6151f9366d085a92de9ca38528582e3f35bf87d6703461392f38e0a46" + }, + { + "path": "metadata-3/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "metadata-3/notebook/synthetic.one", + "bytes": 114080, + "sha256": "daf502c1bd12230395eeefdadbc70f1060086088d0b3e6c3de83ad792590e2a2" + }, + { + "path": "metadata-4/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "metadata-4/notebook/synthetic.one", + "bytes": 114080, + "sha256": "b413ca9927a4c3cc5b865384cdb3e3860f4c93bab7e362dc16d3c3d448294f09" + }, + { + "path": "metadata-5/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "metadata-5/notebook/synthetic.one", + "bytes": 114080, + "sha256": "30632c658b5d0efb3c20f37d8eedef3d4d9f93d8dc5a7bfe6150324c7c0c4f6b" + }, + { + "path": "metadata-6/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "metadata-6/notebook/synthetic.one", + "bytes": 114080, + "sha256": "06a4991c3c009871ced86eb445fb698b448a05f6d8c6288ca09adfbe022f8f03" + }, + { + "path": "metadata-7/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "metadata-7/notebook/synthetic.one", + "bytes": 114080, + "sha256": "40e70f53134c94e95289e22c877060c1cff33e184753b600834c3519e0bdbcef" + }, + { + "path": "native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment", + "bytes": 43, + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7" + }, + { + "path": "native/append-01-complex/read/hierarchy.xml", + "bytes": 747, + "sha256": "62c88e89c3a71bb5a1225070bf73353fa27b064232c8cf94d2c0786a529e3d2a" + }, + { + "path": "native/append-01-complex/read/page-000.xml", + "bytes": 7402, + "sha256": "2aebcefeef2441ff237fdd46330fa7be92f0c74cff67fc3def7152247df876ae" + }, + { + "path": "native/append-01-metadata-0/read/hierarchy.xml", + "bytes": 738, + "sha256": "eeed5291ed6e908169f6880d46bb3e500781cd1c65aa1efdd7eef98f5e9bada3" + }, + { + "path": "native/append-01-metadata-0/read/page-000.xml", + "bytes": 1202, + "sha256": "ccc3da7267deb0c9095898dab1f7e6e6d46194a8ffe924fb58b97d4400d8c045" + }, + { + "path": "native/append-01-metadata-1/read/hierarchy.xml", + "bytes": 738, + "sha256": "4e964ca1ae4f920c56a23d14e8d4e818399d15b54a825b5eb646f047774ef918" + }, + { + "path": "native/append-01-metadata-1/read/page-000.xml", + "bytes": 1202, + "sha256": "b8417bf1f532bde8b537cb8a7847f019b0272b05e92fef47a72e391287110d2b" + }, + { + "path": "native/append-01-metadata-2/read/hierarchy.xml", + "bytes": 738, + "sha256": "6057ffef5a578927eca6406d8abf46f70b1184dace9cb25bb1a2ce4ad40a8183" + }, + { + "path": "native/append-01-metadata-2/read/page-000.xml", + "bytes": 1202, + "sha256": "b150316fd63eb98e8c8b2444e14d0aa892a6668589d47a7dd3eda848ab9827d7" + }, + { + "path": "native/append-01-metadata-3/read/hierarchy.xml", + "bytes": 738, + "sha256": "d8cdfe9fd6f82dc16d460c58115a4eb7d28f2e0a25f445ec0fa18a5f4ba2918f" + }, + { + "path": "native/append-01-metadata-3/read/page-000.xml", + "bytes": 1202, + "sha256": "a4c9b4be4f0ea2991895c569ef1d31090b3444766c39f87dee334c28f2b21e38" + }, + { + "path": "native/append-01-metadata-4/read/hierarchy.xml", + "bytes": 738, + "sha256": "02069bd647e10d6fadfdde753d9f83c7e395fe761a1cc6451d3898b3cd9a843f" + }, + { + "path": "native/append-01-metadata-4/read/page-000.xml", + "bytes": 1202, + "sha256": "3d60a915876474bf5b336840f3843035d9742654d4a7ddaf9cbff5238afeac77" + }, + { + "path": "native/append-01-metadata-5/read/hierarchy.xml", + "bytes": 738, + "sha256": "9c3eda81d9b9724eef1c58190544bea05e2b1e17f8506303760e51bbef1d5a3d" + }, + { + "path": "native/append-01-metadata-5/read/page-000.xml", + "bytes": 1202, + "sha256": "de123c6cc23aef198900b51acbf4ebc5ecf3aad91c600a1a7a9c17dbabb37a85" + }, + { + "path": "native/append-01-metadata-6/read/hierarchy.xml", + "bytes": 738, + "sha256": "e33da4f0fe2be615dd67d92a81b2bee4bda66a8d9281c7266eeb44ff5d6dd294" + }, + { + "path": "native/append-01-metadata-6/read/page-000.xml", + "bytes": 1202, + "sha256": "da4c3b236b0480cf370bd3cdae0758ba73a4ceaa142702f95c58f0e63a5db449" + }, + { + "path": "native/append-01-metadata-7/read/hierarchy.xml", + "bytes": 738, + "sha256": "7cfd8d3b52839813e29fb186c96d63bfdd3bc5e4233042e9b4046fb63da3f5b2" + }, + { + "path": "native/append-01-metadata-7/read/page-000.xml", + "bytes": 1202, + "sha256": "63ee2f1019c19966b4987780bf50705f49eb02572f0b01ae2b536792b6151516" + }, + { + "path": "native/append-01-prepared-old/read/hierarchy.xml", + "bytes": 742, + "sha256": "17a91bb968574445d4a6669c6349f2c665ae70e85a725e19f60f1fb17dc2d534" + }, + { + "path": "native/append-01-prepared-old/read/page-000.xml", + "bytes": 1202, + "sha256": "f5d15cd05e7248f4b72b8044c792193f831b8278a0ac62316f06c7dfcd078862" + }, + { + "path": "native/append-01-shared-result/read/hierarchy.xml", + "bytes": 741, + "sha256": "ebae2f490304ca18c0a567eac82bb8d5b8f634978c6f218b6ee42182deeeebee" + }, + { + "path": "native/append-01-shared-result/read/page-000.xml", + "bytes": 1245, + "sha256": "44e8a0be5f8826f770d35f1c0bf7fe13083ea1c337235da96d20cbc18a628d9e" + }, + { + "path": "native/append-01-toc/read/hierarchy.xml", + "bytes": 724, + "sha256": "e9b208e602b66dac470cebb47cfabeff638e57ebf6f1b0c9cbc8da01671140cd" + }, + { + "path": "native/append-01-toc/read/page-000.xml", + "bytes": 1209, + "sha256": "a38fb74b77388ca883a2473e3c7ae11006b2e1be53ec6776b53a1c50ddd23815" + }, + { + "path": "native/append-01-tx-130816/read/hierarchy.xml", + "bytes": 736, + "sha256": "66e57c0265c3ea61d6b7e906f960e9ea7bc085c8d3d48c71bcd3ad387e2e441d" + }, + { + "path": "native/append-01-tx-130816/read/page-000.xml", + "bytes": 1219, + "sha256": "05f01f494097b73a942536d09b6ed2b3e5c867f41fca5839c543d3579fe11097" + }, + { + "path": "native/append-01-tx-131071/read/hierarchy.xml", + "bytes": 736, + "sha256": "4cbab0226ae4f5324afe9532936f7104af1412783397c60fa8c060dfd527873a" + }, + { + "path": "native/append-01-tx-131071/read/page-000.xml", + "bytes": 1219, + "sha256": "751d83958e6eedf8532cf68da32c9257277b2b278c1374fa97ef6c8d66fc5946" + }, + { + "path": "native/append-01-tx-17/read/hierarchy.xml", + "bytes": 728, + "sha256": "8b11acb9971beb4300a50dcd3515a85a5857610ee6a1172feeb05af8dc5bad47" + }, + { + "path": "native/append-01-tx-17/read/page-000.xml", + "bytes": 1201, + "sha256": "48272b3869ce89f3c9380025f9e9b5a59dd87fbe425e8b265e900095f7c86863" + }, + { + "path": "native/append-01-tx-255/read/hierarchy.xml", + "bytes": 730, + "sha256": "ce8a9ff8d234180ba85a97cf9e948404ca99812b1ab867c0a612abebf9e008bf" + }, + { + "path": "native/append-01-tx-255/read/page-000.xml", + "bytes": 1202, + "sha256": "643edfa2fa699a5167cc67cba4c6fda19000f18cd92c83a7194a075377b4ca36" + }, + { + "path": "native/append-01-tx-256/read/hierarchy.xml", + "bytes": 730, + "sha256": "4676661c992cb6dac83e8af638f36eba9dcbea10e74a4b1455b5001a192aab70" + }, + { + "path": "native/append-01-tx-256/read/page-000.xml", + "bytes": 1202, + "sha256": "dbcd161997db31953e9ebe8ef54dce4c978d672e126eaccb19b693ed078dd6a1" + }, + { + "path": "native/append-01-tx-511/read/hierarchy.xml", + "bytes": 730, + "sha256": "81bbba3b9b33e85e0b3680a7b60d8ce4b67062ba8a55adb0b3040f0e1439c048" + }, + { + "path": "native/append-01-tx-511/read/page-000.xml", + "bytes": 1202, + "sha256": "4f1e5fbc8eee10bae325bda0153f957f441b992c47b1820976ab7452079b2091" + }, + { + "path": "native/append-01-tx-65535/read/hierarchy.xml", + "bytes": 734, + "sha256": "ef03baeb1aeebc307cc0aafd38a4bac8999ad5f21eae6858f883e8da9f2c1732" + }, + { + "path": "native/append-01-tx-65535/read/page-000.xml", + "bytes": 1209, + "sha256": "3cabdf2c22f76583046a0d7ad8889d363381ccb66d740b34bc2c68cb85fb9fb5" + }, + { + "path": "native/append-01-tx-65536/read/hierarchy.xml", + "bytes": 734, + "sha256": "0d5f678afb1744415ff6590b59a38114b262436014dcce6399a7be0ecfdb89ea" + }, + { + "path": "native/append-01-tx-65536/read/page-000.xml", + "bytes": 1219, + "sha256": "cf0a27b4b60a017a8a3ffff096d6bab48413c8e70f19eb5a596b277f05539e59" + }, + { + "path": "native-after-511.one", + "bytes": 123432, + "sha256": "3bcdc91527414ad8bb285057deb90655f38722d8f430062a7970fb54b273bc75" + }, + { + "path": "prepared-old/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "prepared-old/notebook/synthetic.one", + "bytes": 114080, + "sha256": "35ba5beccee3c74e683f8c18cd693916bf20c2648762d5295468ad363d8430c7" + }, + { + "path": "shared-native-before.one", + "bytes": 10188, + "sha256": "afb2d75f474fcb098c22177f58271a148af5cef1b27794eb98d0d4ef188420f9" + }, + { + "path": "shared-rust-after.one", + "bytes": 10608, + "sha256": "06dea7721a4ad44c09589f9b32f270e3fcd3d3e0f87b653368a78c56dd247f02" + }, + { + "path": "toc/notebook/Open Notebook.onetoc2", + "bytes": 5032, + "sha256": "222ad33bf9471e6e0748ccad3cb1573e351cd12df7a44a1217f5ebd368457c3c" + }, + { + "path": "toc/notebook/synthetic.one", + "bytes": 11808, + "sha256": "2237e5fdfeb8d71410b585159bdfb6724599f40dfcda2795794d8e1e47a20058" + }, + { + "path": "tx-130816/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "tx-130816/notebook/synthetic.one", + "bytes": 1078200, + "sha256": "cd3c471b1e0d339b85413ddf4b9615133d3c46aa2284b3d50fa9c8f97a12b382" + }, + { + "path": "tx-131071/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "tx-131071/notebook/synthetic.one", + "bytes": 1078200, + "sha256": "7f9a13ec489750dc3792bc3b3e8f349a21dfa836165964b1649863e9726c6655" + }, + { + "path": "tx-17/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "tx-17/notebook/synthetic.one", + "bytes": 12200, + "sha256": "ed7d6f2721a95e207a67f2a5e16a1bf1ceed52321faf8b716029d703deb99570" + }, + { + "path": "tx-255/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "tx-255/notebook/synthetic.one", + "bytes": 111640, + "sha256": "1448079e91f656513d5f0cb36a35480aab8f9184a3ce33d64c6199285ca3a521" + }, + { + "path": "tx-256/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "tx-256/notebook/synthetic.one", + "bytes": 114080, + "sha256": "66770e32eeddc265b21cdb093ab4d15073de45f53cb790c2ee1bc8a42e6d60ef" + }, + { + "path": "tx-511/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "tx-511/notebook/synthetic.one", + "bytes": 114080, + "sha256": "2ced768e1a8e0ba2a0660df7c0191ca10837e86ac983790c433f6141ddb7b3fa" + }, + { + "path": "tx-65535/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "tx-65535/notebook/synthetic.one", + "bytes": 545312, + "sha256": "cc8821d487195f7cac1822d3ef127867db7a2435ddddc54b7c5d183532248861" + }, + { + "path": "tx-65536/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "tx-65536/notebook/synthetic.one", + "bytes": 1078200, + "sha256": "7bc58f1acda7fcb2a86dfe36912a91874c3e4095192688be97104aa3e6d77f2f" + } + ] +} diff --git a/corpus/append/round-01/metadata-0/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/metadata-0/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/metadata-0/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/metadata-0/notebook/synthetic.one b/corpus/append/round-01/metadata-0/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..08d9c3fb0cbef7ca44473a7c2da8177d8efe6f76 Binary files /dev/null and b/corpus/append/round-01/metadata-0/notebook/synthetic.one differ diff --git a/corpus/append/round-01/metadata-1/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/metadata-1/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/metadata-1/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/metadata-1/notebook/synthetic.one b/corpus/append/round-01/metadata-1/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..741bb2b9acff0e616be7c8fb09be14067d394c9f Binary files /dev/null and b/corpus/append/round-01/metadata-1/notebook/synthetic.one differ diff --git a/corpus/append/round-01/metadata-2/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/metadata-2/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/metadata-2/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/metadata-2/notebook/synthetic.one b/corpus/append/round-01/metadata-2/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..353201d1e86c748527c555bf017a6272401a573d Binary files /dev/null and b/corpus/append/round-01/metadata-2/notebook/synthetic.one differ diff --git a/corpus/append/round-01/metadata-3/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/metadata-3/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/metadata-3/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/metadata-3/notebook/synthetic.one b/corpus/append/round-01/metadata-3/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..da9548903bc7625dd37754ba2aab594a4887fae8 Binary files /dev/null and b/corpus/append/round-01/metadata-3/notebook/synthetic.one differ diff --git a/corpus/append/round-01/metadata-4/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/metadata-4/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/metadata-4/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/metadata-4/notebook/synthetic.one b/corpus/append/round-01/metadata-4/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..6b70fc7b51a62b54a6e5b001e205d9e7e20d6a4e Binary files /dev/null and b/corpus/append/round-01/metadata-4/notebook/synthetic.one differ diff --git a/corpus/append/round-01/metadata-5/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/metadata-5/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/metadata-5/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/metadata-5/notebook/synthetic.one b/corpus/append/round-01/metadata-5/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..1e40b15f7c5e3e7a95b63728c674afad28bb5095 Binary files /dev/null and b/corpus/append/round-01/metadata-5/notebook/synthetic.one differ diff --git a/corpus/append/round-01/metadata-6/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/metadata-6/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/metadata-6/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/metadata-6/notebook/synthetic.one b/corpus/append/round-01/metadata-6/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..7268e9709332e94582a47a6fd73922b06d3b4ebd Binary files /dev/null and b/corpus/append/round-01/metadata-6/notebook/synthetic.one differ diff --git a/corpus/append/round-01/metadata-7/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/metadata-7/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/metadata-7/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/metadata-7/notebook/synthetic.one b/corpus/append/round-01/metadata-7/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..daab4308be3897238683b8a1cbb469f275feb4e7 Binary files /dev/null and b/corpus/append/round-01/metadata-7/notebook/synthetic.one differ diff --git a/corpus/append/round-01/native-after-511.one b/corpus/append/round-01/native-after-511.one new file mode 100644 index 0000000000000000000000000000000000000000..6ae28a5018da9493d37704f6af5ac707e327a8ad Binary files /dev/null and b/corpus/append/round-01/native-after-511.one differ diff --git a/corpus/append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/append/round-01/native/append-01-complex/read/hierarchy.xml b/corpus/append/round-01/native/append-01-complex/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..cc0fa3a4d2becce02a711bdfc170aa19e2c3f362 --- /dev/null +++ b/corpus/append/round-01/native/append-01-complex/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-complex/read/page-000.xml b/corpus/append/round-01/native/append-01-complex/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..6fca7a9bd18875ea756d3a02737e854655a4f5fd --- /dev/null +++ b/corpus/append/round-01/native/append-01-complex/read/page-000.xml @@ -0,0 +1,26 @@ + +Compatible: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/append/round-01/native/append-01-metadata-0/read/hierarchy.xml b/corpus/append/round-01/native/append-01-metadata-0/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..13b29b776879d0eba2ba868376eb074c9186dc25 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-0/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-0/read/page-000.xml b/corpus/append/round-01/native/append-01-metadata-0/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..443556aafe1219bc4ef1c8b4a1f31d27a2608863 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-0/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-1/read/hierarchy.xml b/corpus/append/round-01/native/append-01-metadata-1/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..25dc542d07d478c994e962d81afebf97c7339852 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-1/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-1/read/page-000.xml b/corpus/append/round-01/native/append-01-metadata-1/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..9fbee94528cffe5bd8a4744c816d8ef92c60f5dc --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-1/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-2/read/hierarchy.xml b/corpus/append/round-01/native/append-01-metadata-2/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..ee2526bee31aa42b9b3693e3a9b9dd2adf25c6e2 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-2/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-2/read/page-000.xml b/corpus/append/round-01/native/append-01-metadata-2/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..14b8261a7ccd3f331b07af9f25f5a74e7f855a69 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-2/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-3/read/hierarchy.xml b/corpus/append/round-01/native/append-01-metadata-3/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..e305b859d65735bf60a4ec1380e8709a2cb63559 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-3/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-3/read/page-000.xml b/corpus/append/round-01/native/append-01-metadata-3/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..aa16d7dbb011f7ec4c635e0fc1937700b026f427 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-3/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-4/read/hierarchy.xml b/corpus/append/round-01/native/append-01-metadata-4/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..b2cb9a8b5b3bceb36aae95a1b95adfe3caccb088 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-4/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-4/read/page-000.xml b/corpus/append/round-01/native/append-01-metadata-4/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..bab83faae91064c7ff2bd0959dbe77f65c85a6b2 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-4/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-5/read/hierarchy.xml b/corpus/append/round-01/native/append-01-metadata-5/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..37e3a40cb97b20421eef99f8524ab4b369465347 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-5/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-5/read/page-000.xml b/corpus/append/round-01/native/append-01-metadata-5/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..9366920616161745d4adebffa5980174191bfeb9 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-5/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-6/read/hierarchy.xml b/corpus/append/round-01/native/append-01-metadata-6/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..c1a82c104172583677007ca58240a70d23ea4e36 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-6/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-6/read/page-000.xml b/corpus/append/round-01/native/append-01-metadata-6/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..e2a9da50a545d6665e1e0b7f3333861753475b7e --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-6/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-7/read/hierarchy.xml b/corpus/append/round-01/native/append-01-metadata-7/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..be8c048d4fbe7665c5126e54174594c7d08da298 --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-7/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-metadata-7/read/page-000.xml b/corpus/append/round-01/native/append-01-metadata-7/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..bbd54582bac38ebc13e833e7905d1e59ae1f927a --- /dev/null +++ b/corpus/append/round-01/native/append-01-metadata-7/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-prepared-old/read/hierarchy.xml b/corpus/append/round-01/native/append-01-prepared-old/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..5872d4437433dddbc48a5f2a98358e1bcf1aa944 --- /dev/null +++ b/corpus/append/round-01/native/append-01-prepared-old/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-prepared-old/read/page-000.xml b/corpus/append/round-01/native/append-01-prepared-old/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..6a0d314be31d6d50e98b6df9922edef58046bb47 --- /dev/null +++ b/corpus/append/round-01/native/append-01-prepared-old/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-shared-result/read/hierarchy.xml b/corpus/append/round-01/native/append-01-shared-result/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..058ad855bb29bf2b067267dead167e53e0aea4da --- /dev/null +++ b/corpus/append/round-01/native/append-01-shared-result/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-shared-result/read/page-000.xml b/corpus/append/round-01/native/append-01-shared-result/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..a43bc4db29590b511b00eebf80c35d094ff9e183 --- /dev/null +++ b/corpus/append/round-01/native/append-01-shared-result/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-toc/read/hierarchy.xml b/corpus/append/round-01/native/append-01-toc/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..76a7d862437020b30dc9d099579b85d44cfa7d42 --- /dev/null +++ b/corpus/append/round-01/native/append-01-toc/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-toc/read/page-000.xml b/corpus/append/round-01/native/append-01-toc/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..32696054d437296c6d1a4faf6c8cacd790d17bc2 --- /dev/null +++ b/corpus/append/round-01/native/append-01-toc/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-130816/read/hierarchy.xml b/corpus/append/round-01/native/append-01-tx-130816/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2fd2dbba59e2fd4c076a2727d3484c90ad4acf99 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-130816/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-130816/read/page-000.xml b/corpus/append/round-01/native/append-01-tx-130816/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..52176e1bbdb13318c8a78ba67b508204fb2259e2 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-130816/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-131071/read/hierarchy.xml b/corpus/append/round-01/native/append-01-tx-131071/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e8c0340084cc808e1b24384a5bab9ccd81549c8 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-131071/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-131071/read/page-000.xml b/corpus/append/round-01/native/append-01-tx-131071/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..a8cad6dfa7194cf240aae24290dc269d9496f803 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-131071/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-17/read/hierarchy.xml b/corpus/append/round-01/native/append-01-tx-17/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..3daa0ddc1884df99ad41f3f37ed1bd869a1fe8b8 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-17/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-17/read/page-000.xml b/corpus/append/round-01/native/append-01-tx-17/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..1e94f8ecca5593a9d60b70719a78e7a1b6a08c93 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-17/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-255/read/hierarchy.xml b/corpus/append/round-01/native/append-01-tx-255/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..4c206127ccf638e99ac66d76edad555d8f3ddf48 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-255/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-255/read/page-000.xml b/corpus/append/round-01/native/append-01-tx-255/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..4153b58d6265cad4a6f6fe04e43b43bb0701bcd3 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-255/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-256/read/hierarchy.xml b/corpus/append/round-01/native/append-01-tx-256/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..0b4f3249f4de8807f93f1e07c68097695a383c9b --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-256/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-256/read/page-000.xml b/corpus/append/round-01/native/append-01-tx-256/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..e70ff3114473930151128ff85ed0b629006f39d7 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-256/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-511/read/hierarchy.xml b/corpus/append/round-01/native/append-01-tx-511/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..4ab71fb31206bc99630f7173571e74df759d6e2c --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-511/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-511/read/page-000.xml b/corpus/append/round-01/native/append-01-tx-511/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e454afbe0bf9daf24142b30c4a10da2514ad6dc --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-511/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-65535/read/hierarchy.xml b/corpus/append/round-01/native/append-01-tx-65535/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..f3462183ee10802fc5508f928ef7906663466526 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-65535/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-65535/read/page-000.xml b/corpus/append/round-01/native/append-01-tx-65535/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..28c05cb6e0965d631308f62af2049a9b9349bcb5 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-65535/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-65536/read/hierarchy.xml b/corpus/append/round-01/native/append-01-tx-65536/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..d98cc9faf9f066d8aba8e0f3e00d1d5f9ccfd079 --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-65536/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/native/append-01-tx-65536/read/page-000.xml b/corpus/append/round-01/native/append-01-tx-65536/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..68b4e7176d46ec6ab5bea095a2b8172fa77c30db --- /dev/null +++ b/corpus/append/round-01/native/append-01-tx-65536/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/append/round-01/prepared-old/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/prepared-old/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/prepared-old/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/prepared-old/notebook/synthetic.one b/corpus/append/round-01/prepared-old/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..66be1a6dd0a10a947781dac37b5ba58c971b3c05 Binary files /dev/null and b/corpus/append/round-01/prepared-old/notebook/synthetic.one differ diff --git a/corpus/append/round-01/shared-native-before.one b/corpus/append/round-01/shared-native-before.one new file mode 100644 index 0000000000000000000000000000000000000000..c2c53644f921777d7c2ab8b74157803bc99b39b3 Binary files /dev/null and b/corpus/append/round-01/shared-native-before.one differ diff --git a/corpus/append/round-01/shared-rust-after.one b/corpus/append/round-01/shared-rust-after.one new file mode 100644 index 0000000000000000000000000000000000000000..8a9b86db8e8ba9af539577ed5d55f7c7c759ba34 Binary files /dev/null and b/corpus/append/round-01/shared-rust-after.one differ diff --git a/corpus/append/round-01/toc/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/toc/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..179b1f87342b8ef7435b0a96bab85b2039ae83c1 Binary files /dev/null and b/corpus/append/round-01/toc/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/append/round-01/toc/notebook/synthetic.one b/corpus/append/round-01/toc/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..faf12267517d45b287d8dc0d8b96b8fc1633723a Binary files /dev/null and b/corpus/append/round-01/toc/notebook/synthetic.one differ diff --git a/corpus/append/round-01/tx-130816/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/tx-130816/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/tx-130816/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/tx-130816/notebook/synthetic.one b/corpus/append/round-01/tx-130816/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..34cb59f6d82d559f0b31a676dd1af9ceeb36c3c2 Binary files /dev/null and b/corpus/append/round-01/tx-130816/notebook/synthetic.one differ diff --git a/corpus/append/round-01/tx-131071/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/tx-131071/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/tx-131071/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/tx-131071/notebook/synthetic.one b/corpus/append/round-01/tx-131071/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..7cad2cb44251ffa5da086c2d410a799002a7b069 Binary files /dev/null and b/corpus/append/round-01/tx-131071/notebook/synthetic.one differ diff --git a/corpus/append/round-01/tx-17/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/tx-17/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/tx-17/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/tx-17/notebook/synthetic.one b/corpus/append/round-01/tx-17/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..58cf62e6cda1d8bb76d3a7fa900cff2638ff8c1e Binary files /dev/null and b/corpus/append/round-01/tx-17/notebook/synthetic.one differ diff --git a/corpus/append/round-01/tx-255/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/tx-255/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/tx-255/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/tx-255/notebook/synthetic.one b/corpus/append/round-01/tx-255/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..cb6065920c8fdaa09c815e618b1d6bd4cceb9ee1 Binary files /dev/null and b/corpus/append/round-01/tx-255/notebook/synthetic.one differ diff --git a/corpus/append/round-01/tx-256/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/tx-256/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/tx-256/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/tx-256/notebook/synthetic.one b/corpus/append/round-01/tx-256/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..eb5dc14e7fdfdddee7d85ec42fc9e837561ed94d Binary files /dev/null and b/corpus/append/round-01/tx-256/notebook/synthetic.one differ diff --git a/corpus/append/round-01/tx-511/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/tx-511/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/tx-511/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/tx-511/notebook/synthetic.one b/corpus/append/round-01/tx-511/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..8a71fdabf0882b4f8dfa4c2c90e81ba75d4e738d Binary files /dev/null and b/corpus/append/round-01/tx-511/notebook/synthetic.one differ diff --git a/corpus/append/round-01/tx-65535/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/tx-65535/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/tx-65535/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/tx-65535/notebook/synthetic.one b/corpus/append/round-01/tx-65535/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..cd92aa38ae8f5204f5b91038b02aaa067a56e014 Binary files /dev/null and b/corpus/append/round-01/tx-65535/notebook/synthetic.one differ diff --git a/corpus/append/round-01/tx-65536/notebook/Open Notebook.onetoc2 b/corpus/append/round-01/tx-65536/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..3612d344f6e051b174c77832b0589184a178ffdc --- /dev/null +++ b/corpus/append/round-01/tx-65536/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/append/round-01/tx-65536/notebook/synthetic.one b/corpus/append/round-01/tx-65536/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..885b92f14041e17b8e7b1de8497b043f7cdddb34 Binary files /dev/null and b/corpus/append/round-01/tx-65536/notebook/synthetic.one differ diff --git a/corpus/collaboration/round-01/contention/controller/closed b/corpus/collaboration/round-01/contention/controller/closed new file mode 100644 index 0000000000000000000000000000000000000000..277f9daa9548d402d4174aa1f585b80ea9e20806 --- /dev/null +++ b/corpus/collaboration/round-01/contention/controller/closed @@ -0,0 +1 @@ +closed \ No newline at end of file diff --git a/corpus/collaboration/round-01/contention/controller/inbox/0002.json b/corpus/collaboration/round-01/contention/controller/inbox/0002.json new file mode 100644 index 0000000000000000000000000000000000000000..6042befa6d9237c94e66eb0be7a191ca52a45b6e --- /dev/null +++ b/corpus/collaboration/round-01/contention/controller/inbox/0002.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "A notebook created in Rust.", "text": "Native edit waited for the lock."} \ No newline at end of file diff --git a/corpus/collaboration/round-01/contention/controller/outbox/2/done b/corpus/collaboration/round-01/contention/controller/outbox/2/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/collaboration/round-01/contention/controller/outbox/2/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/collaboration/round-01/contention/controller/outbox/3/done b/corpus/collaboration/round-01/contention/controller/outbox/3/done new file mode 120000 index 0000000000000000000000000000000000000000..1ccafebe12fc64e4e4db07e3d3442a4052c1b667 --- /dev/null +++ b/corpus/collaboration/round-01/contention/controller/outbox/3/done @@ -0,0 +1 @@ +../2/done \ No newline at end of file diff --git a/corpus/collaboration/round-01/contention/lock-result.json b/corpus/collaboration/round-01/contention/lock-result.json new file mode 100644 index 0000000000000000000000000000000000000000..e54c424cc9767e0e8898dcda2fd8bae5db24927c --- /dev/null +++ b/corpus/collaboration/round-01/contention/lock-result.json @@ -0,0 +1,5 @@ +{ + "changed_while_locked": false, + "before_sha256": "5104afd78109ccaec78a31717aac12c27ec3dd3b830c2fc7399037ad40f7eac1", + "after_sha256": "5104afd78109ccaec78a31717aac12c27ec3dd3b830c2fc7399037ad40f7eac1" +} \ No newline at end of file diff --git a/corpus/collaboration/round-01/contention/locks.txt b/corpus/collaboration/round-01/contention/locks.txt new file mode 100644 index 0000000000000000000000000000000000000000..09a0044bce6629e58255167208ebe7cbd08b5983 --- /dev/null +++ b/corpus/collaboration/round-01/contention/locks.txt @@ -0,0 +1,2 @@ +FILE PID USER CLIENT OFFSET LENGTH TYPE +agent/synthetic.one 2721277 clo 10.0.0.222 0 -1 write diff --git a/corpus/collaboration/round-01/contention/notebook/Open Notebook.onetoc2 b/corpus/collaboration/round-01/contention/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c12c63e74779955156e373c3f6c5c410f86d546f Binary files /dev/null and b/corpus/collaboration/round-01/contention/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/collaboration/round-01/contention/notebook/synthetic.one b/corpus/collaboration/round-01/contention/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..faf26b0640d8cea372853e059b58c3ef61e0717e Binary files /dev/null and b/corpus/collaboration/round-01/contention/notebook/synthetic.one differ diff --git a/corpus/collaboration/round-01/fault-01/notebook/Open Notebook.onetoc2 b/corpus/collaboration/round-01/fault-01/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..50475fce08343f4fbae56bf6b23def8d360b489c --- /dev/null +++ b/corpus/collaboration/round-01/fault-01/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../../writer/create-notebook-01/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/collaboration/round-01/fault-01/notebook/synthetic.one b/corpus/collaboration/round-01/fault-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..58637c4d6806e8cf3c3fd145f026fa947a2a978f Binary files /dev/null and b/corpus/collaboration/round-01/fault-01/notebook/synthetic.one differ diff --git a/corpus/collaboration/round-01/fault-01/result.json b/corpus/collaboration/round-01/fault-01/result.json new file mode 100644 index 0000000000000000000000000000000000000000..6e85c2dfad8b13f826b9aaabca2e99c52e882540 --- /dev/null +++ b/corpus/collaboration/round-01/fault-01/result.json @@ -0,0 +1,6 @@ +{ + "exit": 1, + "state": "NotCommitted", + "error": "Invalid argument (os error 22)", + "cut": "Successful reply to first data FLUSH was withheld; recovered file retains original text." +} diff --git a/corpus/collaboration/round-01/fault-02/notebook/Open Notebook.onetoc2 b/corpus/collaboration/round-01/fault-02/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..b70e37c2851deaa21a91462c11cd4bcbbe5658d8 --- /dev/null +++ b/corpus/collaboration/round-01/fault-02/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../fault-01/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/collaboration/round-01/fault-02/notebook/synthetic.one b/corpus/collaboration/round-01/fault-02/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..9e268236c29c9de66f28e53b7445a13a9f401ba9 Binary files /dev/null and b/corpus/collaboration/round-01/fault-02/notebook/synthetic.one differ diff --git a/corpus/collaboration/round-01/fault-02/result.json b/corpus/collaboration/round-01/fault-02/result.json new file mode 100644 index 0000000000000000000000000000000000000000..679a6a5612706e2c430bb6fa174eff44ce9354a2 --- /dev/null +++ b/corpus/collaboration/round-01/fault-02/result.json @@ -0,0 +1,5 @@ +{ + "exit": 1, + "stdout": "", + "stderr": "Error: CommitError { state: Unknown, error: Os { code: 22, kind: InvalidInput, message: \"Invalid argument\" } }\n" +} \ No newline at end of file diff --git a/corpus/collaboration/round-01/fault-03/notebook/Open Notebook.onetoc2 b/corpus/collaboration/round-01/fault-03/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..729604ab0a01b83440f43f562d04b1a90e8cb0b1 --- /dev/null +++ b/corpus/collaboration/round-01/fault-03/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../../append/round-01/complex/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/collaboration/round-01/fault-03/notebook/synthetic.one b/corpus/collaboration/round-01/fault-03/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..a4cacd9e673eec658905d4a402bbb1c9a91ffc56 Binary files /dev/null and b/corpus/collaboration/round-01/fault-03/notebook/synthetic.one differ diff --git a/corpus/collaboration/round-01/fault-03/result.json b/corpus/collaboration/round-01/fault-03/result.json new file mode 100644 index 0000000000000000000000000000000000000000..1a906b1da94a7dee469380507bcd014785cb2957 --- /dev/null +++ b/corpus/collaboration/round-01/fault-03/result.json @@ -0,0 +1,5 @@ +{ + "exit": 1, + "stdout": "", + "stderr": "Error: CommitError { state: Committed, error: Os { code: 57, kind: NotConnected, message: \"Socket is not connected\" } }\n" +} \ No newline at end of file diff --git a/corpus/collaboration/round-01/live/before-native-conflict.xml b/corpus/collaboration/round-01/live/before-native-conflict.xml new file mode 100644 index 0000000000000000000000000000000000000000..0e37f9416658171285e6fbdc07b401a2d2430b4c --- /dev/null +++ b/corpus/collaboration/round-01/live/before-native-conflict.xml @@ -0,0 +1,27 @@ + +Live Rust: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/collaboration/round-01/live/before-native-edit.xml b/corpus/collaboration/round-01/live/before-native-edit.xml new file mode 100644 index 0000000000000000000000000000000000000000..9b1ba6f149e8cc022acb2b918ac46a791ef45cf9 --- /dev/null +++ b/corpus/collaboration/round-01/live/before-native-edit.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/collaboration/round-01/live/before.xml b/corpus/collaboration/round-01/live/before.xml new file mode 120000 index 0000000000000000000000000000000000000000..e5d1a109111a62c41612652608b546507d2c5767 --- /dev/null +++ b/corpus/collaboration/round-01/live/before.xml @@ -0,0 +1 @@ +before-native-edit.xml \ No newline at end of file diff --git a/corpus/collaboration/round-01/live/merged.xml b/corpus/collaboration/round-01/live/merged.xml new file mode 120000 index 0000000000000000000000000000000000000000..70c13f886a0b0d8fa4c6e06da2cc3dfcba3868c7 --- /dev/null +++ b/corpus/collaboration/round-01/live/merged.xml @@ -0,0 +1 @@ +before-native-conflict.xml \ No newline at end of file diff --git a/corpus/collaboration/round-01/live/notebook/Open Notebook.onetoc2 b/corpus/collaboration/round-01/live/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..e38431e1f42e8d36e6091dd4d753960335514dc1 --- /dev/null +++ b/corpus/collaboration/round-01/live/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../fault-03/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/collaboration/round-01/live/notebook/synthetic.one b/corpus/collaboration/round-01/live/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..3db16f995f1eed74a2d20d4fa5fb1a33332eb04a Binary files /dev/null and b/corpus/collaboration/round-01/live/notebook/synthetic.one differ diff --git a/corpus/collaboration/round-01/manifest.json b/corpus/collaboration/round-01/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..55aaa0a778a2150cd37856be9605b83f51b4024f --- /dev/null +++ b/corpus/collaboration/round-01/manifest.json @@ -0,0 +1,215 @@ +{ + "provenance": "OneNote 2010 14.0.7015.1000 on Windows 7; Rust over macOS SMB to Samba zenith. Disposable synthetic notebooks. Separate native cold-cache reads after live competing edits, offline native edit/reconnect, whole-file lock contention, and lost successful SMB FLUSH replies. Native conflict UI confirms offline competing text; COM hierarchy omits conflict pages. fault-01 result transcribed from tool output; fault-02/03 capture subprocess results. Contention controller completed edit/sync while locked and closed at its deadline; queued commands 4-6 were submitted after it had closed and are excluded. All snapshots are final files, not live reads.", + "files": [ + { + "path": "contention/controller/closed", + "bytes": 6, + "sha256": "c3eefb58d7c42440a9d4abec51d629544d635a6d936ff3c4d3fca96d611b3cf3" + }, + { + "path": "contention/controller/inbox/0002.json", + "bytes": 105, + "sha256": "3eee25e32b408cf11a968933daf88e42b20b264bef3a8202f8a52b5f84059561" + }, + { + "path": "contention/controller/outbox/2/done", + "bytes": 2, + "sha256": "2689367b205c16ce32ed4200942b8b8b1e262dfc70d9bc9fbc77c49699a4f1df" + }, + { + "path": "contention/controller/outbox/3/done", + "bytes": 2, + "sha256": "2689367b205c16ce32ed4200942b8b8b1e262dfc70d9bc9fbc77c49699a4f1df" + }, + { + "path": "contention/lock-result.json", + "bytes": 208, + "sha256": "08ac88cb982b2bdd57b44b75392f5f4dac2d5a4c20dede2c54a458df62636e1c" + }, + { + "path": "contention/locks.txt", + "bytes": 139, + "sha256": "9ffd453cecbc7f6b7824c24a49eae96f60bdb0fff11fd9364cd88af89332fdf1" + }, + { + "path": "contention/notebook/Open Notebook.onetoc2", + "bytes": 3780, + "sha256": "5d29939d775452394e16c4850ecf98a35ccbb4da1ffdea148f8999fb69a89eaf" + }, + { + "path": "contention/notebook/synthetic.one", + "bytes": 10548, + "sha256": "b1b553e571ebcd39dbc35d73817d6c0b7dabadf28dd849fc2cf7fb59f4a97c83" + }, + { + "path": "fault-01/notebook/Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86" + }, + { + "path": "fault-01/notebook/synthetic.one", + "bytes": 4784, + "sha256": "c099cc85d9e4e48a568ce1fdc89aafb15a727523cef20bf5c7bfd2bf07fe40f8" + }, + { + "path": "fault-01/result.json", + "bytes": 189, + "sha256": "076b8f75581c9e52f9e53bb2ba33f3e4d492908fb12421a05d0b017e88a2d50d" + }, + { + "path": "fault-02/notebook/Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86" + }, + { + "path": "fault-02/notebook/synthetic.one", + "bytes": 4800, + "sha256": "6a1b3b9816497d27648747d7be61582cac3b0405239098d759858a6d46f65199" + }, + { + "path": "fault-02/result.json", + "bytes": 161, + "sha256": "179e92f32c2c70b9bfbc982ac15f4942ce414ca3d75c906f4ef2aa86a8e4f475" + }, + { + "path": "fault-03/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "fault-03/notebook/synthetic.one", + "bytes": 114096, + "sha256": "fd5927a433a4d054567e109e3694e343678c519f291da26e8e4792e782ee72ea" + }, + { + "path": "fault-03/result.json", + "bytes": 170, + "sha256": "6aeb222bff02c90a101628ba2525e7ed1df6408890edb0cc161f424cd2b44703" + }, + { + "path": "live/before-native-conflict.xml", + "bytes": 7507, + "sha256": "a79f4aed3a44587e609d2c53fc63a544dda46cec2ae23385eeb8772c0b7fc76c" + }, + { + "path": "live/before-native-edit.xml", + "bytes": 7402, + "sha256": "0a07362ebfed561f8e694a34537fdd8afc0ff52ba92c1afca4c69ec68b3abe13" + }, + { + "path": "live/before.xml", + "bytes": 7402, + "sha256": "0a07362ebfed561f8e694a34537fdd8afc0ff52ba92c1afca4c69ec68b3abe13" + }, + { + "path": "live/merged.xml", + "bytes": 7507, + "sha256": "a79f4aed3a44587e609d2c53fc63a544dda46cec2ae23385eeb8772c0b7fc76c" + }, + { + "path": "live/notebook/Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "live/notebook/synthetic.one", + "bytes": 55352, + "sha256": "9802336c345c6d8cea9e7058bf9b2c43d1202fd8087d7422313d8d4e112bff3a" + }, + { + "path": "native/stage5-cold-contention-01/read/hierarchy.xml", + "bytes": 758, + "sha256": "2e87cb096dad398e1bcd43853ad42edb75f973565251ec547ded270d23943e27" + }, + { + "path": "native/stage5-cold-contention-01/read/page-000.xml", + "bytes": 1252, + "sha256": "9d8ddcaba0afe75a8be771204439df454d529f23e47c27b7e259ae35b5afd610" + }, + { + "path": "native/stage5-cold-fault-01/read/hierarchy.xml", + "bytes": 743, + "sha256": "14a1da18d6cb76351dd56645a3a7b7d3842eab0cef42233c1b09cd354b5b694c" + }, + { + "path": "native/stage5-cold-fault-01/read/page-000.xml", + "bytes": 1113, + "sha256": "8caa2b1c4200f31898d672ca7d968c41736eff8e7942af8d74a1794fefa2427c" + }, + { + "path": "native/stage5-cold-fault-02/read/hierarchy.xml", + "bytes": 743, + "sha256": "5a47a77898a95d6c0d552403b32283cc42e977e7645b2ea52b104dafe6d209d6" + }, + { + "path": "native/stage5-cold-fault-02/read/page-000.xml", + "bytes": 1120, + "sha256": "ab729b2bb889b8fcdd48529e1243fbac4ecfd1bb3131ee08048eed3d5b52c18f" + }, + { + "path": "native/stage5-cold-fault-03/read/hierarchy.xml", + "bytes": 738, + "sha256": "b8e03039b6d6e79d96807ef5697ea361a1cbd9f7bdbd427ddd3ab7a41d189ce8" + }, + { + "path": "native/stage5-cold-fault-03/read/page-000.xml", + "bytes": 1217, + "sha256": "0fdea4db019303f8d193996bf5870d3f441dc921ed24c34fcfa8594213da9058" + }, + { + "path": "native/stage5-cold-live-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment", + "bytes": 43, + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7" + }, + { + "path": "native/stage5-cold-live-01/read/hierarchy.xml", + "bytes": 750, + "sha256": "9b7f7de8fc505667e1c30679069cf28042b874388f01f8310ba360db9dfaa67b" + }, + { + "path": "native/stage5-cold-live-01/read/page-000.xml", + "bytes": 7494, + "sha256": "82f0c26d1168925781e454b2d3194f210cd9bcd970c2938a5aec9a25651a245c" + }, + { + "path": "native/stage5-cold-offline-02/read/hierarchy.xml", + "bytes": 753, + "sha256": "bbf7435614ff86c8593ec53e0cd6cb06a12da6773bef70dbfccfdf0a0f3edde0" + }, + { + "path": "native/stage5-cold-offline-02/read/page-000.xml", + "bytes": 1130, + "sha256": "b4d1a857928c4c329cfe976dcf0a039796e3a651383108d506c8638c238584a4" + }, + { + "path": "offline/native-conflict.png", + "bytes": 170526, + "sha256": "77871e4f23011227a80c8dc8d7cdd5883979763a1ebe0697b733a86fdbdd49b1" + }, + { + "path": "offline/notebook/Open Notebook.onetoc2", + "bytes": 3780, + "sha256": "f5631f3953cdfb7da6ab48a690265bc8558b1800793adcf63290b63cfdf85889" + }, + { + "path": "offline/notebook/synthetic.one", + "bytes": 15400, + "sha256": "01a35591f453c097f544912a69925d2568700bf19f81558ff2c2de35cb66961e" + }, + { + "path": "offline/reconnected.xml", + "bytes": 1146, + "sha256": "f026355e1f746aa915ce4fef4db9cd17a8f3e92ba4fa3c9d91ff9f4e3bf1d455" + }, + { + "path": "smb-faults.jsonl", + "bytes": 58820, + "sha256": "7e482527401fda4d2cd5a80cc6b3bc75c91a3bcb39245f979491c7e0ad89dd09" + }, + { + "path": "smb-success.jsonl", + "bytes": 17076, + "sha256": "f26096684d19aec09af27baf9b7ba9c52e2e423c246963b823ab95473d75b754" + } + ] +} diff --git a/corpus/collaboration/round-01/native/stage5-cold-contention-01/read/hierarchy.xml b/corpus/collaboration/round-01/native/stage5-cold-contention-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..659681d497ac27e7a827de6ef75ea0c546e7a7e5 --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-contention-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/native/stage5-cold-contention-01/read/page-000.xml b/corpus/collaboration/round-01/native/stage5-cold-contention-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..d17c6b3fe28bd570487910414ba09827428273f0 --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-contention-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/native/stage5-cold-fault-01/read/hierarchy.xml b/corpus/collaboration/round-01/native/stage5-cold-fault-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..761696bda3695532a7dd269798afc3a2551fce70 --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-fault-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/native/stage5-cold-fault-01/read/page-000.xml b/corpus/collaboration/round-01/native/stage5-cold-fault-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..80fd98faa544cc6390d50f2adc53e787da5d5045 --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-fault-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/native/stage5-cold-fault-02/read/hierarchy.xml b/corpus/collaboration/round-01/native/stage5-cold-fault-02/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..7a10ba8c3c53fbbf9806a649d63e9905a2a90fcb --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-fault-02/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/native/stage5-cold-fault-02/read/page-000.xml b/corpus/collaboration/round-01/native/stage5-cold-fault-02/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..c25c87fe4f31d27d5c61517d2d3f94f11b845160 --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-fault-02/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/native/stage5-cold-fault-03/read/hierarchy.xml b/corpus/collaboration/round-01/native/stage5-cold-fault-03/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..89e728a1ac8c5ccab1de6a910f6bb38fffc6f2d6 --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-fault-03/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/native/stage5-cold-fault-03/read/page-000.xml b/corpus/collaboration/round-01/native/stage5-cold-fault-03/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..9c4b58db7ddaa58d643942a59094221d017b5333 --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-fault-03/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/native/stage5-cold-live-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/collaboration/round-01/native/stage5-cold-live-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 120000 index 0000000000000000000000000000000000000000..9d5067f72034c3a400e35b9d8a8ef57a41a3884c --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-live-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +../../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment \ No newline at end of file diff --git a/corpus/collaboration/round-01/native/stage5-cold-live-01/read/hierarchy.xml b/corpus/collaboration/round-01/native/stage5-cold-live-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..d1b808ba2fa0c74351452c11555c863b45754da8 --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-live-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/native/stage5-cold-live-01/read/page-000.xml b/corpus/collaboration/round-01/native/stage5-cold-live-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..42bd75462528befddc13bcfaeccf182e02574fb5 --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-live-01/read/page-000.xml @@ -0,0 +1,27 @@ + +Live Rust: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/collaboration/round-01/native/stage5-cold-offline-02/read/hierarchy.xml b/corpus/collaboration/round-01/native/stage5-cold-offline-02/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..f9a098e7474813de1da19797eb1a05d404872b66 --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-offline-02/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/native/stage5-cold-offline-02/read/page-000.xml b/corpus/collaboration/round-01/native/stage5-cold-offline-02/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b55d20c795f6861d35f30456d16f8f45c99aadd --- /dev/null +++ b/corpus/collaboration/round-01/native/stage5-cold-offline-02/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/offline/native-conflict.png b/corpus/collaboration/round-01/offline/native-conflict.png new file mode 100644 index 0000000000000000000000000000000000000000..42e47d892c30d6133facc464b3b92ac96ae13dff Binary files /dev/null and b/corpus/collaboration/round-01/offline/native-conflict.png differ diff --git a/corpus/collaboration/round-01/offline/notebook/Open Notebook.onetoc2 b/corpus/collaboration/round-01/offline/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..d7e4dfb2fdaaa5d207bb59a9551220e5a2a564d0 Binary files /dev/null and b/corpus/collaboration/round-01/offline/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/collaboration/round-01/offline/notebook/synthetic.one b/corpus/collaboration/round-01/offline/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..85f19c66fd292db96ea61dae785d7ae256ed2c16 Binary files /dev/null and b/corpus/collaboration/round-01/offline/notebook/synthetic.one differ diff --git a/corpus/collaboration/round-01/offline/reconnected.xml b/corpus/collaboration/round-01/offline/reconnected.xml new file mode 100644 index 0000000000000000000000000000000000000000..108976a84979e2590fe1a3f6cf1a3c13aef31dc4 --- /dev/null +++ b/corpus/collaboration/round-01/offline/reconnected.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/collaboration/round-01/smb-faults.jsonl b/corpus/collaboration/round-01/smb-faults.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..9a761fa6dd1ef5d7ffe406abf9055e25cb90640a --- /dev/null +++ b/corpus/collaboration/round-01/smb-faults.jsonl @@ -0,0 +1,627 @@ +{"time": 1788596794.48568, "listening": 11445} +{"time": 1788596795.602871, "direction": "response", "command": 0, "message": 0, "status": "0x0"} +{"time": 1788596795.603053, "direction": "request", "command": 0, "message": 1} +{"time": 1788596795.603626, "direction": "response", "command": 0, "message": 1, "status": "0x0"} +{"time": 1788596795.6214411, "direction": "request", "command": 1, "message": 2} +{"time": 1788596795.622229, "direction": "response", "command": 1, "message": 2, "status": "0xc0000016"} +{"time": 1788596795.6231859, "direction": "request", "command": 1, "message": 3} +{"time": 1788596795.6254468, "direction": "response", "command": 1, "message": 3, "status": "0x0"} +{"time": 1788596795.62623, "direction": "request", "command": 3, "message": 4} +{"time": 1788596795.641889, "direction": "response", "command": 3, "message": 4, "status": "0x0"} +{"time": 1788596795.803332, "direction": "request", "command": 5, "message": 5} +{"time": 1788596795.8033862, "direction": "request", "command": 16, "message": 6} +{"time": 1788596795.8033988, "direction": "request", "command": 6, "message": 7} +{"time": 1788596795.804718, "direction": "response", "command": 5, "message": 5, "status": "0x0"} +{"time": 1788596795.804736, "direction": "response", "command": 16, "message": 6, "status": "0x0"} +{"time": 1788596795.804745, "direction": "response", "command": 6, "message": 7, "status": "0x0"} +{"time": 1788596795.8049338, "direction": "request", "command": 5, "message": 8} +{"time": 1788596795.804957, "direction": "request", "command": 16, "message": 9} +{"time": 1788596795.8049679, "direction": "request", "command": 6, "message": 10} +{"time": 1788596795.805514, "direction": "response", "command": 5, "message": 8, "status": "0x0"} +{"time": 1788596795.805526, "direction": "response", "command": 16, "message": 9, "status": "0x0"} +{"time": 1788596795.805535, "direction": "response", "command": 6, "message": 10, "status": "0x0"} +{"time": 1788596795.805697, "direction": "request", "command": 5, "message": 11} +{"time": 1788596795.805706, "direction": "request", "command": 16, "message": 12} +{"time": 1788596795.805713, "direction": "request", "command": 6, "message": 13} +{"time": 1788596795.806253, "direction": "response", "command": 5, "message": 11, "status": "0x0"} +{"time": 1788596795.806262, "direction": "response", "command": 16, "message": 12, "status": "0x0"} +{"time": 1788596795.806269, "direction": "response", "command": 6, "message": 13, "status": "0x0"} +{"time": 1788596795.806425, "direction": "request", "command": 5, "message": 14} +{"time": 1788596795.8064342, "direction": "request", "command": 11, "message": 15} +{"time": 1788596795.8064399, "direction": "request", "command": 6, "message": 16} +{"time": 1788596795.806939, "direction": "response", "command": 5, "message": 14, "status": "0x0"} +{"time": 1788596795.8069482, "direction": "response", "command": 11, "message": 15, "status": "0x0"} +{"time": 1788596795.806955, "direction": "response", "command": 6, "message": 16, "status": "0x0"} +{"time": 1788596795.8071191, "direction": "request", "command": 5, "message": 17} +{"time": 1788596795.807126, "direction": "request", "command": 16, "message": 18} +{"time": 1788596795.807133, "direction": "request", "command": 6, "message": 19} +{"time": 1788596795.8071492, "direction": "request", "command": 15, "message": 20} +{"time": 1788596795.807737, "direction": "response", "command": 5, "message": 17, "status": "0x0"} +{"time": 1788596795.807746, "direction": "response", "command": 16, "message": 18, "status": "0x0"} +{"time": 1788596795.807752, "direction": "response", "command": 6, "message": 19, "status": "0x0"} +{"time": 1788596795.807768, "direction": "response", "command": 15, "message": 20, "status": "0xc0000128"} +{"time": 1788596795.811281, "direction": "request", "command": 5, "message": 21} +{"time": 1788596795.8113012, "direction": "request", "command": 8, "message": 22, "length": 60, "offset": 0} +{"time": 1788596795.81131, "direction": "request", "command": 6, "message": 23} +{"time": 1788596795.8121111, "direction": "response", "command": 5, "message": 21, "status": "0xc0000034"} +{"time": 1788596795.812144, "direction": "response", "command": 8, "message": 22, "status": "0xc0000034"} +{"time": 1788596795.81215, "direction": "response", "command": 6, "message": 23, "status": "0xc0000034"} +{"time": 1788596795.8132281, "direction": "request", "command": 5, "message": 24} +{"time": 1788596795.813237, "direction": "request", "command": 6, "message": 25} +{"time": 1788596795.8139038, "direction": "response", "command": 5, "message": 24, "status": "0x0"} +{"time": 1788596795.8139122, "direction": "response", "command": 6, "message": 25, "status": "0x0"} +{"time": 1788596795.818496, "direction": "request", "command": 5, "message": 26} +{"time": 1788596795.8185039, "direction": "request", "command": 14, "message": 27} +{"time": 1788596795.81851, "direction": "request", "command": 6, "message": 28} +{"time": 1788596795.819212, "direction": "response", "command": 5, "message": 26, "status": "0x0"} +{"time": 1788596795.819221, "direction": "response", "command": 14, "message": 27, "status": "0xc000000f"} +{"time": 1788596795.819226, "direction": "response", "command": 6, "message": 28, "status": "0x0"} +{"time": 1788596795.819457, "direction": "request", "command": 5, "message": 29} +{"time": 1788596795.819465, "direction": "request", "command": 14, "message": 30} +{"time": 1788596795.8194702, "direction": "request", "command": 6, "message": 31} +{"time": 1788596795.820155, "direction": "response", "command": 5, "message": 29, "status": "0x0"} +{"time": 1788596795.820163, "direction": "response", "command": 14, "message": 30, "status": "0xc000000f"} +{"time": 1788596795.820169, "direction": "response", "command": 6, "message": 31, "status": "0x0"} +{"time": 1788596795.820367, "direction": "request", "command": 5, "message": 32} +{"time": 1788596795.820373, "direction": "request", "command": 14, "message": 33} +{"time": 1788596795.820378, "direction": "request", "command": 6, "message": 34} +{"time": 1788596795.8209631, "direction": "response", "command": 5, "message": 32, "status": "0x0"} +{"time": 1788596795.820971, "direction": "response", "command": 14, "message": 33, "status": "0xc000000f"} +{"time": 1788596795.820976, "direction": "response", "command": 6, "message": 34, "status": "0x0"} +{"time": 1788596795.821236, "direction": "request", "command": 5, "message": 35} +{"time": 1788596795.8212428, "direction": "request", "command": 14, "message": 36} +{"time": 1788596795.821248, "direction": "request", "command": 6, "message": 37} +{"time": 1788596795.821866, "direction": "response", "command": 5, "message": 35, "status": "0x0"} +{"time": 1788596795.821878, "direction": "response", "command": 14, "message": 36, "status": "0xc000000f"} +{"time": 1788596795.8218849, "direction": "response", "command": 6, "message": 37, "status": "0x0"} +{"time": 1788596795.8225238, "direction": "request", "command": 5, "message": 38} +{"time": 1788596795.822531, "direction": "request", "command": 14, "message": 39} +{"time": 1788596795.822536, "direction": "request", "command": 6, "message": 40} +{"time": 1788596795.8228428, "direction": "request", "command": 5, "message": 41} +{"time": 1788596795.8228621, "direction": "request", "command": 14, "message": 42} +{"time": 1788596795.8228722, "direction": "request", "command": 6, "message": 43} +{"time": 1788596795.8231611, "direction": "response", "command": 5, "message": 38, "status": "0x0"} +{"time": 1788596795.823172, "direction": "response", "command": 14, "message": 39, "status": "0xc000000f"} +{"time": 1788596795.823179, "direction": "response", "command": 6, "message": 40, "status": "0x0"} +{"time": 1788596795.8235352, "direction": "response", "command": 5, "message": 41, "status": "0x0"} +{"time": 1788596795.823543, "direction": "response", "command": 14, "message": 42, "status": "0xc000000f"} +{"time": 1788596795.823549, "direction": "response", "command": 6, "message": 43, "status": "0x0"} +{"time": 1788596799.7892811, "direction": "request", "command": 5, "message": 44} +{"time": 1788596799.789431, "direction": "request", "command": 16, "message": 45} +{"time": 1788596799.789449, "direction": "request", "command": 6, "message": 46} +{"time": 1788596799.7907782, "direction": "response", "command": 5, "message": 44, "status": "0x0"} +{"time": 1788596799.790837, "direction": "response", "command": 16, "message": 45, "status": "0x0"} +{"time": 1788596799.790874, "direction": "response", "command": 6, "message": 46, "status": "0x0"} +{"time": 1788596810.810456, "direction": "request", "command": 15, "message": 47} +{"time": 1788596810.811786, "direction": "response", "command": 15, "message": 47, "status": "0xc0000128"} +{"time": 1788596825.814044, "direction": "request", "command": 15, "message": 48} +{"time": 1788596825.815031, "direction": "response", "command": 15, "message": 48, "status": "0xc0000128"} +{"time": 1788596835.7812622, "direction": "request", "command": 5, "message": 49} +{"time": 1788596835.781305, "direction": "request", "command": 16, "message": 50} +{"time": 1788596835.7813172, "direction": "request", "command": 6, "message": 51} +{"time": 1788596835.782187, "direction": "response", "command": 5, "message": 49, "status": "0x0"} +{"time": 1788596835.7822, "direction": "response", "command": 16, "message": 50, "status": "0x0"} +{"time": 1788596835.782208, "direction": "response", "command": 6, "message": 51, "status": "0x0"} +{"time": 1788596835.7823849, "direction": "request", "command": 5, "message": 52} +{"time": 1788596835.7823958, "direction": "request", "command": 14, "message": 53} +{"time": 1788596835.782403, "direction": "request", "command": 6, "message": 54} +{"time": 1788596835.783127, "direction": "response", "command": 5, "message": 52, "status": "0x0"} +{"time": 1788596835.783138, "direction": "response", "command": 14, "message": 53, "status": "0x0"} +{"time": 1788596835.783146, "direction": "response", "command": 6, "message": 54, "status": "0x0"} +{"time": 1788596835.78332, "direction": "request", "command": 5, "message": 55} +{"time": 1788596835.783329, "direction": "request", "command": 14, "message": 56} +{"time": 1788596835.783336, "direction": "request", "command": 6, "message": 57} +{"time": 1788596835.783911, "direction": "response", "command": 5, "message": 55, "status": "0x0"} +{"time": 1788596835.783921, "direction": "response", "command": 14, "message": 56, "status": "0xc000000f"} +{"time": 1788596835.7839282, "direction": "response", "command": 6, "message": 57, "status": "0x0"} +{"time": 1788596835.784095, "direction": "request", "command": 5, "message": 58} +{"time": 1788596835.784103, "direction": "request", "command": 6, "message": 59} +{"time": 1788596835.78494, "direction": "response", "command": 5, "message": 58, "status": "0x0"} +{"time": 1788596835.784949, "direction": "response", "command": 6, "message": 59, "status": "0x0"} +{"time": 1788596835.785124, "direction": "request", "command": 5, "message": 60} +{"time": 1788596835.7851331, "direction": "request", "command": 8, "message": 61, "length": 64, "offset": 0} +{"time": 1788596835.785141, "direction": "request", "command": 6, "message": 62} +{"time": 1788596835.7857149, "direction": "response", "command": 5, "message": 60, "status": "0xc0000034"} +{"time": 1788596835.7857249, "direction": "response", "command": 8, "message": 61, "status": "0xc0000034"} +{"time": 1788596835.785732, "direction": "response", "command": 6, "message": 62, "status": "0xc0000034"} +{"time": 1788596835.78588, "direction": "request", "command": 5, "message": 63} +{"time": 1788596835.785889, "direction": "request", "command": 9, "message": 64, "length": 11, "offset": 0} +{"time": 1788596835.7858958, "direction": "request", "command": 17, "message": 65} +{"time": 1788596835.7859032, "direction": "request", "command": 6, "message": 66} +{"time": 1788596835.7868109, "direction": "response", "command": 5, "message": 63, "status": "0x0"} +{"time": 1788596835.7868218, "direction": "response", "command": 9, "message": 64, "status": "0x0"} +{"time": 1788596835.786829, "direction": "response", "command": 17, "message": 65, "status": "0x0"} +{"time": 1788596835.786837, "direction": "response", "command": 6, "message": 66, "status": "0x0"} +{"time": 1788596835.787012, "direction": "request", "command": 5, "message": 67} +{"time": 1788596835.787037, "direction": "request", "command": 14, "message": 68} +{"time": 1788596835.787045, "direction": "request", "command": 6, "message": 69} +{"time": 1788596835.7875898, "direction": "response", "command": 5, "message": 67, "status": "0x0"} +{"time": 1788596835.787599, "direction": "response", "command": 14, "message": 68, "status": "0xc000000f"} +{"time": 1788596835.787605, "direction": "response", "command": 6, "message": 69, "status": "0x0"} +{"time": 1788596835.787787, "direction": "request", "command": 5, "message": 70} +{"time": 1788596835.7877939, "direction": "request", "command": 14, "message": 71} +{"time": 1788596835.7877991, "direction": "request", "command": 6, "message": 72} +{"time": 1788596835.788331, "direction": "response", "command": 5, "message": 70, "status": "0x0"} +{"time": 1788596835.7883399, "direction": "response", "command": 14, "message": 71, "status": "0xc000000f"} +{"time": 1788596835.788346, "direction": "response", "command": 6, "message": 72, "status": "0x0"} +{"time": 1788596835.788512, "direction": "request", "command": 5, "message": 73} +{"time": 1788596835.788519, "direction": "request", "command": 16, "message": 74} +{"time": 1788596835.78955, "direction": "response", "command": 5, "message": 73, "status": "0x0"} +{"time": 1788596835.789558, "direction": "response", "command": 16, "message": 74, "status": "0x0"} +{"time": 1788596835.7897558, "direction": "request", "command": 5, "message": 106} +{"time": 1788596835.7897768, "direction": "request", "command": 8, "message": 107, "length": 64, "offset": 0} +{"time": 1788596835.789788, "direction": "request", "command": 6, "message": 108} +{"time": 1788596835.790401, "direction": "response", "command": 5, "message": 106, "status": "0xc0000034"} +{"time": 1788596835.7904131, "direction": "response", "command": 8, "message": 107, "status": "0xc0000034"} +{"time": 1788596835.790421, "direction": "response", "command": 6, "message": 108, "status": "0xc0000034"} +{"time": 1788596835.790595, "direction": "request", "command": 5, "message": 109} +{"time": 1788596835.790604, "direction": "request", "command": 9, "message": 110, "length": 11, "offset": 0} +{"time": 1788596835.790611, "direction": "request", "command": 17, "message": 111} +{"time": 1788596835.790617, "direction": "request", "command": 6, "message": 112} +{"time": 1788596835.791643, "direction": "response", "command": 5, "message": 109, "status": "0x0"} +{"time": 1788596835.7916539, "direction": "response", "command": 9, "message": 110, "status": "0x0"} +{"time": 1788596835.79166, "direction": "response", "command": 17, "message": 111, "status": "0x0"} +{"time": 1788596835.791666, "direction": "response", "command": 6, "message": 112, "status": "0x0"} +{"time": 1788596835.791858, "direction": "request", "command": 5, "message": 113} +{"time": 1788596835.7918668, "direction": "request", "command": 8, "message": 114, "length": 64, "offset": 0} +{"time": 1788596835.791874, "direction": "request", "command": 6, "message": 115} +{"time": 1788596835.7926972, "direction": "response", "command": 5, "message": 113, "status": "0x0"} +{"time": 1788596835.792707, "direction": "response", "command": 8, "message": 114, "status": "0x0"} +{"time": 1788596835.792713, "direction": "response", "command": 6, "message": 115, "status": "0x0"} +{"time": 1788596835.792902, "direction": "request", "command": 5, "message": 116} +{"time": 1788596835.79291, "direction": "request", "command": 8, "message": 117, "length": 64, "offset": 0} +{"time": 1788596835.792916, "direction": "request", "command": 6, "message": 118} +{"time": 1788596835.793588, "direction": "response", "command": 5, "message": 116, "status": "0x0"} +{"time": 1788596835.7935958, "direction": "response", "command": 8, "message": 117, "status": "0x0"} +{"time": 1788596835.793602, "direction": "response", "command": 6, "message": 118, "status": "0x0"} +{"time": 1788596835.793757, "direction": "request", "command": 5, "message": 119} +{"time": 1788596835.793764, "direction": "request", "command": 16, "message": 120} +{"time": 1788596835.793781, "direction": "request", "command": 6, "message": 121} +{"time": 1788596835.7945652, "direction": "response", "command": 5, "message": 119, "status": "0x0"} +{"time": 1788596835.794572, "direction": "response", "command": 16, "message": 120, "status": "0x0"} +{"time": 1788596835.7945778, "direction": "response", "command": 6, "message": 121, "status": "0x0"} +{"time": 1788596835.794724, "direction": "request", "command": 17, "message": 122} +{"time": 1788596835.795155, "direction": "response", "command": 17, "message": 122, "status": "0x0"} +{"time": 1788596835.795328, "direction": "request", "command": 17, "message": 123} +{"time": 1788596835.795807, "direction": "response", "command": 17, "message": 123, "status": "0x0"} +{"time": 1788596835.795975, "direction": "request", "command": 5, "message": 124} +{"time": 1788596835.795983, "direction": "request", "command": 8, "message": 125, "length": 64, "offset": 0} +{"time": 1788596835.795989, "direction": "request", "command": 6, "message": 126} +{"time": 1788596835.796745, "direction": "response", "command": 5, "message": 124, "status": "0x0"} +{"time": 1788596835.796754, "direction": "response", "command": 8, "message": 125, "status": "0x0"} +{"time": 1788596835.79676, "direction": "response", "command": 6, "message": 126, "status": "0x0"} +{"time": 1788596835.796928, "direction": "request", "command": 5, "message": 127} +{"time": 1788596835.796937, "direction": "request", "command": 8, "message": 128, "length": 64, "offset": 0} +{"time": 1788596835.796944, "direction": "request", "command": 6, "message": 129} +{"time": 1788596835.7977002, "direction": "response", "command": 5, "message": 127, "status": "0x0"} +{"time": 1788596835.7977102, "direction": "response", "command": 8, "message": 128, "status": "0x0"} +{"time": 1788596835.797715, "direction": "response", "command": 6, "message": 129, "status": "0x0"} +{"time": 1788596835.797968, "direction": "request", "command": 9, "message": 130, "length": 1612, "offset": 0, "transactions": 1} +{"time": 1788596835.798534, "direction": "response", "command": 9, "message": 130, "status": "0x0"} +{"time": 1788596835.7987142, "direction": "request", "command": 7, "message": 131} +{"time": 1788596835.800239, "direction": "response", "command": 7, "message": 131, "status": "0x103"} +{"time": 1788596835.842924, "direction": "response", "command": 7, "message": 131, "status": "0x0"} +{"time": 1788596835.843112, "direction": "request", "command": 5, "message": 132} +{"time": 1788596835.843123, "direction": "request", "command": 14, "message": 133} +{"time": 1788596835.843132, "direction": "request", "command": 6, "message": 134} +{"time": 1788596835.844085, "direction": "response", "command": 5, "message": 132, "status": "0x0"} +{"time": 1788596835.8440971, "direction": "response", "command": 14, "message": 133, "status": "0x0"} +{"time": 1788596835.844105, "direction": "response", "command": 6, "message": 134, "status": "0x0"} +{"time": 1788596835.8443048, "direction": "request", "command": 5, "message": 135} +{"time": 1788596835.844314, "direction": "request", "command": 17, "message": 136} +{"time": 1788596835.844321, "direction": "request", "command": 6, "message": 137} +{"time": 1788596835.845024, "direction": "response", "command": 5, "message": 135, "status": "0x0"} +{"time": 1788596835.845036, "direction": "response", "command": 17, "message": 136, "status": "0x0"} +{"time": 1788596835.845043, "direction": "response", "command": 6, "message": 137, "status": "0x0"} +{"time": 1788596835.845206, "direction": "request", "command": 5, "message": 138} +{"time": 1788596835.845216, "direction": "request", "command": 8, "message": 139, "length": 64, "offset": 0} +{"time": 1788596835.845223, "direction": "request", "command": 6, "message": 140} +{"time": 1788596835.8459141, "direction": "response", "command": 5, "message": 138, "status": "0x0"} +{"time": 1788596835.8459241, "direction": "response", "command": 8, "message": 139, "status": "0x0"} +{"time": 1788596835.845932, "direction": "response", "command": 6, "message": 140, "status": "0x0"} +{"time": 1788596835.846119, "direction": "request", "command": 5, "message": 141} +{"time": 1788596835.846129, "direction": "request", "command": 8, "message": 142, "length": 64, "offset": 0} +{"time": 1788596835.846136, "direction": "request", "command": 6, "message": 143} +{"time": 1788596835.846812, "direction": "response", "command": 5, "message": 141, "status": "0x0"} +{"time": 1788596835.846823, "direction": "response", "command": 8, "message": 142, "status": "0x0"} +{"time": 1788596835.8468301, "direction": "response", "command": 6, "message": 143, "status": "0x0"} +{"time": 1788596835.8470101, "direction": "request", "command": 5, "message": 144} +{"time": 1788596835.847019, "direction": "request", "command": 8, "message": 145, "length": 64, "offset": 0} +{"time": 1788596835.8470268, "direction": "request", "command": 6, "message": 146} +{"time": 1788596835.847816, "direction": "response", "command": 5, "message": 144, "status": "0x0"} +{"time": 1788596835.847826, "direction": "response", "command": 8, "message": 145, "status": "0x0"} +{"time": 1788596835.8478332, "direction": "response", "command": 6, "message": 146, "status": "0x0"} +{"time": 1788596835.848018, "direction": "request", "command": 5, "message": 147} +{"time": 1788596835.848029, "direction": "request", "command": 14, "message": 148} +{"time": 1788596835.848036, "direction": "request", "command": 6, "message": 149} +{"time": 1788596835.848586, "direction": "response", "command": 5, "message": 147, "status": "0x0"} +{"time": 1788596835.848597, "direction": "response", "command": 14, "message": 148, "status": "0xc000000f"} +{"time": 1788596835.848605, "direction": "response", "command": 6, "message": 149, "status": "0x0"} +{"time": 1788596835.848784, "direction": "request", "command": 5, "message": 150} +{"time": 1788596835.848795, "direction": "request", "command": 14, "message": 151} +{"time": 1788596835.848802, "direction": "request", "command": 6, "message": 152} +{"time": 1788596835.849588, "direction": "response", "command": 5, "message": 150, "status": "0x0"} +{"time": 1788596835.8496, "direction": "response", "command": 14, "message": 151, "status": "0x0"} +{"time": 1788596835.849608, "direction": "response", "command": 6, "message": 152, "status": "0x0"} +{"time": 1788596835.849776, "direction": "request", "command": 5, "message": 153} +{"time": 1788596835.849785, "direction": "request", "command": 14, "message": 154} +{"time": 1788596835.849792, "direction": "request", "command": 6, "message": 155} +{"time": 1788596835.85037, "direction": "response", "command": 5, "message": 153, "status": "0x0"} +{"time": 1788596835.850379, "direction": "response", "command": 14, "message": 154, "status": "0xc000000f"} +{"time": 1788596835.8503869, "direction": "response", "command": 6, "message": 155, "status": "0x0"} +{"time": 1788596835.850662, "direction": "request", "command": 5, "message": 156} +{"time": 1788596835.8506749, "direction": "request", "command": 14, "message": 157} +{"time": 1788596835.850682, "direction": "request", "command": 6, "message": 158} +{"time": 1788596835.851308, "direction": "response", "command": 5, "message": 156, "status": "0x0"} +{"time": 1788596835.8513181, "direction": "response", "command": 14, "message": 157, "status": "0xc000000f"} +{"time": 1788596835.851326, "direction": "response", "command": 6, "message": 158, "status": "0x0"} +{"time": 1788596835.8515341, "direction": "request", "command": 5, "message": 159} +{"time": 1788596835.851543, "direction": "request", "command": 16, "message": 160} +{"time": 1788596835.85236, "direction": "response", "command": 5, "message": 159, "status": "0x0"} +{"time": 1788596835.85237, "direction": "response", "command": 16, "message": 160, "status": "0x0"} +{"time": 1788596835.852559, "direction": "request", "command": 5, "message": 192} +{"time": 1788596835.8525681, "direction": "request", "command": 8, "message": 193, "length": 64, "offset": 0} +{"time": 1788596835.852576, "direction": "request", "command": 6, "message": 194} +{"time": 1788596835.85332, "direction": "response", "command": 5, "message": 192, "status": "0xc0000034"} +{"time": 1788596835.853336, "direction": "response", "command": 8, "message": 193, "status": "0xc0000034"} +{"time": 1788596835.853344, "direction": "response", "command": 6, "message": 194, "status": "0xc0000034"} +{"time": 1788596835.853515, "direction": "request", "command": 5, "message": 195} +{"time": 1788596835.853525, "direction": "request", "command": 9, "message": 196, "length": 11, "offset": 0} +{"time": 1788596835.8535318, "direction": "request", "command": 17, "message": 197} +{"time": 1788596835.853539, "direction": "request", "command": 6, "message": 198} +{"time": 1788596835.854403, "direction": "response", "command": 5, "message": 195, "status": "0x0"} +{"time": 1788596835.8544152, "direction": "response", "command": 9, "message": 196, "status": "0x0"} +{"time": 1788596835.854423, "direction": "response", "command": 17, "message": 197, "status": "0x0"} +{"time": 1788596835.854433, "direction": "response", "command": 6, "message": 198, "status": "0x0"} +{"time": 1788596835.854603, "direction": "request", "command": 5, "message": 199} +{"time": 1788596835.8546119, "direction": "request", "command": 8, "message": 200, "length": 64, "offset": 0} +{"time": 1788596835.8546188, "direction": "request", "command": 6, "message": 201} +{"time": 1788596835.855345, "direction": "response", "command": 5, "message": 199, "status": "0x0"} +{"time": 1788596835.855357, "direction": "response", "command": 8, "message": 200, "status": "0x0"} +{"time": 1788596835.855364, "direction": "response", "command": 6, "message": 201, "status": "0x0"} +{"time": 1788596835.855548, "direction": "request", "command": 5, "message": 202} +{"time": 1788596835.8555572, "direction": "request", "command": 8, "message": 203, "length": 64, "offset": 0} +{"time": 1788596835.855565, "direction": "request", "command": 6, "message": 204} +{"time": 1788596835.856308, "direction": "response", "command": 5, "message": 202, "status": "0x0"} +{"time": 1788596835.856317, "direction": "response", "command": 8, "message": 203, "status": "0x0"} +{"time": 1788596835.8563251, "direction": "response", "command": 6, "message": 204, "status": "0x0"} +{"time": 1788596835.856492, "direction": "request", "command": 5, "message": 205} +{"time": 1788596835.856501, "direction": "request", "command": 16, "message": 206} +{"time": 1788596835.856508, "direction": "request", "command": 6, "message": 207} +{"time": 1788596835.857175, "direction": "response", "command": 5, "message": 205, "status": "0x0"} +{"time": 1788596835.8571851, "direction": "response", "command": 16, "message": 206, "status": "0x0"} +{"time": 1788596835.857192, "direction": "response", "command": 6, "message": 207, "status": "0x0"} +{"time": 1788596835.857345, "direction": "request", "command": 17, "message": 208} +{"time": 1788596835.857771, "direction": "response", "command": 17, "message": 208, "status": "0x0"} +{"time": 1788596835.857928, "direction": "request", "command": 17, "message": 209} +{"time": 1788596835.858361, "direction": "response", "command": 17, "message": 209, "status": "0x0"} +{"time": 1788596835.858523, "direction": "request", "command": 5, "message": 210} +{"time": 1788596835.8585322, "direction": "request", "command": 8, "message": 211, "length": 64, "offset": 0} +{"time": 1788596835.85854, "direction": "request", "command": 6, "message": 212} +{"time": 1788596835.859335, "direction": "response", "command": 5, "message": 210, "status": "0x0"} +{"time": 1788596835.859345, "direction": "response", "command": 8, "message": 211, "status": "0x0"} +{"time": 1788596835.859352, "direction": "response", "command": 6, "message": 212, "status": "0x0"} +{"time": 1788596835.859532, "direction": "request", "command": 5, "message": 213} +{"time": 1788596835.859541, "direction": "request", "command": 8, "message": 214, "length": 64, "offset": 0} +{"time": 1788596835.85955, "direction": "request", "command": 6, "message": 215} +{"time": 1788596835.860306, "direction": "response", "command": 5, "message": 213, "status": "0x0"} +{"time": 1788596835.860318, "direction": "response", "command": 8, "message": 214, "status": "0x0"} +{"time": 1788596835.860333, "direction": "response", "command": 6, "message": 215, "status": "0x0"} +{"time": 1788596835.8605492, "direction": "request", "command": 9, "message": 216, "length": 3348, "offset": 0, "transactions": 1} +{"time": 1788596835.861093, "direction": "response", "command": 9, "message": 216, "status": "0x0"} +{"time": 1788596835.8612711, "direction": "request", "command": 7, "message": 217} +{"time": 1788596835.862753, "direction": "response", "command": 7, "message": 217, "status": "0x103"} +{"time": 1788596835.8748028, "direction": "response", "command": 7, "message": 217, "status": "0x0"} +{"time": 1788596835.875026, "direction": "request", "command": 5, "message": 218} +{"time": 1788596835.8750432, "direction": "request", "command": 14, "message": 219} +{"time": 1788596835.8750541, "direction": "request", "command": 6, "message": 220} +{"time": 1788596835.875881, "direction": "response", "command": 5, "message": 218, "status": "0x0"} +{"time": 1788596835.875894, "direction": "response", "command": 14, "message": 219, "status": "0x0"} +{"time": 1788596835.875904, "direction": "response", "command": 6, "message": 220, "status": "0x0"} +{"time": 1788596835.876116, "direction": "request", "command": 5, "message": 221} +{"time": 1788596835.876127, "direction": "request", "command": 17, "message": 222} +{"time": 1788596835.8761349, "direction": "request", "command": 6, "message": 223} +{"time": 1788596835.876915, "direction": "response", "command": 5, "message": 221, "status": "0x0"} +{"time": 1788596835.876927, "direction": "response", "command": 17, "message": 222, "status": "0x0"} +{"time": 1788596835.876935, "direction": "response", "command": 6, "message": 223, "status": "0x0"} +{"time": 1788596835.877117, "direction": "request", "command": 5, "message": 224} +{"time": 1788596835.877128, "direction": "request", "command": 8, "message": 225, "length": 64, "offset": 0} +{"time": 1788596835.877137, "direction": "request", "command": 6, "message": 226} +{"time": 1788596835.877907, "direction": "response", "command": 5, "message": 224, "status": "0x0"} +{"time": 1788596835.877919, "direction": "response", "command": 8, "message": 225, "status": "0x0"} +{"time": 1788596835.877928, "direction": "response", "command": 6, "message": 226, "status": "0x0"} +{"time": 1788596835.878123, "direction": "request", "command": 5, "message": 227} +{"time": 1788596835.878135, "direction": "request", "command": 8, "message": 228, "length": 64, "offset": 0} +{"time": 1788596835.878143, "direction": "request", "command": 6, "message": 229} +{"time": 1788596835.878859, "direction": "response", "command": 5, "message": 227, "status": "0x0"} +{"time": 1788596835.8788722, "direction": "response", "command": 8, "message": 228, "status": "0x0"} +{"time": 1788596835.87888, "direction": "response", "command": 6, "message": 229, "status": "0x0"} +{"time": 1788596835.879061, "direction": "request", "command": 5, "message": 230} +{"time": 1788596835.879071, "direction": "request", "command": 8, "message": 231, "length": 64, "offset": 0} +{"time": 1788596835.8790789, "direction": "request", "command": 6, "message": 232} +{"time": 1788596835.8798451, "direction": "response", "command": 5, "message": 230, "status": "0x0"} +{"time": 1788596835.879874, "direction": "response", "command": 8, "message": 231, "status": "0x0"} +{"time": 1788596835.879889, "direction": "response", "command": 6, "message": 232, "status": "0x0"} +{"time": 1788596835.88011, "direction": "request", "command": 5, "message": 233} +{"time": 1788596835.880125, "direction": "request", "command": 17, "message": 234} +{"time": 1788596835.8801348, "direction": "request", "command": 6, "message": 235} +{"time": 1788596835.880755, "direction": "response", "command": 5, "message": 233, "status": "0x0"} +{"time": 1788596835.880768, "direction": "response", "command": 17, "message": 234, "status": "0x0"} +{"time": 1788596835.880777, "direction": "response", "command": 6, "message": 235, "status": "0x0"} +{"time": 1788596835.880948, "direction": "request", "command": 5, "message": 236} +{"time": 1788596835.880959, "direction": "request", "command": 8, "message": 237, "length": 64, "offset": 0} +{"time": 1788596835.88098, "direction": "request", "command": 6, "message": 238} +{"time": 1788596835.881666, "direction": "response", "command": 5, "message": 236, "status": "0x0"} +{"time": 1788596835.8816772, "direction": "response", "command": 8, "message": 237, "status": "0x0"} +{"time": 1788596835.881686, "direction": "response", "command": 6, "message": 238, "status": "0x0"} +{"time": 1788596835.8818848, "direction": "request", "command": 5, "message": 239} +{"time": 1788596835.881896, "direction": "request", "command": 8, "message": 240, "length": 64, "offset": 0} +{"time": 1788596835.8819048, "direction": "request", "command": 6, "message": 241} +{"time": 1788596835.882564, "direction": "response", "command": 5, "message": 239, "status": "0x0"} +{"time": 1788596835.882578, "direction": "response", "command": 8, "message": 240, "status": "0x0"} +{"time": 1788596835.882588, "direction": "response", "command": 6, "message": 241, "status": "0x0"} +{"time": 1788596835.882774, "direction": "request", "command": 5, "message": 242} +{"time": 1788596835.882785, "direction": "request", "command": 17, "message": 243} +{"time": 1788596835.882794, "direction": "request", "command": 6, "message": 244} +{"time": 1788596835.883372, "direction": "response", "command": 5, "message": 242, "status": "0x0"} +{"time": 1788596835.883383, "direction": "response", "command": 17, "message": 243, "status": "0x0"} +{"time": 1788596835.883391, "direction": "response", "command": 6, "message": 244, "status": "0x0"} +{"time": 1788596835.8835561, "direction": "request", "command": 5, "message": 245} +{"time": 1788596835.8835661, "direction": "request", "command": 8, "message": 246, "length": 64, "offset": 0} +{"time": 1788596835.883575, "direction": "request", "command": 6, "message": 247} +{"time": 1788596835.884284, "direction": "response", "command": 5, "message": 245, "status": "0x0"} +{"time": 1788596835.884296, "direction": "response", "command": 8, "message": 246, "status": "0x0"} +{"time": 1788596835.884305, "direction": "response", "command": 6, "message": 247, "status": "0x0"} +{"time": 1788596835.8950741, "control": {"mode": "up", "cut": 7, "occurrence": 1}} +{"time": 1788596836.267212, "direction": "request", "command": 5, "message": 248} +{"time": 1788596836.2673762, "direction": "request", "command": 14, "message": 249} +{"time": 1788596836.2674098, "direction": "request", "command": 6, "message": 250} +{"time": 1788596836.268703, "direction": "response", "command": 5, "message": 248, "status": "0x0"} +{"time": 1788596836.2687821, "direction": "response", "command": 14, "message": 249, "status": "0x0"} +{"time": 1788596836.2688031, "direction": "response", "command": 6, "message": 250, "status": "0x0"} +{"time": 1788596840.815815, "direction": "request", "command": 15, "message": 251} +{"time": 1788596840.81712, "direction": "response", "command": 15, "message": 251, "status": "0xc0000128"} +{"time": 1788596852.0828722, "direction": "request", "command": 5, "message": 252} +{"time": 1788596852.082936, "direction": "request", "command": 14, "message": 253} +{"time": 1788596852.082953, "direction": "request", "command": 6, "message": 254} +{"time": 1788596852.08429, "direction": "response", "command": 5, "message": 252, "status": "0x0"} +{"time": 1788596852.084308, "direction": "response", "command": 14, "message": 253, "status": "0x0"} +{"time": 1788596852.084322, "direction": "response", "command": 6, "message": 254, "status": "0x0"} +{"time": 1788596852.084469, "direction": "request", "command": 5, "message": 255} +{"time": 1788596852.0844831, "direction": "request", "command": 14, "message": 256} +{"time": 1788596852.0844932, "direction": "request", "command": 6, "message": 257} +{"time": 1788596852.085145, "direction": "response", "command": 5, "message": 255, "status": "0x0"} +{"time": 1788596852.0851588, "direction": "response", "command": 14, "message": 256, "status": "0x0"} +{"time": 1788596852.08517, "direction": "response", "command": 6, "message": 257, "status": "0x0"} +{"time": 1788596852.0853472, "direction": "request", "command": 6, "message": 258} +{"time": 1788596852.085727, "direction": "response", "command": 6, "message": 258, "status": "0x0"} +{"time": 1788596852.085851, "direction": "request", "command": 5, "message": 259} +{"time": 1788596852.086438, "direction": "response", "command": 5, "message": 259, "status": "0x0"} +{"time": 1788596852.086581, "direction": "request", "command": 16, "message": 260} +{"time": 1788596852.0869691, "direction": "response", "command": 16, "message": 260, "status": "0x0"} +{"time": 1788596852.087104, "direction": "request", "command": 5, "message": 261} +{"time": 1788596852.08762, "direction": "response", "command": 5, "message": 261, "status": "0x0"} +{"time": 1788596852.087734, "direction": "request", "command": 10, "message": 262, "locks": [[0, 18446744073709551615, 18]]} +{"time": 1788596852.088133, "direction": "response", "command": 10, "message": 262, "status": "0x0"} +{"time": 1788596852.088268, "direction": "request", "command": 10, "message": 263, "locks": [[0, 18446744073709551615, 4]]} +{"time": 1788596852.088591, "direction": "response", "command": 10, "message": 263, "status": "0x0"} +{"time": 1788596852.088691, "direction": "request", "command": 6, "message": 264} +{"time": 1788596852.0890172, "direction": "response", "command": 6, "message": 264, "status": "0x0"} +{"time": 1788596852.0895748, "direction": "request", "command": 6, "message": 265} +{"time": 1788596852.089941, "direction": "response", "command": 6, "message": 265, "status": "0x0"} +{"time": 1788596852.090056, "direction": "request", "command": 5, "message": 266} +{"time": 1788596852.090595, "direction": "response", "command": 5, "message": 266, "status": "0x0"} +{"time": 1788596852.0907068, "direction": "request", "command": 5, "message": 267} +{"time": 1788596852.0907168, "direction": "request", "command": 8, "message": 268, "length": 64, "offset": 0} +{"time": 1788596852.0907252, "direction": "request", "command": 6, "message": 269} +{"time": 1788596852.091358, "direction": "response", "command": 5, "message": 267, "status": "0x0"} +{"time": 1788596852.091367, "direction": "response", "command": 8, "message": 268, "status": "0x0"} +{"time": 1788596852.0913742, "direction": "response", "command": 6, "message": 269, "status": "0x0"} +{"time": 1788596852.0914922, "direction": "request", "command": 5, "message": 270} +{"time": 1788596852.0919738, "direction": "response", "command": 5, "message": 270, "status": "0x0"} +{"time": 1788596852.092103, "direction": "request", "command": 10, "message": 271, "locks": [[0, 18446744073709551615, 18]]} +{"time": 1788596852.092434, "direction": "response", "command": 10, "message": 271, "status": "0x0"} +{"time": 1788596852.092918, "direction": "request", "command": 9, "message": 272, "length": 4784, "offset": 0, "transactions": 1} +{"time": 1788596852.093438, "direction": "response", "command": 9, "message": 272, "status": "0x0"} +{"time": 1788596852.093545, "direction": "request", "command": 7, "message": 273} +{"time": 1788596852.095024, "direction": "response", "command": 7, "message": 273, "status": "0x103"} +{"time": 1788596852.102499, "direction": "response", "command": 7, "message": 273, "status": "0x0"} +{"time": 1788596852.10252, "cut": {"direction": "response", "command": 7, "message": 273, "status": "0x0"}} +{"time": 1788596990.199491, "control": {"mode": "up", "run": 2}} +{"time": 1788596990.200674, "direction": "request", "command": 0, "message": 0} +{"time": 1788596990.2034822, "direction": "response", "command": 0, "message": 0, "status": "0x0"} +{"time": 1788596990.230218, "direction": "request", "command": 1, "message": 1} +{"time": 1788596990.2309299, "direction": "response", "command": 1, "message": 1, "status": "0xc0000016"} +{"time": 1788596990.231947, "direction": "request", "command": 1, "message": 2} +{"time": 1788596990.2345312, "direction": "response", "command": 1, "message": 2, "status": "0x0"} +{"time": 1788596990.234638, "direction": "request", "command": 3, "message": 3} +{"time": 1788596990.250109, "direction": "response", "command": 3, "message": 3, "status": "0x0"} +{"time": 1788596990.25027, "direction": "request", "command": 5, "message": 4} +{"time": 1788596990.250284, "direction": "request", "command": 6, "message": 5} +{"time": 1788596990.250889, "direction": "response", "command": 5, "message": 4, "status": "0x0"} +{"time": 1788596990.250901, "direction": "response", "command": 6, "message": 5, "status": "0x0"} +{"time": 1788596990.251123, "direction": "request", "command": 5, "message": 6} +{"time": 1788596990.2515771, "direction": "response", "command": 5, "message": 6, "status": "0xc0000034"} +{"time": 1788596990.2516558, "direction": "request", "command": 5, "message": 7} +{"time": 1788596990.25204, "direction": "response", "command": 5, "message": 7, "status": "0xc0000034"} +{"time": 1788596990.8390532, "direction": "request", "command": 15, "message": 8} +{"time": 1788596990.839582, "direction": "response", "command": 15, "message": 8, "status": "0xc0000128"} +{"time": 1788597097.911454, "control": {"mode": "up", "cut": 7, "occurrence": 5}} +{"time": 1788597097.9196749, "direction": "request", "command": 5, "message": 9} +{"time": 1788597097.9197, "direction": "request", "command": 16, "message": 10} +{"time": 1788597097.91971, "direction": "request", "command": 6, "message": 11} +{"time": 1788597097.92048, "direction": "response", "command": 5, "message": 9, "status": "0x0"} +{"time": 1788597097.9204931, "direction": "response", "command": 16, "message": 10, "status": "0x0"} +{"time": 1788597097.920501, "direction": "response", "command": 6, "message": 11, "status": "0x0"} +{"time": 1788597097.920633, "direction": "request", "command": 5, "message": 12} +{"time": 1788597097.9206421, "direction": "request", "command": 14, "message": 13} +{"time": 1788597097.92065, "direction": "request", "command": 6, "message": 14} +{"time": 1788597097.9215128, "direction": "response", "command": 5, "message": 12, "status": "0x0"} +{"time": 1788597097.9215229, "direction": "response", "command": 14, "message": 13, "status": "0x0"} +{"time": 1788597097.92153, "direction": "response", "command": 6, "message": 14, "status": "0x0"} +{"time": 1788597097.921654, "direction": "request", "command": 5, "message": 15} +{"time": 1788597097.921663, "direction": "request", "command": 14, "message": 16} +{"time": 1788597097.921669, "direction": "request", "command": 6, "message": 17} +{"time": 1788597097.9223628, "direction": "response", "command": 5, "message": 15, "status": "0x0"} +{"time": 1788597097.922373, "direction": "response", "command": 14, "message": 16, "status": "0x0"} +{"time": 1788597097.922379, "direction": "response", "command": 6, "message": 17, "status": "0x0"} +{"time": 1788597097.922508, "direction": "request", "command": 5, "message": 18} +{"time": 1788597097.922517, "direction": "request", "command": 14, "message": 19} +{"time": 1788597097.9225228, "direction": "request", "command": 6, "message": 20} +{"time": 1788597097.923136, "direction": "response", "command": 5, "message": 18, "status": "0x0"} +{"time": 1788597097.923145, "direction": "response", "command": 14, "message": 19, "status": "0x0"} +{"time": 1788597097.923152, "direction": "response", "command": 6, "message": 20, "status": "0x0"} +{"time": 1788597097.923296, "direction": "request", "command": 5, "message": 21} +{"time": 1788597097.9240162, "direction": "response", "command": 5, "message": 21, "status": "0x0"} +{"time": 1788597097.924135, "direction": "request", "command": 16, "message": 22} +{"time": 1788597097.924494, "direction": "response", "command": 16, "message": 22, "status": "0x0"} +{"time": 1788597097.924614, "direction": "request", "command": 5, "message": 23} +{"time": 1788597097.925426, "direction": "response", "command": 5, "message": 23, "status": "0x0"} +{"time": 1788597097.9255629, "direction": "request", "command": 10, "message": 24, "locks": [[0, 18446744073709551615, 18]]} +{"time": 1788597097.926087, "direction": "response", "command": 10, "message": 24, "status": "0x0"} +{"time": 1788597097.926219, "direction": "request", "command": 16, "message": 25} +{"time": 1788597097.9266508, "direction": "response", "command": 16, "message": 25, "status": "0x0"} +{"time": 1788597097.926816, "direction": "request", "command": 8, "message": 26, "length": 3348, "offset": 0} +{"time": 1788597097.927356, "direction": "response", "command": 8, "message": 26, "status": "0x0"} +{"time": 1788597097.927493, "direction": "request", "command": 10, "message": 27, "locks": [[0, 18446744073709551615, 4]]} +{"time": 1788597097.927831, "direction": "response", "command": 10, "message": 27, "status": "0x0"} +{"time": 1788597097.9279401, "direction": "request", "command": 6, "message": 28} +{"time": 1788597097.9282901, "direction": "response", "command": 6, "message": 28, "status": "0x0"} +{"time": 1788597097.9286342, "direction": "request", "command": 6, "message": 29} +{"time": 1788597097.92904, "direction": "response", "command": 6, "message": 29, "status": "0x0"} +{"time": 1788597097.929172, "direction": "request", "command": 5, "message": 30} +{"time": 1788597097.929704, "direction": "response", "command": 5, "message": 30, "status": "0x0"} +{"time": 1788597097.9298282, "direction": "request", "command": 5, "message": 31} +{"time": 1788597097.929837, "direction": "request", "command": 8, "message": 32, "length": 64, "offset": 0} +{"time": 1788597097.929845, "direction": "request", "command": 6, "message": 33} +{"time": 1788597097.930536, "direction": "response", "command": 5, "message": 31, "status": "0x0"} +{"time": 1788597097.9305449, "direction": "response", "command": 8, "message": 32, "status": "0x0"} +{"time": 1788597097.930551, "direction": "response", "command": 6, "message": 33, "status": "0x0"} +{"time": 1788597097.9306722, "direction": "request", "command": 5, "message": 34} +{"time": 1788597097.931146, "direction": "response", "command": 5, "message": 34, "status": "0x0"} +{"time": 1788597097.931262, "direction": "request", "command": 10, "message": 35, "locks": [[0, 18446744073709551615, 18]]} +{"time": 1788597097.931602, "direction": "response", "command": 10, "message": 35, "status": "0x0"} +{"time": 1788597097.932076, "direction": "request", "command": 9, "message": 36, "length": 4800, "offset": 0, "transactions": 1} +{"time": 1788597097.9325771, "direction": "response", "command": 9, "message": 36, "status": "0x0"} +{"time": 1788597097.932696, "direction": "request", "command": 7, "message": 37} +{"time": 1788597097.934089, "direction": "response", "command": 7, "message": 37, "status": "0x103"} +{"time": 1788597097.945364, "direction": "response", "command": 7, "message": 37, "status": "0x0"} +{"time": 1788597097.9455411, "direction": "request", "command": 7, "message": 38} +{"time": 1788597097.946035, "direction": "response", "command": 7, "message": 38, "status": "0x0"} +{"time": 1788597097.946199, "direction": "request", "command": 9, "message": 39, "length": 4800, "offset": 0, "transactions": 1} +{"time": 1788597097.9467032, "direction": "response", "command": 9, "message": 39, "status": "0x0"} +{"time": 1788597097.946827, "direction": "request", "command": 7, "message": 40} +{"time": 1788597097.948259, "direction": "response", "command": 7, "message": 40, "status": "0x103"} +{"time": 1788597097.9586291, "direction": "response", "command": 7, "message": 40, "status": "0x0"} +{"time": 1788597097.95882, "direction": "request", "command": 7, "message": 41} +{"time": 1788597097.959311, "direction": "response", "command": 7, "message": 41, "status": "0x0"} +{"time": 1788597097.959487, "direction": "request", "command": 9, "message": 42, "length": 4800, "offset": 0, "transactions": 2} +{"time": 1788597097.96, "direction": "response", "command": 9, "message": 42, "status": "0x0"} +{"time": 1788597097.960138, "direction": "request", "command": 7, "message": 43} +{"time": 1788597097.961529, "direction": "response", "command": 7, "message": 43, "status": "0x103"} +{"time": 1788597097.969268, "direction": "response", "command": 7, "message": 43, "status": "0x0"} +{"time": 1788597097.969293, "cut": {"direction": "response", "command": 7, "message": 43, "status": "0x0"}} +{"time": 1788597112.334699, "control": {"mode": "up", "run": 3}} +{"time": 1788597112.3361301, "direction": "request", "command": 0, "message": 0} +{"time": 1788597112.339016, "direction": "response", "command": 0, "message": 0, "status": "0x0"} +{"time": 1788597112.356815, "direction": "request", "command": 1, "message": 1} +{"time": 1788597112.357676, "direction": "response", "command": 1, "message": 1, "status": "0xc0000016"} +{"time": 1788597112.358426, "direction": "request", "command": 1, "message": 2} +{"time": 1788597112.360981, "direction": "response", "command": 1, "message": 2, "status": "0x0"} +{"time": 1788597112.361074, "direction": "request", "command": 3, "message": 3} +{"time": 1788597112.376659, "direction": "response", "command": 3, "message": 3, "status": "0x0"} +{"time": 1788597112.376792, "direction": "request", "command": 5, "message": 4} +{"time": 1788597112.376807, "direction": "request", "command": 6, "message": 5} +{"time": 1788597112.37741, "direction": "response", "command": 5, "message": 4, "status": "0x0"} +{"time": 1788597112.377426, "direction": "response", "command": 6, "message": 5, "status": "0x0"} +{"time": 1788597112.37765, "direction": "request", "command": 5, "message": 6} +{"time": 1788597112.378347, "direction": "response", "command": 5, "message": 6, "status": "0xc0000034"} +{"time": 1788597112.591533, "direction": "request", "command": 5, "message": 7} +{"time": 1788597112.591583, "direction": "request", "command": 14, "message": 8} +{"time": 1788597112.5916002, "direction": "request", "command": 6, "message": 9} +{"time": 1788597112.592694, "direction": "response", "command": 5, "message": 7, "status": "0x0"} +{"time": 1788597112.5927181, "direction": "response", "command": 14, "message": 8, "status": "0x0"} +{"time": 1788597112.5927281, "direction": "response", "command": 6, "message": 9, "status": "0x0"} +{"time": 1788597146.110676, "control": {"mode": "up", "cut": 7, "occurrence": 7}} +{"time": 1788597146.118313, "direction": "request", "command": 5, "message": 10} +{"time": 1788597146.118352, "direction": "request", "command": 16, "message": 11} +{"time": 1788597146.118363, "direction": "request", "command": 6, "message": 12} +{"time": 1788597146.1191502, "direction": "response", "command": 5, "message": 10, "status": "0x0"} +{"time": 1788597146.119166, "direction": "response", "command": 16, "message": 11, "status": "0x0"} +{"time": 1788597146.119178, "direction": "response", "command": 6, "message": 12, "status": "0x0"} +{"time": 1788597146.119358, "direction": "request", "command": 5, "message": 13} +{"time": 1788597146.119371, "direction": "request", "command": 14, "message": 14} +{"time": 1788597146.1193779, "direction": "request", "command": 6, "message": 15} +{"time": 1788597146.120053, "direction": "response", "command": 5, "message": 13, "status": "0x0"} +{"time": 1788597146.120063, "direction": "response", "command": 14, "message": 14, "status": "0x0"} +{"time": 1788597146.120071, "direction": "response", "command": 6, "message": 15, "status": "0x0"} +{"time": 1788597146.120223, "direction": "request", "command": 5, "message": 16} +{"time": 1788597146.1202319, "direction": "request", "command": 14, "message": 17} +{"time": 1788597146.120239, "direction": "request", "command": 6, "message": 18} +{"time": 1788597146.12096, "direction": "response", "command": 5, "message": 16, "status": "0x0"} +{"time": 1788597146.120969, "direction": "response", "command": 14, "message": 17, "status": "0x0"} +{"time": 1788597146.120976, "direction": "response", "command": 6, "message": 18, "status": "0x0"} +{"time": 1788597146.121137, "direction": "request", "command": 5, "message": 19} +{"time": 1788597146.1211462, "direction": "request", "command": 14, "message": 20} +{"time": 1788597146.121152, "direction": "request", "command": 6, "message": 21} +{"time": 1788597146.121918, "direction": "response", "command": 5, "message": 19, "status": "0x0"} +{"time": 1788597146.121928, "direction": "response", "command": 14, "message": 20, "status": "0x0"} +{"time": 1788597146.1219351, "direction": "response", "command": 6, "message": 21, "status": "0x0"} +{"time": 1788597146.122135, "direction": "request", "command": 5, "message": 22} +{"time": 1788597146.1231859, "direction": "response", "command": 5, "message": 22, "status": "0x0"} +{"time": 1788597146.123358, "direction": "request", "command": 16, "message": 23} +{"time": 1788597146.1238039, "direction": "response", "command": 16, "message": 23, "status": "0x0"} +{"time": 1788597146.123966, "direction": "request", "command": 5, "message": 24} +{"time": 1788597146.124553, "direction": "response", "command": 5, "message": 24, "status": "0x0"} +{"time": 1788597146.124694, "direction": "request", "command": 10, "message": 25, "locks": [[0, 18446744073709551615, 18]]} +{"time": 1788597146.125215, "direction": "response", "command": 10, "message": 25, "status": "0x0"} +{"time": 1788597146.125376, "direction": "request", "command": 16, "message": 26} +{"time": 1788597146.125888, "direction": "response", "command": 16, "message": 26, "status": "0x0"} +{"time": 1788597146.1261241, "direction": "request", "command": 8, "message": 27, "length": 111640, "offset": 0} +{"time": 1788597146.129089, "direction": "response", "command": 8, "message": 27, "status": "0x0"} +{"time": 1788597146.129372, "direction": "request", "command": 10, "message": 29, "locks": [[0, 18446744073709551615, 4]]} +{"time": 1788597146.12983, "direction": "response", "command": 10, "message": 29, "status": "0x0"} +{"time": 1788597146.129972, "direction": "request", "command": 6, "message": 30} +{"time": 1788597146.130374, "direction": "response", "command": 6, "message": 30, "status": "0x0"} +{"time": 1788597146.1339068, "direction": "request", "command": 6, "message": 31} +{"time": 1788597146.134444, "direction": "response", "command": 6, "message": 31, "status": "0x0"} +{"time": 1788597146.134611, "direction": "request", "command": 5, "message": 32} +{"time": 1788597146.1352088, "direction": "response", "command": 5, "message": 32, "status": "0x0"} +{"time": 1788597146.1353679, "direction": "request", "command": 5, "message": 33} +{"time": 1788597146.135377, "direction": "request", "command": 8, "message": 34, "length": 64, "offset": 0} +{"time": 1788597146.135385, "direction": "request", "command": 6, "message": 35} +{"time": 1788597146.136214, "direction": "response", "command": 5, "message": 33, "status": "0x0"} +{"time": 1788597146.136223, "direction": "response", "command": 8, "message": 34, "status": "0x0"} +{"time": 1788597146.136228, "direction": "response", "command": 6, "message": 35, "status": "0x0"} +{"time": 1788597146.136398, "direction": "request", "command": 5, "message": 36} +{"time": 1788597146.137014, "direction": "response", "command": 5, "message": 36, "status": "0x0"} +{"time": 1788597146.137166, "direction": "request", "command": 10, "message": 37, "locks": [[0, 18446744073709551615, 18]]} +{"time": 1788597146.137558, "direction": "response", "command": 10, "message": 37, "status": "0x0"} +{"time": 1788597146.14624, "direction": "request", "command": 9, "message": 38, "length": 15792, "offset": 98304} +{"time": 1788597146.1470678, "direction": "response", "command": 9, "message": 38, "status": "0x0"} +{"time": 1788597146.1472378, "direction": "request", "command": 7, "message": 39} +{"time": 1788597146.1487622, "direction": "response", "command": 7, "message": 39, "status": "0x103"} +{"time": 1788597146.171916, "direction": "response", "command": 7, "message": 39, "status": "0x0"} +{"time": 1788597146.1721148, "direction": "request", "command": 7, "message": 40} +{"time": 1788597146.172704, "direction": "response", "command": 7, "message": 40, "status": "0x0"} +{"time": 1788597146.172941, "direction": "request", "command": 9, "message": 41, "length": 16384, "offset": 0, "transactions": 255} +{"time": 1788597146.1737149, "direction": "response", "command": 9, "message": 41, "status": "0x0"} +{"time": 1788597146.17388, "direction": "request", "command": 7, "message": 42} +{"time": 1788597146.1753678, "direction": "response", "command": 7, "message": 42, "status": "0x103"} +{"time": 1788597146.1873732, "direction": "response", "command": 7, "message": 42, "status": "0x0"} +{"time": 1788597146.187534, "direction": "request", "command": 7, "message": 43} +{"time": 1788597146.1880891, "direction": "response", "command": 7, "message": 43, "status": "0x0"} +{"time": 1788597146.1883252, "direction": "request", "command": 9, "message": 44, "length": 16384, "offset": 0, "transactions": 511} +{"time": 1788597146.1891148, "direction": "response", "command": 9, "message": 44, "status": "0x0"} +{"time": 1788597146.189273, "direction": "request", "command": 7, "message": 45} +{"time": 1788597146.190787, "direction": "response", "command": 7, "message": 45, "status": "0x103"} +{"time": 1788597146.201043, "direction": "response", "command": 7, "message": 45, "status": "0x0"} +{"time": 1788597146.201206, "direction": "request", "command": 7, "message": 46} +{"time": 1788597146.2017422, "direction": "response", "command": 7, "message": 46, "status": "0x0"} +{"time": 1788597146.201958, "direction": "request", "command": 9, "message": 47, "length": 16384, "offset": 0, "transactions": 256} +{"time": 1788597146.202718, "direction": "response", "command": 9, "message": 47, "status": "0x0"} +{"time": 1788597146.2028842, "direction": "request", "command": 7, "message": 48} +{"time": 1788597146.204403, "direction": "response", "command": 7, "message": 48, "status": "0x103"} +{"time": 1788597146.2136042, "direction": "response", "command": 7, "message": 48, "status": "0x0"} +{"time": 1788597146.213614, "cut": {"direction": "response", "command": 7, "message": 48, "status": "0x0"}} +{"time": 1788620541.257727, "control": {"mode": "up", "run": 4}} diff --git a/corpus/collaboration/round-01/smb-success.jsonl b/corpus/collaboration/round-01/smb-success.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..45f84b9f1911770dff13bbd15edb6696ad92a1a9 --- /dev/null +++ b/corpus/collaboration/round-01/smb-success.jsonl @@ -0,0 +1,185 @@ +{"time": 1788596642.322161, "listening": 11445} +{"time": 1788596643.459317, "direction": "response", "command": 0, "message": 0, "status": "0x0"} +{"time": 1788596643.459601, "direction": "request", "command": 0, "message": 1} +{"time": 1788596643.460313, "direction": "response", "command": 0, "message": 1, "status": "0x0"} +{"time": 1788596643.524991, "direction": "request", "command": 1, "message": 2} +{"time": 1788596643.525923, "direction": "response", "command": 1, "message": 2, "status": "0xc0000016"} +{"time": 1788596643.5271392, "direction": "request", "command": 1, "message": 3} +{"time": 1788596643.529094, "direction": "response", "command": 1, "message": 3, "status": "0x0"} +{"time": 1788596643.5300171, "direction": "request", "command": 3, "message": 4} +{"time": 1788596643.545954, "direction": "response", "command": 3, "message": 4, "status": "0x0"} +{"time": 1788596643.702154, "direction": "request", "command": 5, "message": 5} +{"time": 1788596643.702209, "direction": "request", "command": 16, "message": 6} +{"time": 1788596643.702228, "direction": "request", "command": 6, "message": 7} +{"time": 1788596643.7037492, "direction": "response", "command": 5, "message": 5, "status": "0x0"} +{"time": 1788596643.7037702, "direction": "response", "command": 16, "message": 6, "status": "0x0"} +{"time": 1788596643.7037818, "direction": "response", "command": 6, "message": 7, "status": "0x0"} +{"time": 1788596643.70399, "direction": "request", "command": 5, "message": 8} +{"time": 1788596643.704005, "direction": "request", "command": 16, "message": 9} +{"time": 1788596643.704015, "direction": "request", "command": 6, "message": 10} +{"time": 1788596643.704721, "direction": "response", "command": 5, "message": 8, "status": "0x0"} +{"time": 1788596643.704735, "direction": "response", "command": 16, "message": 9, "status": "0x0"} +{"time": 1788596643.7047439, "direction": "response", "command": 6, "message": 10, "status": "0x0"} +{"time": 1788596643.704912, "direction": "request", "command": 5, "message": 11} +{"time": 1788596643.7049239, "direction": "request", "command": 16, "message": 12} +{"time": 1788596643.7049322, "direction": "request", "command": 6, "message": 13} +{"time": 1788596643.705508, "direction": "response", "command": 5, "message": 11, "status": "0x0"} +{"time": 1788596643.7055209, "direction": "response", "command": 16, "message": 12, "status": "0x0"} +{"time": 1788596643.705529, "direction": "response", "command": 6, "message": 13, "status": "0x0"} +{"time": 1788596643.705715, "direction": "request", "command": 5, "message": 14} +{"time": 1788596643.7057269, "direction": "request", "command": 11, "message": 15} +{"time": 1788596643.705735, "direction": "request", "command": 6, "message": 16} +{"time": 1788596643.7062871, "direction": "response", "command": 5, "message": 14, "status": "0x0"} +{"time": 1788596643.7062988, "direction": "response", "command": 11, "message": 15, "status": "0x0"} +{"time": 1788596643.7063081, "direction": "response", "command": 6, "message": 16, "status": "0x0"} +{"time": 1788596643.706497, "direction": "request", "command": 5, "message": 17} +{"time": 1788596643.706514, "direction": "request", "command": 16, "message": 18} +{"time": 1788596643.706524, "direction": "request", "command": 6, "message": 19} +{"time": 1788596643.706547, "direction": "request", "command": 15, "message": 20} +{"time": 1788596643.707222, "direction": "response", "command": 5, "message": 17, "status": "0x0"} +{"time": 1788596643.7072341, "direction": "response", "command": 16, "message": 18, "status": "0x0"} +{"time": 1788596643.707244, "direction": "response", "command": 6, "message": 19, "status": "0x0"} +{"time": 1788596643.7072651, "direction": "response", "command": 15, "message": 20, "status": "0xc0000128"} +{"time": 1788596643.7110121, "direction": "request", "command": 5, "message": 21} +{"time": 1788596643.7110422, "direction": "request", "command": 8, "message": 22, "length": 60, "offset": 0} +{"time": 1788596643.711055, "direction": "request", "command": 6, "message": 23} +{"time": 1788596643.7118561, "direction": "response", "command": 5, "message": 21, "status": "0xc0000034"} +{"time": 1788596643.711905, "direction": "response", "command": 8, "message": 22, "status": "0xc0000034"} +{"time": 1788596643.711918, "direction": "response", "command": 6, "message": 23, "status": "0xc0000034"} +{"time": 1788596643.7129269, "direction": "request", "command": 5, "message": 24} +{"time": 1788596643.712957, "direction": "request", "command": 6, "message": 25} +{"time": 1788596643.713665, "direction": "response", "command": 5, "message": 24, "status": "0x0"} +{"time": 1788596643.7136798, "direction": "response", "command": 6, "message": 25, "status": "0x0"} +{"time": 1788596643.7179441, "direction": "request", "command": 5, "message": 26} +{"time": 1788596643.717964, "direction": "request", "command": 14, "message": 27} +{"time": 1788596643.717972, "direction": "request", "command": 6, "message": 28} +{"time": 1788596643.7187111, "direction": "response", "command": 5, "message": 26, "status": "0x0"} +{"time": 1788596643.718731, "direction": "response", "command": 14, "message": 27, "status": "0xc000000f"} +{"time": 1788596643.71874, "direction": "response", "command": 6, "message": 28, "status": "0x0"} +{"time": 1788596643.719701, "direction": "request", "command": 5, "message": 29} +{"time": 1788596643.719717, "direction": "request", "command": 14, "message": 30} +{"time": 1788596643.7197251, "direction": "request", "command": 6, "message": 31} +{"time": 1788596643.7203462, "direction": "response", "command": 5, "message": 29, "status": "0x0"} +{"time": 1788596643.720358, "direction": "response", "command": 14, "message": 30, "status": "0xc000000f"} +{"time": 1788596643.720366, "direction": "response", "command": 6, "message": 31, "status": "0x0"} +{"time": 1788596643.720575, "direction": "request", "command": 5, "message": 32} +{"time": 1788596643.720584, "direction": "request", "command": 14, "message": 33} +{"time": 1788596643.72059, "direction": "request", "command": 6, "message": 34} +{"time": 1788596643.721225, "direction": "response", "command": 5, "message": 32, "status": "0x0"} +{"time": 1788596643.721235, "direction": "response", "command": 14, "message": 33, "status": "0xc000000f"} +{"time": 1788596643.721241, "direction": "response", "command": 6, "message": 34, "status": "0x0"} +{"time": 1788596643.7214148, "direction": "request", "command": 5, "message": 35} +{"time": 1788596643.7214231, "direction": "request", "command": 14, "message": 36} +{"time": 1788596643.721429, "direction": "request", "command": 6, "message": 37} +{"time": 1788596643.721952, "direction": "response", "command": 5, "message": 35, "status": "0x0"} +{"time": 1788596643.721961, "direction": "response", "command": 14, "message": 36, "status": "0xc000000f"} +{"time": 1788596643.7219672, "direction": "response", "command": 6, "message": 37, "status": "0x0"} +{"time": 1788596643.72212, "direction": "request", "command": 5, "message": 38} +{"time": 1788596643.722128, "direction": "request", "command": 14, "message": 39} +{"time": 1788596643.722134, "direction": "request", "command": 6, "message": 40} +{"time": 1788596643.722678, "direction": "response", "command": 5, "message": 38, "status": "0x0"} +{"time": 1788596643.72269, "direction": "response", "command": 14, "message": 39, "status": "0xc000000f"} +{"time": 1788596643.722697, "direction": "response", "command": 6, "message": 40, "status": "0x0"} +{"time": 1788596657.975753, "direction": "request", "command": 5, "message": 41} +{"time": 1788596657.975786, "direction": "request", "command": 14, "message": 42} +{"time": 1788596657.9757938, "direction": "request", "command": 6, "message": 43} +{"time": 1788596657.976853, "direction": "response", "command": 5, "message": 41, "status": "0x0"} +{"time": 1788596657.976863, "direction": "response", "command": 14, "message": 42, "status": "0x0"} +{"time": 1788596657.976869, "direction": "response", "command": 6, "message": 43, "status": "0x0"} +{"time": 1788596657.9770591, "direction": "request", "command": 5, "message": 44} +{"time": 1788596657.977067, "direction": "request", "command": 14, "message": 45} +{"time": 1788596657.977073, "direction": "request", "command": 6, "message": 46} +{"time": 1788596657.977941, "direction": "response", "command": 5, "message": 44, "status": "0x0"} +{"time": 1788596657.977949, "direction": "response", "command": 14, "message": 45, "status": "0x0"} +{"time": 1788596657.977955, "direction": "response", "command": 6, "message": 46, "status": "0x0"} +{"time": 1788596657.978118, "direction": "request", "command": 5, "message": 47} +{"time": 1788596657.9781241, "direction": "request", "command": 14, "message": 48} +{"time": 1788596657.978129, "direction": "request", "command": 6, "message": 49} +{"time": 1788596657.9789271, "direction": "response", "command": 5, "message": 47, "status": "0x0"} +{"time": 1788596657.978935, "direction": "response", "command": 14, "message": 48, "status": "0x0"} +{"time": 1788596657.97894, "direction": "response", "command": 6, "message": 49, "status": "0x0"} +{"time": 1788596657.979126, "direction": "request", "command": 5, "message": 50} +{"time": 1788596657.980051, "direction": "response", "command": 5, "message": 50, "status": "0x0"} +{"time": 1788596657.9802299, "direction": "request", "command": 16, "message": 51} +{"time": 1788596657.980719, "direction": "response", "command": 16, "message": 51, "status": "0x0"} +{"time": 1788596657.9808671, "direction": "request", "command": 16, "message": 52} +{"time": 1788596657.981366, "direction": "response", "command": 16, "message": 52, "status": "0x0"} +{"time": 1788596657.981566, "direction": "request", "command": 8, "message": 53, "length": 10608, "offset": 0} +{"time": 1788596657.982351, "direction": "response", "command": 8, "message": 53, "status": "0x0"} +{"time": 1788596657.98284, "direction": "request", "command": 6, "message": 54} +{"time": 1788596657.983326, "direction": "response", "command": 6, "message": 54, "status": "0x0"} +{"time": 1788596657.983478, "direction": "request", "command": 5, "message": 55} +{"time": 1788596657.984164, "direction": "response", "command": 5, "message": 55, "status": "0x0"} +{"time": 1788596657.984324, "direction": "request", "command": 5, "message": 56} +{"time": 1788596657.984332, "direction": "request", "command": 8, "message": 57, "length": 64, "offset": 0} +{"time": 1788596657.9843378, "direction": "request", "command": 6, "message": 58} +{"time": 1788596657.98513, "direction": "response", "command": 5, "message": 56, "status": "0x0"} +{"time": 1788596657.985137, "direction": "response", "command": 8, "message": 57, "status": "0x0"} +{"time": 1788596657.985143, "direction": "response", "command": 6, "message": 58, "status": "0x0"} +{"time": 1788596657.9852958, "direction": "request", "command": 5, "message": 59} +{"time": 1788596657.985934, "direction": "response", "command": 5, "message": 59, "status": "0x0"} +{"time": 1788596657.986092, "direction": "request", "command": 10, "message": 60, "locks": [[0, 18446744073709551615, 18]]} +{"time": 1788596657.986513, "direction": "response", "command": 10, "message": 60, "status": "0x0"} +{"time": 1788596657.987117, "direction": "request", "command": 9, "message": 61, "length": 11032, "offset": 0} +{"time": 1788596657.987828, "direction": "response", "command": 9, "message": 61, "status": "0x0"} +{"time": 1788596657.988062, "direction": "request", "command": 7, "message": 62} +{"time": 1788596657.989613, "direction": "response", "command": 7, "message": 62, "status": "0x103"} +{"time": 1788596658.041591, "direction": "response", "command": 7, "message": 62, "status": "0x0"} +{"time": 1788596658.041806, "direction": "request", "command": 7, "message": 63} +{"time": 1788596658.0425558, "direction": "response", "command": 7, "message": 63, "status": "0x0"} +{"time": 1788596658.0428128, "direction": "request", "command": 9, "message": 64, "length": 11032, "offset": 0} +{"time": 1788596658.043593, "direction": "response", "command": 9, "message": 64, "status": "0x0"} +{"time": 1788596658.0437891, "direction": "request", "command": 7, "message": 65} +{"time": 1788596658.045302, "direction": "response", "command": 7, "message": 65, "status": "0x103"} +{"time": 1788596658.060354, "direction": "response", "command": 7, "message": 65, "status": "0x0"} +{"time": 1788596658.0606148, "direction": "request", "command": 7, "message": 66} +{"time": 1788596658.061306, "direction": "response", "command": 7, "message": 66, "status": "0x0"} +{"time": 1788596658.061534, "direction": "request", "command": 9, "message": 67, "length": 11032, "offset": 0} +{"time": 1788596658.062328, "direction": "response", "command": 9, "message": 67, "status": "0x0"} +{"time": 1788596658.062509, "direction": "request", "command": 7, "message": 68} +{"time": 1788596658.06418, "direction": "response", "command": 7, "message": 68, "status": "0x103"} +{"time": 1788596658.073554, "direction": "response", "command": 7, "message": 68, "status": "0x0"} +{"time": 1788596658.073741, "direction": "request", "command": 7, "message": 69} +{"time": 1788596658.074263, "direction": "response", "command": 7, "message": 69, "status": "0x0"} +{"time": 1788596658.07441, "direction": "request", "command": 10, "message": 70, "locks": [[0, 18446744073709551615, 4]]} +{"time": 1788596658.074871, "direction": "response", "command": 10, "message": 70, "status": "0x0"} +{"time": 1788596658.0750148, "direction": "request", "command": 6, "message": 71} +{"time": 1788596658.075412, "direction": "response", "command": 6, "message": 71, "status": "0x0"} +{"time": 1788596658.709572, "direction": "request", "command": 15, "message": 72} +{"time": 1788596658.710887, "direction": "response", "command": 15, "message": 72, "status": "0xc0000128"} +{"time": 1788596673.71379, "direction": "request", "command": 15, "message": 73} +{"time": 1788596673.7150478, "direction": "response", "command": 15, "message": 73, "status": "0xc0000128"} +{"time": 1788596688.717846, "direction": "request", "command": 15, "message": 74} +{"time": 1788596688.718818, "direction": "response", "command": 15, "message": 74, "status": "0xc0000128"} +{"time": 1788596695.637965, "direction": "request", "command": 6, "message": 75} +{"time": 1788596695.639402, "direction": "response", "command": 6, "message": 75, "status": "0x0"} +{"time": 1788596703.720216, "direction": "request", "command": 15, "message": 76} +{"time": 1788596703.721806, "direction": "response", "command": 15, "message": 76, "status": "0xc0000128"} +{"time": 1788596727.719579, "direction": "request", "command": 5, "message": 77} +{"time": 1788596727.7196622, "direction": "request", "command": 16, "message": 78} +{"time": 1788596727.719687, "direction": "request", "command": 6, "message": 79} +{"time": 1788596727.7207522, "direction": "response", "command": 5, "message": 77, "status": "0x0"} +{"time": 1788596727.720813, "direction": "response", "command": 16, "message": 78, "status": "0x0"} +{"time": 1788596727.720837, "direction": "response", "command": 6, "message": 79, "status": "0x0"} +{"time": 1788596727.721025, "direction": "request", "command": 5, "message": 80} +{"time": 1788596727.721066, "direction": "request", "command": 16, "message": 81} +{"time": 1788596727.72109, "direction": "request", "command": 6, "message": 82} +{"time": 1788596727.721766, "direction": "response", "command": 5, "message": 80, "status": "0x0"} +{"time": 1788596727.721811, "direction": "response", "command": 16, "message": 81, "status": "0x0"} +{"time": 1788596727.72183, "direction": "response", "command": 6, "message": 82, "status": "0x0"} +{"time": 1788596794.3989592, "direction": "request", "command": 5, "message": 83} +{"time": 1788596794.399014, "direction": "request", "command": 16, "message": 84} +{"time": 1788596794.3990269, "direction": "request", "command": 6, "message": 85} +{"time": 1788596794.400012, "direction": "response", "command": 5, "message": 83, "status": "0x0"} +{"time": 1788596794.4000251, "direction": "response", "command": 16, "message": 84, "status": "0x0"} +{"time": 1788596794.4000351, "direction": "response", "command": 6, "message": 85, "status": "0x0"} +{"time": 1788596794.4002051, "direction": "request", "command": 5, "message": 86} +{"time": 1788596794.400216, "direction": "request", "command": 16, "message": 87} +{"time": 1788596794.400224, "direction": "request", "command": 6, "message": 88} +{"time": 1788596794.401098, "direction": "response", "command": 5, "message": 86, "status": "0x0"} +{"time": 1788596794.4011068, "direction": "response", "command": 16, "message": 87, "status": "0x0"} +{"time": 1788596794.4011142, "direction": "response", "command": 6, "message": 88, "status": "0x0"} +{"time": 1788596794.401372, "direction": "request", "command": 4, "message": 89} +{"time": 1788596794.401824, "direction": "response", "command": 4, "message": 89, "status": "0x0"} +{"time": 1788596794.401966, "direction": "request", "command": 2, "message": 90} +{"time": 1788596794.4024022, "direction": "response", "command": 2, "message": 90, "status": "0x0"} diff --git a/corpus/m6/ansi/notebook/Open Notebook.onetoc2 b/corpus/m6/ansi/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..8613bc4ba460b0e2000b9923effa95f1166275af --- /dev/null +++ b/corpus/m6/ansi/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../native/20260905-05/notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/m6/ansi/notebook/synthetic.one b/corpus/m6/ansi/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..d2ed44f1e9f620a51ba6e44d52867ebcb5d9ee16 Binary files /dev/null and b/corpus/m6/ansi/notebook/synthetic.one differ diff --git a/corpus/m6/cell-shading-control-01/ORACLE.md b/corpus/m6/cell-shading-control-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..b0875cc0f0da0ea818eb389e109eab8a16870e78 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/ORACLE.md @@ -0,0 +1,14 @@ +# Cell shading on OneNote 2010 + +The COM schema rejects `shadingColor`. This separate Rust-authored storage control +replaces one cell's four-byte modification timestamp property with documented +`CellShadingColor` (`0x14001e26`) and the COLORREF bytes `ff ff 00 00` (yellow). +`input/probe.rs` records the bounded transformation, including object-digest repair; +`input/generation.log` records its execution. The timestamp is deliberately absent +on that cell; other table content and geometry remain unchanged. + +A fresh OneNote 14.0.4763.1000 cache opens the file successfully. Its XML omits cell +shading and its PDF renders the cell white, as shown in `shading-2.png`. The Rust +model retains the documented yellow value. This establishes a native 2010 +rendering limitation for the tested property, not native rendering parity for +cell shading. The report's color follows the documented stored value. diff --git a/corpus/m6/cell-shading-control-01/agent.py b/corpus/m6/cell-shading-control-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/cell-shading-control-01/commands.jsonl b/corpus/m6/cell-shading-control-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..47b13bf7aa57969b40ec22c81ee99ccb8299d859 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/commands.jsonl @@ -0,0 +1,3 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-92ED7B8E -ExpectedPages 2 -Pdf", "exit": 0, "stdout": "Read 1 sections and 2 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\read -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/cell-shading-control-01/format-differences.json b/corpus/m6/cell-shading-control-01/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/cell-shading-control-01/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/cell-shading-control-01/geometry-differences.json b/corpus/m6/cell-shading-control-01/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/cell-shading-control-01/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/cell-shading-control-01/health.json b/corpus/m6/cell-shading-control-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..e5fcf95665f6017ce793e1f6b7509f04086bc206 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-92ED7B8E", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/cell-shading-control-01/input/generation.log b/corpus/m6/cell-shading-control-01/input/generation.log new file mode 100644 index 0000000000000000000000000000000000000000..45bf15e13db8e2d01fe2137ed2bb16033118bf86 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/input/generation.log @@ -0,0 +1,4 @@ + Compiling onestore v0.1.0 (/Users/clo/dev/one) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.19s + Running `target/debug/examples/cell_probe` +Changed one cell timestamp property to CellShadingColor yellow at object offset 10284 diff --git a/corpus/m6/cell-shading-control-01/input/notebook/synthetic.one b/corpus/m6/cell-shading-control-01/input/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..d96209ac4ef9ca5818beab3a8d72f6c2ca00fb2f Binary files /dev/null and b/corpus/m6/cell-shading-control-01/input/notebook/synthetic.one differ diff --git a/corpus/m6/cell-shading-control-01/input/probe.rs b/corpus/m6/cell-shading-control-01/input/probe.rs new file mode 100644 index 0000000000000000000000000000000000000000..59be5f0a5fa524283cb5fcce4223ada5ae25fb12 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/input/probe.rs @@ -0,0 +1,22 @@ +use onestore::{Store, RevisionIndex, ObjectData, PropertySets, Value, Reference, document::Document}; +fn main() -> Result<(), Box> { + let source=std::fs::read("corpus/m6/native-structure-01/notebook/synthetic.one")?; + let store=Store::parse(&source)?;let index=RevisionIndex::parse(&store)?;let document=Document::parse(&index)?; + let mut bytes=source.clone();let mut changed=false; + 'spaces: for (sid,space) in &document.spaces {for rid in space.revisions.keys() {let revision=index.resolve(*sid,*rid)?; + for object in revision.objects.values().filter(|o| o.jcid==0x60024) {if let ObjectData::Properties(data)=object.data { + let sets=PropertySets::parse(data)?;let property=sets.sets[0].iter().find(|p|p.id==0x14001d7a).unwrap(); + let Value::Bytes(value)=property.value else {panic!("Expected a four-byte timestamp")};assert_eq!(value.len(),4); + let start=data.as_ptr().addr()-source.as_ptr().addr();let at=value.as_ptr().addr()-source.as_ptr().addr(); + let offsets:Vec<_>=data.windows(4).enumerate().filter(|(_,b)|*b==0x14001d7au32.to_le_bytes()).map(|(i,_)|i).collect();assert_eq!(offsets.len(),1); + bytes[start+offsets[0]..start+offsets[0]+4].copy_from_slice(&0x14001e26u32.to_le_bytes()); + bytes[at..at+4].copy_from_slice(&[255,255,0,0]); + let digest=md5::compute(&bytes[start..start+data.len()]).0; + for node in store.lists.values().flat_map(|list|&list.nodes) {if matches!(node.id,0xc2|0xc4|0xc5) && let Some(Reference::Data(chunk))=node.reference && chunk.offset==start as u64 && chunk.length==data.len() as u64 { + let hash=node.payload.as_ptr().addr()-source.as_ptr().addr()+node.payload.len()-16;bytes[hash..hash+16].copy_from_slice(&digest); + }} + println!("Changed one cell timestamp property to CellShadingColor yellow at object offset {start}");changed=true;break 'spaces; + }}}} + assert!(changed);let store=Store::parse(&bytes)?;assert!(store.checksum_mismatches.is_empty());let index=RevisionIndex::parse(&store)?;Document::parse(&index)?; + let path="evidence/m6/cell-shading-input/notebook/synthetic.one";assert!(!std::path::Path::new(path).exists());std::fs::write(path,bytes)?;Ok(()) +} diff --git a/corpus/m6/cell-shading-control-01/machine.json b/corpus/m6/cell-shading-control-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..499f40a73412f8b137d8788c7bcfac88186fb579 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-92ed7b8e", "hostname": "ONE-M6-92ED7B8E"} diff --git a/corpus/m6/cell-shading-control-01/model/assets.json b/corpus/m6/cell-shading-control-01/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/cell-shading-control-01/model/assets.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/cell-shading-control-01/model/document.json b/corpus/m6/cell-shading-control-01/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..95ce03bdbe024755b46adb97812971e19b2af74b --- /dev/null +++ b/corpus/m6/cell-shading-control-01/model/document.json @@ -0,0 +1 @@ +{"file_id":[215,207,224,40,38,150,39,79,128,28,7,188,161,187,189,237],"root":"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},1","spaces":{"{6468BA56-B67A-0708-25C1-355E72B08FDD},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{DDEA62BD-E855-034A-0B36-431645B9F46E},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{7C3AC437-BD9C-0D16-2058-C992E3ED6D0F},1"},"revisions":{"{7C3AC437-BD9C-0D16-2058-C992E3ED6D0F},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{DDEA62BD-E855-034A-0B36-431645B9F46E},1":{"roots":{"1":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},10","2":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},11","4":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},26"},"nodes":{"{DE36500D-E769-0AF2-1CBD-2D476AC40105},10":{"jcid":393271,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Native feature probes","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"32558373b5d7c842b00ed3825f33507e"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"80b4208a9a3ddd01"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},12":{"jcid":393227,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},39","{DE36500D-E769-0AF2-1CBD-2D476AC40105},97"],"content":[],"structure":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},13":{"jcid":393260,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},14","{DE36500D-E769-0AF2-1CBD-2D476AC40105},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123384,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},14":{"jcid":393228,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},20":{"jcid":393228,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},21","{DE36500D-E769-0AF2-1CBD-2D476AC40105},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123384,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},21":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123384,"modified":1473123384,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123384,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},24":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123384,"modified":1473123384,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123384,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"5:56 PM","runs":[{"start":0,"end":7,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},33":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native feature probes","runs":[{"start":0,"end":21,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},38","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},39":{"jcid":393228,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},40","{DE36500D-E769-0AF2-1CBD-2D476AC40105},46","{DE36500D-E769-0AF2-1CBD-2D476AC40105},52","{DE36500D-E769-0AF2-1CBD-2D476AC40105},58","{DE36500D-E769-0AF2-1CBD-2D476AC40105},65","{DE36500D-E769-0AF2-1CBD-2D476AC40105},71","{DE36500D-E769-0AF2-1CBD-2D476AC40105},82","{DE36500D-E769-0AF2-1CBD-2D476AC40105},90"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":72.0,"y":108.0,"max_width":480.0,"max_height":115.94244},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},40":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Black highlight, automatic text","runs":[{"start":0,"end":31,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},45","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},45":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":0,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},46":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},50"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},50":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"White text on black highlight","runs":[{"start":0,"end":29,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},51","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},51":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":13355979,"highlight":0,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},52":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},56"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},56":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Black text on black highlight","runs":[{"start":0,"end":29,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},57","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},57":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":0,"highlight":0,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},58":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},62"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},62":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Before middle after","runs":[{"start":0,"end":7,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},63","extra_set":null},{"start":7,"end":13,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},64","extra_set":null},{"start":13,"end":19,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},63","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},63":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},64":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":0,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},65":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},69"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},69":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Yellow highlight, automatic text","runs":[{"start":0,"end":32,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},70","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},70":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":65535,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},71":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},75"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},75":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Plain bold italic underline strike super sub font and color","runs":[{"start":0,"end":6,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":6,"end":10,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},63","extra_set":null},{"start":10,"end":11,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":11,"end":17,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},76","extra_set":null},{"start":17,"end":18,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":18,"end":27,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},77","extra_set":null},{"start":27,"end":28,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":28,"end":34,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},78","extra_set":null},{"start":34,"end":35,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":35,"end":40,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},79","extra_set":null},{"start":40,"end":41,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":41,"end":44,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},80","extra_set":null},{"start":44,"end":45,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":45,"end":59,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},81","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},76":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":true,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},77":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":true,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334293,"value":{"Bytes":"01"}},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},78":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":true,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},79":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":true,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},80":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":true,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},81":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Consolas","font_size":18.0,"color":2113664,"highlight":16776960,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},82":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},86"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123385,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},86":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"BMP 😀é 東京 مرحبا","runs":[{"start":0,"end":4,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":4,"end":8,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},87","extra_set":null},{"start":8,"end":9,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":9,"end":11,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},88","extra_set":null},{"start":11,"end":12,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":12,"end":17,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},89","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},87":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":0,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"01"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},88":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"SimSun","font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":2281714858,"value":"NoData"},{"id":201334017,"value":{"Bytes":"86"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},89":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":true,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Arial","font_size":null,"color":null,"highlight":null,"language":1025,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":2281714858,"value":"NoData"},{"id":201334017,"value":{"Bytes":"b2"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},90":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},94"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},94":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Before ﷟HYPERLINK \"https://example.invalid/fixture?x=1&y=2\"Link label after","runs":[{"start":0,"end":7,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null},{"start":7,"end":59,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},95","extra_set":null},{"start":59,"end":69,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},96","extra_set":null},{"start":69,"end":75,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},95":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":true,"hyperlink":true,"hyperlink_label":true,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},96":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":true,"hyperlink_label":true,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},97":{"jcid":393228,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},98","{DE36500D-E769-0AF2-1CBD-2D476AC40105},105","{DE36500D-E769-0AF2-1CBD-2D476AC40105},112","{DE36500D-E769-0AF2-1CBD-2D476AC40105},124","{DE36500D-E769-0AF2-1CBD-2D476AC40105},130","{DE36500D-E769-0AF2-1CBD-2D476AC40105},136"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":72.0,"y":540.0,"max_width":480.0,"max_height":294.3158},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},98":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},102"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},102":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":2,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Named paragraph style","runs":[{"start":0,"end":21,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},104","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"03000000"}},{"id":335551620,"value":{"Bytes":"03000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},104":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":20.0,"color":5649426,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":288.0,"space_after":144.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"h1"},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},105":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},109"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},109":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[{"definition":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},111","action_type":null,"status":1,"created":1262401445,"completed":1262405106,"start":null,"due":null,"task_id":null,"extra_set":1},{"definition":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},110","action_type":null,"status":0,"created":1262401445,"completed":0,"start":null,"due":null,"task_id":null,"extra_set":2}],"kind":{"type":"RichText","text":"Two tags on this paragraph","runs":[{"start":0,"end":26,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}],[],[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},110":{"jcid":1179715,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"TagDefinition","label":"Fixture checkbox","action_type":0,"shape":3,"color":null,"highlight":null},"extra":[[{"id":201340019,"value":{"Bytes":"00"}},{"id":335557735,"value":{"Bytes":"00000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},111":{"jcid":1179715,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"TagDefinition","label":"Fixture custom tag","action_type":90,"shape":13,"color":2113664,"highlight":16776960},"extra":[[{"id":201340019,"value":{"Bytes":"00"}},{"id":335557735,"value":{"Bytes":"00000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},112":{"jcid":393229,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},117"],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},116"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},123"],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},116":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Outer bullet","runs":[{"start":0,"end":12,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},117":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},121"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},122"],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},121":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Nested bullet","runs":[{"start":0,"end":13,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},122":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":11.0,"color":4278190080,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":"Wingdings","format":"§","restart":null,"bullet":9},"extra":[[{"id":201333952,"value":{"Bytes":"00"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},123":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":11.0,"color":4278190080,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":"Courier New","format":"○","restart":null,"bullet":4},"extra":[[{"id":201333952,"value":{"Bytes":"00"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},124":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},128"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},129"],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},128":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Numbered item three","runs":[{"start":0,"end":19,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},129":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0001.","restart":3,"bullet":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},130":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},134"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},135"],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},134":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Numbered item four","runs":[{"start":0,"end":18,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},135":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0001.","restart":null,"bullet":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},136":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},137"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},137":{"jcid":393250,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},138","{DE36500D-E769-0AF2-1CBD-2D476AC40105},155","{DE36500D-E769-0AF2-1CBD-2D476AC40105},172"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":3,"columns":2,"widths":[120.0,37.115906],"locked":[true,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},138":{"jcid":393251,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},139","{DE36500D-E769-0AF2-1CBD-2D476AC40105},147"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},139":{"jcid":393252,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},142"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":65535},"extra":[[{"id":469769234,"value":{"Bytes":"04e9ebeb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},142":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},146"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},146":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Cell 0,0","runs":[{"start":0,"end":8,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},147":{"jcid":393252,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},150"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"0404bfeb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},150":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},154"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},154":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Cell 0,1","runs":[{"start":0,"end":8,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},155":{"jcid":393251,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},159","{DE36500D-E769-0AF2-1CBD-2D476AC40105},156"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},156":{"jcid":393252,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},167"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"0404bfeb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},159":{"jcid":393252,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},162"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e9ebeb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},162":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},166"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},166":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Cell 1,0","runs":[{"start":0,"end":8,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},167":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},171"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},171":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Cell 1,1","runs":[{"start":0,"end":8,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},172":{"jcid":393251,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},176","{DE36500D-E769-0AF2-1CBD-2D476AC40105},173"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},173":{"jcid":393252,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},184"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"0404bfeb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},176":{"jcid":393252,"children":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},179"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123388,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e9ebeb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},179":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},183"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},183":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Cell 2,0","runs":[{"start":0,"end":8,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},184":{"jcid":393229,"children":[],"content":["{DE36500D-E769-0AF2-1CBD-2D476AC40105},188"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473123387,"modified":1473123387,"original_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","latest_author":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{DE36500D-E769-0AF2-1CBD-2D476AC40105},188":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123387,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Cell 2,1","runs":[{"start":0,"end":8,"format":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},27","extra_set":null}],"paragraph_style":"{DE36500D-E769-0AF2-1CBD-2D476AC40105},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}}}},"{4CB7E8D5-17AD-4A9E-82D9-C44455ADE942},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{95241300-D037-0AC6-1781-826EE0C1EE08},1"},"revisions":{"{95241300-D037-0AC6-1781-826EE0C1EE08},1":{"roots":{"1":"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},20","2":"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},21"},"nodes":{"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},20":{"jcid":393271,"children":[],"content":["{2339F5E7-15B0-496E-A684-E40EAB23A0CB},22"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":null},"extra":[[]]},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},21":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"A notebook created in Rust.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"3ba097e16397eb4394b7a682b3f6d2b5"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"0090fcc4053ddd01"}}]]},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},22":{"jcid":393227,"children":["{2339F5E7-15B0-496E-A684-E40EAB23A0CB},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473123416,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"A notebook created in Rust.","level":null,"width":null,"height":null,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":null},"extra":[[{"id":469769589,"value":{"Bytes":"4600690078007400750072006500200041007500740068006f0072000000"}}]]},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},23":{"jcid":393228,"children":["{2339F5E7-15B0-496E-A684-E40EAB23A0CB},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":36.0,"max_width":375.07498,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473059488,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[0.0]},"extra":[[]]},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},24":{"jcid":393229,"children":[],"content":["{2339F5E7-15B0-496E-A684-E40EAB23A0CB},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473059488,"modified":1473059488,"original_author":"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},26","latest_author":"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},26","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473059488,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"A notebook created in Rust.","runs":[{"start":0,"end":27,"format":"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},27","extra_set":null}],"paragraph_style":null,"boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}}]]},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},26":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"Fixture Author"},"extra":[[]]},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[]]}}}}},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{24CFEA87-F2D2-0D37-22B3-486454D921D0},1"},"revisions":{"{24CFEA87-F2D2-0D37-22B3-486454D921D0},1":{"roots":{"1":"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},10","2":"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},11"},"nodes":{"{60F9030D-914C-036C-357C-5A10B544F64C},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{6468BA56-B67A-0708-25C1-355E72B08FDD},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"20db62751eb1ad43b791d7c0f3445102"}},{"id":402660453,"value":{"Bytes":"80b4208a9a3ddd01"}},{"id":603993154,"value":{"Objects":["{46C07A67-807A-45E6-92D5-E2F2A894BA35},1"]}}]]},"{46C07A67-807A-45E6-92D5-E2F2A894BA35},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Native feature probes","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"32558373b5d7c842b00ed3825f33507e"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"80b4208a9a3ddd01"}}]]},"{6E1F28E4-21AD-0870-35CD-13E88F89DCAA},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"A notebook created in Rust.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"3ba097e16397eb4394b7a682b3f6d2b5"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"0090fcc4053ddd01"}}]]},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},10":{"jcid":393223,"children":["{2339F5E7-15B0-496E-A684-E40EAB23A0CB},12","{60F9030D-914C-036C-357C-5A10B544F64C},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"4275ebe8f5d4d648b7db01384d836a10"}},{"id":402660453,"value":{"Bytes":"0090fcc4053ddd01"}}]]},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},12":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{4CB7E8D5-17AD-4A9E-82D9-C44455ADE942},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"85134bb69bdfbb41b3ab4322b6cccb44"}},{"id":402660453,"value":{"Bytes":"0090fcc4053ddd01"}},{"id":603993154,"value":{"Objects":["{6E1F28E4-21AD-0870-35CD-13E88F89DCAA},1"]}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/cell-shading-control-01/model/text.json b/corpus/m6/cell-shading-control-01/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..84749ce87f03d0276156d32758e276a0a225a431 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/model/text.json @@ -0,0 +1 @@ +{"{6468BA56-B67A-0708-25C1-355E72B08FDD},1":{"{7C3AC437-BD9C-0D16-2058-C992E3ED6D0F},1":{},"{DDEA62BD-E855-034A-0B36-431645B9F46E},1":{"{DE36500D-E769-0AF2-1CBD-2D476AC40105},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},25":[{"text":"5:56 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},37":[{"text":"Native feature probes","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},44":[{"text":"Black highlight, automatic text","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":0,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},50":[{"text":"White text on black highlight","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":13355979,"highlight":0,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},56":[{"text":"Black text on black highlight","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":0,"highlight":0,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},62":[{"text":"Before ","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"middle","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":0,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":" after","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},69":[{"text":"Yellow highlight, automatic text","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":65535,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},75":[{"text":"Plain ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"bold","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":" ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"italic","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":" ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"underline","format":{"bold":false,"italic":false,"underline":true,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":" ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"strike","format":{"bold":false,"italic":false,"underline":false,"strike":true,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":" ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"super","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":true,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":" ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"sub","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":true,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":" ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"font and color","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Consolas","font_size":18.0,"color":2113664,"highlight":16776960,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},86":[{"text":"BMP ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"😀é","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":0,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":" ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"東京","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"SimSun","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":" ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"مرحبا","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Arial","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1025,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},94":[{"text":"Before ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"﷟HYPERLINK \"https://example.invalid/fixture?x=1&y=2\"","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":true,"hyperlink":true,"hyperlink_label":true,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"Link label","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":true,"hyperlink_label":true,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":"https://example.invalid/fixture?x=1&y=2"},{"text":" after","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},102":[{"text":"Named paragraph style","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":20.0,"color":5649426,"highlight":4278190080,"language":1033,"alignment":2,"rtl":null,"space_before":288.0,"space_after":144.0,"line_spacing":null},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},109":[{"text":"Two tags on this paragraph","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},116":[{"text":"Outer bullet","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},121":[{"text":"Nested bullet","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},128":[{"text":"Numbered item three","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},134":[{"text":"Numbered item four","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},146":[{"text":"Cell 0,0","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},154":[{"text":"Cell 0,1","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},166":[{"text":"Cell 1,0","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},171":[{"text":"Cell 1,1","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},183":[{"text":"Cell 2,0","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{DE36500D-E769-0AF2-1CBD-2D476AC40105},188":[{"text":"Cell 2,1","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{4CB7E8D5-17AD-4A9E-82D9-C44455ADE942},1":{"{95241300-D037-0AC6-1781-826EE0C1EE08},1":{"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},25":[{"text":"A notebook created in Rust.","format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"link":null}]}},"{2339F5E7-15B0-496E-A684-E40EAB23A0CB},1":{"{24CFEA87-F2D2-0D37-22B3-486454D921D0},1":{}}} \ No newline at end of file diff --git a/corpus/m6/cell-shading-control-01/pdf-format-checks.json b/corpus/m6/cell-shading-control-01/pdf-format-checks.json new file mode 100644 index 0000000000000000000000000000000000000000..c7e703f9c3b86bb90804426de8ee1a62c9a0b7c4 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/pdf-format-checks.json @@ -0,0 +1,27 @@ +[ + { + "file": "synthetic.one", + "page": 1, + "paragraphs": 4, + "pdf": "page-001.pdf", + "pdf_sha256": "d3f834574d212c9fe672bfd79db7aea35181937b9eb38a603d767bbc9dc510d9", + "source_sha256": "df80ddabd0288dde9f050db2417c00e48c8af6f65693f754dc8196ee61ae86ac", + "xml_omissions": [ + { + "paragraph": 4, + "field": "highlight", + "stored": "#000000", + "native": "automatic", + "characters": 6, + "positions": [ + 7, + 8, + 9, + 10, + 11, + 12 + ] + } + ] + } +] \ No newline at end of file diff --git a/corpus/m6/cell-shading-control-01/read/environment.json b/corpus/m6/cell-shading-control-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..b1b2cf438ff3ec5917dc4437968512c468899fa7 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-92ED7B8E", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/cell-shading-control-01/read/hierarchy.xml b/corpus/m6/cell-shading-control-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..1dbc305a33c7f2a15b6442e7e2ac148d4d9042b7 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/cell-shading-control-01/read/page-000.pdf b/corpus/m6/cell-shading-control-01/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a9c055b604aac3cccf71a1b66e6ebcc0e7b44a3c Binary files /dev/null and b/corpus/m6/cell-shading-control-01/read/page-000.pdf differ diff --git a/corpus/m6/cell-shading-control-01/read/page-000.xml b/corpus/m6/cell-shading-control-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..304eb789b8246e8e3a5c9b4f3bea81ebacd5af82 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/cell-shading-control-01/read/page-001.pdf b/corpus/m6/cell-shading-control-01/read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cbcba43c8229e9b5d123ab20b28a6af1d7c8c14b Binary files /dev/null and b/corpus/m6/cell-shading-control-01/read/page-001.pdf differ diff --git a/corpus/m6/cell-shading-control-01/read/page-001.xml b/corpus/m6/cell-shading-control-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..56ec6ce3802e32dda1efca5321f247121660c733 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/read/page-001.xml @@ -0,0 +1,28 @@ + +Black highlight, automatic text]]>White text on black highlight]]>Black text on black highlight]]>Before middle after]]>Yellow highlight, automatic text]]>Plain bold italic underline strike super sub font and color]]>BMP 😀é 東京 مرحبا]]>Link label after]]>Named paragraph style]]> diff --git a/corpus/m6/cell-shading-control-01/read/payloads.json b/corpus/m6/cell-shading-control-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/m6/cell-shading-control-01/render.log b/corpus/m6/cell-shading-control-01/render.log new file mode 100644 index 0000000000000000000000000000000000000000..6f437844d614c8922d854404ca6c7d4e3d990a14 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/render.log @@ -0,0 +1 @@ +Fontconfig error: Cannot load default config file: File not found diff --git a/corpus/m6/cell-shading-control-01/restart-agent.py b/corpus/m6/cell-shading-control-01/restart-agent.py new file mode 100644 index 0000000000000000000000000000000000000000..21a78ac87a0ac79b7906b7a3cdf7ec904cd57ebd --- /dev/null +++ b/corpus/m6/cell-shading-control-01/restart-agent.py @@ -0,0 +1,35 @@ +"""Run through the old agent's detached spawn endpoint in a disposable clone.""" +import os +import ctypes +from ctypes import wintypes +import subprocess +import sys +import time + +if len(sys.argv) != 2 or not sys.argv[1].startswith('ONE-M6-') or os.environ.get('COMPUTERNAME') != sys.argv[1]: + raise SystemExit('The disposable clone hostname does not match.') +parent = os.getppid() +kernel = ctypes.WinDLL('kernel32', use_last_error=True) +kernel.OpenProcess.argtypes = (wintypes.DWORD, wintypes.BOOL, wintypes.DWORD) +kernel.OpenProcess.restype = wintypes.HANDLE +kernel.TerminateProcess.argtypes = (wintypes.HANDLE, wintypes.UINT) +kernel.TerminateProcess.restype = wintypes.BOOL +kernel.WaitForSingleObject.argtypes = (wintypes.HANDLE, wintypes.DWORD) +kernel.WaitForSingleObject.restype = wintypes.DWORD +kernel.CloseHandle.argtypes = (wintypes.HANDLE,) +kernel.CloseHandle.restype = wintypes.BOOL +handle = kernel.OpenProcess(0x100001, False, parent) +if not handle: + raise ctypes.WinError(ctypes.get_last_error()) +time.sleep(0.5) +try: + if not kernel.TerminateProcess(handle, 0): + raise ctypes.WinError(ctypes.get_last_error()) + if kernel.WaitForSingleObject(handle, 5000) != 0: + raise RuntimeError('The old agent did not terminate.') +finally: + kernel.CloseHandle(handle) +with open(r'C:\one-tests\agent-restart.log', 'ab') as log: + subprocess.Popen([sys.executable, r'C:\win7-agent\agent.py'], stdin=subprocess.DEVNULL, + stdout=log, stderr=log, close_fds=True, + creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP) diff --git a/corpus/m6/cell-shading-control-01/run.json b/corpus/m6/cell-shading-control-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..687b1c79c2cad4ba7b977c8a48bd97d70c81281c --- /dev/null +++ b/corpus/m6/cell-shading-control-01/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m6/cell-shading-input/notebook", + "expected_pages": 2, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/m6/cell-shading-control-01/scripts/cold.ps1 b/corpus/m6/cell-shading-control-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/cell-shading-control-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/cell-shading-control-01/scripts/read.ps1 b/corpus/m6/cell-shading-control-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/cell-shading-control-01/shading-1.png b/corpus/m6/cell-shading-control-01/shading-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cb5ee709bb5305c33784c8b58dfa8783cd3749 Binary files /dev/null and b/corpus/m6/cell-shading-control-01/shading-1.png differ diff --git a/corpus/m6/cell-shading-control-01/shading-2.png b/corpus/m6/cell-shading-control-01/shading-2.png new file mode 100644 index 0000000000000000000000000000000000000000..728bca0947db12c9511e1974305ee57993bc7f6c Binary files /dev/null and b/corpus/m6/cell-shading-control-01/shading-2.png differ diff --git a/corpus/m6/cell-shading-control-01/source.json b/corpus/m6/cell-shading-control-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..94b13d1327d265ff43db0b6bd675db3f5fabb3a1 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/source.json @@ -0,0 +1,8 @@ +[ + { + "path": "synthetic.one", + "bytes": 22908, + "sha256": "df80ddabd0288dde9f050db2417c00e48c8af6f65693f754dc8196ee61ae86ac", + "mtime_ns": 1788675858562666007 + } +] diff --git a/corpus/m6/cell-shading-control-01/teardown.json b/corpus/m6/cell-shading-control-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/cell-shading-control-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/live-collaboration-15/ORACLE.md b/corpus/m6/live-collaboration-15/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..5572f49346e9ba7022c66432b0bfe41439ab9102 --- /dev/null +++ b/corpus/m6/live-collaboration-15/ORACLE.md @@ -0,0 +1,33 @@ +# Live collaboration and interruption matrix + +`tools/native_collaboration.py` ran two fresh Windows 7 / OneNote +14.0.4763.1000 clients against the disposable Linux Samba server. `linux.json`, +`server.jsonl`, `run.json`, each client's native captures, and checkpoint notebooks +record the environment and operations. `result.json` contains seven passing cases: + +- A Rust scalar edit and a native edit to another outline converged. +- Concurrent edits to the same text retained both versions as a native conflict. +- Samba restart preserved the converged state. +- Disconnecting one client's lab NIC allowed independent offline/online edits; + both converged after reconnection. +- An exclusive macOS file lock prevented native changes to the shared bytes; + the queued native edit synchronized after release. +- Terminating and restarting OneNote preserved already synchronized edits. +- Abruptly terminating QEMU and reopening the same overlay preserved those edits. + +`retention.json` validates the current page's explicit conflict-space reference, +not merely the presence of old text in historical revisions. The final notebook +was reopened from a separate fresh cache in `../live-collaboration-cold-15`. +Its native comparison passed, and `conflict.png` shows the competing edit in +OneNote's read-only conflict view. Both Windows clients, the verifier, and the +Linux VM were deleted; teardown records accompany each run. + +Process/VM termination covers already server-persisted data. It does not claim +unsynchronized cache durability or physical host power-loss safety. The separate +stage-5 corpus covers lost successful SMB FLUSH responses. + +The controller submits only the edited top-level content container. Submitting +all cached page containers in an offline update replayed stale content over an +unrelated online edit; failure evidence is `evidence/m6/live-collaboration-13`. +Mac SMB mounts were explicitly reconnected after Samba restarts because the OS +revoked the original mount. Failed setup runs remain separate from acceptance. diff --git a/corpus/m6/live-collaboration-15/a/agent.py b/corpus/m6/live-collaboration-15/a/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/live-collaboration-15/a/closed b/corpus/m6/live-collaboration-15/a/closed new file mode 100644 index 0000000000000000000000000000000000000000..277f9daa9548d402d4174aa1f585b80ea9e20806 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/closed @@ -0,0 +1 @@ +closed \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0001.json b/corpus/m6/live-collaboration-15/a/command-0001.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0001.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0002.json b/corpus/m6/live-collaboration-15/a/command-0002.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0002.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0003.json b/corpus/m6/live-collaboration-15/a/command-0003.json new file mode 100644 index 0000000000000000000000000000000000000000..6ce342840555980e3157cf2d2a6d94ec02e48ec1 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0003.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Fictitious positioned outline.", "text": "Native disjoint edit."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0004.json b/corpus/m6/live-collaboration-15/a/command-0004.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0004.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0005.json b/corpus/m6/live-collaboration-15/a/command-0005.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0005.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0006.json b/corpus/m6/live-collaboration-15/a/command-0006.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0006.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0007.json b/corpus/m6/live-collaboration-15/a/command-0007.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0007.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0008.json b/corpus/m6/live-collaboration-15/a/command-0008.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0008.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0009.json b/corpus/m6/live-collaboration-15/a/command-0009.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0009.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0010.json b/corpus/m6/live-collaboration-15/a/command-0010.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0010.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0011.json b/corpus/m6/live-collaboration-15/a/command-0011.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0011.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0012.json b/corpus/m6/live-collaboration-15/a/command-0012.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0012.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0013.json b/corpus/m6/live-collaboration-15/a/command-0013.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0013.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0014.json b/corpus/m6/live-collaboration-15/a/command-0014.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0014.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0015.json b/corpus/m6/live-collaboration-15/a/command-0015.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0015.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0016.json b/corpus/m6/live-collaboration-15/a/command-0016.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0016.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0017.json b/corpus/m6/live-collaboration-15/a/command-0017.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0017.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0018.json b/corpus/m6/live-collaboration-15/a/command-0018.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0018.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0019.json b/corpus/m6/live-collaboration-15/a/command-0019.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0019.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0020.json b/corpus/m6/live-collaboration-15/a/command-0020.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0020.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0021.json b/corpus/m6/live-collaboration-15/a/command-0021.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0021.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0022.json b/corpus/m6/live-collaboration-15/a/command-0022.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0022.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0023.json b/corpus/m6/live-collaboration-15/a/command-0023.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0023.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0024.json b/corpus/m6/live-collaboration-15/a/command-0024.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0024.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0025.json b/corpus/m6/live-collaboration-15/a/command-0025.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0025.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0026.json b/corpus/m6/live-collaboration-15/a/command-0026.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0026.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0027.json b/corpus/m6/live-collaboration-15/a/command-0027.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0027.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0028.json b/corpus/m6/live-collaboration-15/a/command-0028.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0028.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0029.json b/corpus/m6/live-collaboration-15/a/command-0029.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0029.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0030.json b/corpus/m6/live-collaboration-15/a/command-0030.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0030.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0031.json b/corpus/m6/live-collaboration-15/a/command-0031.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0031.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0032.json b/corpus/m6/live-collaboration-15/a/command-0032.json new file mode 100644 index 0000000000000000000000000000000000000000..d8cdeb32d6faec81266d8e3014813bab501e5532 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0032.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Rust disjoint edit.........", "text": "Client A concurrent edit."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0033.json b/corpus/m6/live-collaboration-15/a/command-0033.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0033.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0034.json b/corpus/m6/live-collaboration-15/a/command-0034.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0034.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0035.json b/corpus/m6/live-collaboration-15/a/command-0035.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0035.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0036.json b/corpus/m6/live-collaboration-15/a/command-0036.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0036.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0037.json b/corpus/m6/live-collaboration-15/a/command-0037.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0037.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0038.json b/corpus/m6/live-collaboration-15/a/command-0038.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0038.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0039.json b/corpus/m6/live-collaboration-15/a/command-0039.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0039.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0040.json b/corpus/m6/live-collaboration-15/a/command-0040.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0040.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0041.json b/corpus/m6/live-collaboration-15/a/command-0041.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0041.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0042.json b/corpus/m6/live-collaboration-15/a/command-0042.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0042.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0043.json b/corpus/m6/live-collaboration-15/a/command-0043.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0043.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0044.json b/corpus/m6/live-collaboration-15/a/command-0044.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0044.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0045.json b/corpus/m6/live-collaboration-15/a/command-0045.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0045.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0046.json b/corpus/m6/live-collaboration-15/a/command-0046.json new file mode 100644 index 0000000000000000000000000000000000000000..c4c41bebdd18f2b6c40e0ce20b4a6aefbf1fb4ab --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0046.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Native disjoint edit.", "text": "Client A offline edit."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0047.json b/corpus/m6/live-collaboration-15/a/command-0047.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0047.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0048.json b/corpus/m6/live-collaboration-15/a/command-0048.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0048.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0049.json b/corpus/m6/live-collaboration-15/a/command-0049.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0049.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0050.json b/corpus/m6/live-collaboration-15/a/command-0050.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0050.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0051.json b/corpus/m6/live-collaboration-15/a/command-0051.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0051.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0052.json b/corpus/m6/live-collaboration-15/a/command-0052.json new file mode 100644 index 0000000000000000000000000000000000000000..5982438704afb1b626a9a66112f02747adafbc83 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0052.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Client A offline edit.", "text": "Native lock recovery."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0053.json b/corpus/m6/live-collaboration-15/a/command-0053.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0053.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0054.json b/corpus/m6/live-collaboration-15/a/command-0054.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0054.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0055.json b/corpus/m6/live-collaboration-15/a/command-0055.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0055.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0056.json b/corpus/m6/live-collaboration-15/a/command-0056.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0056.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0057.json b/corpus/m6/live-collaboration-15/a/command-0057.json new file mode 100644 index 0000000000000000000000000000000000000000..6b70318d0a580dee954b4cd08f2a6703e5912d82 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0057.json @@ -0,0 +1 @@ +{"action": "kill-process"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0058.json b/corpus/m6/live-collaboration-15/a/command-0058.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0058.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0059.json b/corpus/m6/live-collaboration-15/a/command-0059.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0059.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0060.json b/corpus/m6/live-collaboration-15/a/command-0060.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0060.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0061.json b/corpus/m6/live-collaboration-15/a/command-0061.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0061.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/command-0062.json b/corpus/m6/live-collaboration-15/a/command-0062.json new file mode 100644 index 0000000000000000000000000000000000000000..7adf980027ef43cc77767d4fd1b1d67ad1541ab4 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/command-0062.json @@ -0,0 +1 @@ +{"action": "close"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/commands.jsonl b/corpus/m6/live-collaboration-15/a/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..e56650dcb76bbf4f847551fd2b672eb01851d69d --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/commands.jsonl @@ -0,0 +1,71 @@ +{"command": "mkdir C:\\one-tests\\runs\\capture", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -ExecutionPolicy Bypass -File C:\\one-tests\\network.ps1 -LabMac 52:54:02:c6:92:8d", "exit": 0, "stdout": "{\"renewalResult\":0,\"releaseResult\":83,\"mac\":\"52:54:02:c6:92:8d\",\"address\":\"192.168.77.111\"}\r\n", "stderr": "", "error": null} +{"command": "ipconfig", "exit": 0, "stdout": "\r\nWindows IP Configuration\r\n\r\n\r\nEthernet adapter Local Area Connection 2:\r\n\r\n Connection-specific DNS Suffix . : \r\n Link-local IPv6 Address . . . . . : fe80::9965:a22f:77e:4939%13\r\n IPv4 Address. . . . . . . . . . . : 192.168.77.111\r\n Subnet Mask . . . . . . . . . . . : 255.255.255.0\r\n Default Gateway . . . . . . . . . : \r\n\r\nEthernet adapter Local Area Connection:\r\n\r\n Connection-specific DNS Suffix . : \r\n Site-local IPv6 Address . . . . . : fec0::2458:7ec3:bb80:2557%1\r\n Link-local IPv6 Address . . . . . : fe80::2458:7ec3:bb80:2557%11\r\n IPv4 Address. . . . . . . . . . . : 10.0.2.15\r\n Subnet Mask . . . . . . . . . . . : 255.255.255.0\r\n Default Gateway . . . . . . . . . : fe80::2%11\r\n 10.0.2.2\r\n\r\nTunnel adapter isatap.{2913F119-34A2-4D05-B185-573FF3B2121A}:\r\n\r\n Media State . . . . . . . . . . . : Media disconnected\r\n Connection-specific DNS Suffix . : \r\n\r\nTunnel adapter isatap.{A59CB099-98D4-4C81-9159-48128C5EBB69}:\r\n\r\n Media State . . . . . . . . . . . : Media disconnected\r\n Connection-specific DNS Suffix . : \r\n", "stderr": "", "error": null} +{"command": "dir \\\\192.168.77.1\\agent\\m6-collaboration", "exit": 0, "stdout": " Volume in drive \\\\192.168.77.1\\agent is agent\r\n Volume Serial Number is 640F-A719\r\n\r\n Directory of \\\\192.168.77.1\\agent\\m6-collaboration\r\n\r\n09/05/2026 10:58 PM .\r\n09/05/2026 10:58 PM ..\r\n09/04/2026 10:12 PM 4,944 Open Notebook.onetoc2\r\n09/04/2026 10:12 PM 27,808 synthetic.one\r\n 2 File(s) 32,752 bytes\r\n 2 Dir(s) 14,688,968,704 bytes free\r\n", "stderr": "", "error": null} +{"command": "if exist C:\\one-tests\\runs\\capture\\ready del C:\\one-tests\\runs\\capture\\ready", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "ipconfig", "exit": 0, "stdout": "\r\nWindows IP Configuration\r\n\r\n\r\nEthernet adapter Local Area Connection 2:\r\n\r\n Connection-specific DNS Suffix . : \r\n Link-local IPv6 Address . . . . . : fe80::9965:a22f:77e:4939%13\r\n IPv4 Address. . . . . . . . . . . : 192.168.77.111\r\n Subnet Mask . . . . . . . . . . . : 255.255.255.0\r\n Default Gateway . . . . . . . . . : \r\n\r\nEthernet adapter Local Area Connection:\r\n\r\n Connection-specific DNS Suffix . : \r\n Site-local IPv6 Address . . . . . : fec0::2458:7ec3:bb80:2557%1\r\n Link-local IPv6 Address . . . . . : fe80::2458:7ec3:bb80:2557%11\r\n IPv4 Address. . . . . . . . . . . : 10.0.2.15\r\n Subnet Mask . . . . . . . . . . . : 255.255.255.0\r\n Default Gateway . . . . . . . . . : fe80::2%11\r\n 10.0.2.2\r\n\r\nTunnel adapter isatap.{2913F119-34A2-4D05-B185-573FF3B2121A}:\r\n\r\n Media State . . . . . . . . . . . : Media disconnected\r\n Connection-specific DNS Suffix . : \r\n\r\nTunnel adapter isatap.{A59CB099-98D4-4C81-9159-48128C5EBB69}:\r\n\r\n Media State . . . . . . . . . . . : Media disconnected\r\n Connection-specific DNS Suffix . : \r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0001.tmp C:\\one-tests\\runs\\capture\\inbox\\0001.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0002.tmp C:\\one-tests\\runs\\capture\\inbox\\0002.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0003.tmp C:\\one-tests\\runs\\capture\\inbox\\0003.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0004.tmp C:\\one-tests\\runs\\capture\\inbox\\0004.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0005.tmp C:\\one-tests\\runs\\capture\\inbox\\0005.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0006.tmp C:\\one-tests\\runs\\capture\\inbox\\0006.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0007.tmp C:\\one-tests\\runs\\capture\\inbox\\0007.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0008.tmp C:\\one-tests\\runs\\capture\\inbox\\0008.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0009.tmp C:\\one-tests\\runs\\capture\\inbox\\0009.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0010.tmp C:\\one-tests\\runs\\capture\\inbox\\0010.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0011.tmp C:\\one-tests\\runs\\capture\\inbox\\0011.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0012.tmp C:\\one-tests\\runs\\capture\\inbox\\0012.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0013.tmp C:\\one-tests\\runs\\capture\\inbox\\0013.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0014.tmp C:\\one-tests\\runs\\capture\\inbox\\0014.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0015.tmp C:\\one-tests\\runs\\capture\\inbox\\0015.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0016.tmp C:\\one-tests\\runs\\capture\\inbox\\0016.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0017.tmp C:\\one-tests\\runs\\capture\\inbox\\0017.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0018.tmp C:\\one-tests\\runs\\capture\\inbox\\0018.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0019.tmp C:\\one-tests\\runs\\capture\\inbox\\0019.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0020.tmp C:\\one-tests\\runs\\capture\\inbox\\0020.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0021.tmp C:\\one-tests\\runs\\capture\\inbox\\0021.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0022.tmp C:\\one-tests\\runs\\capture\\inbox\\0022.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0023.tmp C:\\one-tests\\runs\\capture\\inbox\\0023.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0024.tmp C:\\one-tests\\runs\\capture\\inbox\\0024.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0025.tmp C:\\one-tests\\runs\\capture\\inbox\\0025.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0026.tmp C:\\one-tests\\runs\\capture\\inbox\\0026.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0027.tmp C:\\one-tests\\runs\\capture\\inbox\\0027.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0028.tmp C:\\one-tests\\runs\\capture\\inbox\\0028.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0029.tmp C:\\one-tests\\runs\\capture\\inbox\\0029.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0030.tmp C:\\one-tests\\runs\\capture\\inbox\\0030.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0031.tmp C:\\one-tests\\runs\\capture\\inbox\\0031.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0032.tmp C:\\one-tests\\runs\\capture\\inbox\\0032.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0033.tmp C:\\one-tests\\runs\\capture\\inbox\\0033.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0034.tmp C:\\one-tests\\runs\\capture\\inbox\\0034.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0035.tmp C:\\one-tests\\runs\\capture\\inbox\\0035.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0036.tmp C:\\one-tests\\runs\\capture\\inbox\\0036.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0037.tmp C:\\one-tests\\runs\\capture\\inbox\\0037.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0038.tmp C:\\one-tests\\runs\\capture\\inbox\\0038.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0039.tmp C:\\one-tests\\runs\\capture\\inbox\\0039.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0040.tmp C:\\one-tests\\runs\\capture\\inbox\\0040.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0041.tmp C:\\one-tests\\runs\\capture\\inbox\\0041.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0042.tmp C:\\one-tests\\runs\\capture\\inbox\\0042.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0043.tmp C:\\one-tests\\runs\\capture\\inbox\\0043.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0044.tmp C:\\one-tests\\runs\\capture\\inbox\\0044.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0045.tmp C:\\one-tests\\runs\\capture\\inbox\\0045.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0046.tmp C:\\one-tests\\runs\\capture\\inbox\\0046.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0047.tmp C:\\one-tests\\runs\\capture\\inbox\\0047.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0048.tmp C:\\one-tests\\runs\\capture\\inbox\\0048.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0049.tmp C:\\one-tests\\runs\\capture\\inbox\\0049.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0050.tmp C:\\one-tests\\runs\\capture\\inbox\\0050.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0051.tmp C:\\one-tests\\runs\\capture\\inbox\\0051.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0052.tmp C:\\one-tests\\runs\\capture\\inbox\\0052.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0053.tmp C:\\one-tests\\runs\\capture\\inbox\\0053.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0054.tmp C:\\one-tests\\runs\\capture\\inbox\\0054.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0055.tmp C:\\one-tests\\runs\\capture\\inbox\\0055.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0056.tmp C:\\one-tests\\runs\\capture\\inbox\\0056.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0057.tmp C:\\one-tests\\runs\\capture\\inbox\\0057.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0058.tmp C:\\one-tests\\runs\\capture\\inbox\\0058.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0059.tmp C:\\one-tests\\runs\\capture\\inbox\\0059.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -ExecutionPolicy Bypass -File C:\\one-tests\\network.ps1 -LabMac 52:54:02:c6:92:8d", "exit": 0, "stdout": "{\"renewalResult\":0,\"releaseResult\":0,\"mac\":\"52:54:02:c6:92:8d\",\"address\":\"192.168.77.111\"}\r\n", "stderr": "", "error": null} +{"command": "if exist C:\\one-tests\\runs\\capture\\ready del C:\\one-tests\\runs\\capture\\ready", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0060.tmp C:\\one-tests\\runs\\capture\\inbox\\0060.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0061.tmp C:\\one-tests\\runs\\capture\\inbox\\0061.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0062.tmp C:\\one-tests\\runs\\capture\\inbox\\0062.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/live-collaboration-15/a/controller-0.log b/corpus/m6/live-collaboration-15/a/controller-0.log new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/corpus/m6/live-collaboration-15/a/controller-59.log b/corpus/m6/live-collaboration-15/a/controller-59.log new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/corpus/m6/live-collaboration-15/a/health.json b/corpus/m6/live-collaboration-15/a/health.json new file mode 100644 index 0000000000000000000000000000000000000000..c7cfd359ea0854b7c8634a202e1baafb4ce0acca --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-55EF988A", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/live-collaboration-15/a/inbox/0001.json b/corpus/m6/live-collaboration-15/a/inbox/0001.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0001.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0002.json b/corpus/m6/live-collaboration-15/a/inbox/0002.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0002.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0003.json b/corpus/m6/live-collaboration-15/a/inbox/0003.json new file mode 100644 index 0000000000000000000000000000000000000000..6ce342840555980e3157cf2d2a6d94ec02e48ec1 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0003.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Fictitious positioned outline.", "text": "Native disjoint edit."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0004.json b/corpus/m6/live-collaboration-15/a/inbox/0004.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0004.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0005.json b/corpus/m6/live-collaboration-15/a/inbox/0005.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0005.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0006.json b/corpus/m6/live-collaboration-15/a/inbox/0006.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0006.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0007.json b/corpus/m6/live-collaboration-15/a/inbox/0007.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0007.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0008.json b/corpus/m6/live-collaboration-15/a/inbox/0008.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0008.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0009.json b/corpus/m6/live-collaboration-15/a/inbox/0009.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0009.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0010.json b/corpus/m6/live-collaboration-15/a/inbox/0010.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0010.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0011.json b/corpus/m6/live-collaboration-15/a/inbox/0011.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0011.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0012.json b/corpus/m6/live-collaboration-15/a/inbox/0012.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0012.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0013.json b/corpus/m6/live-collaboration-15/a/inbox/0013.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0013.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0014.json b/corpus/m6/live-collaboration-15/a/inbox/0014.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0014.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0015.json b/corpus/m6/live-collaboration-15/a/inbox/0015.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0015.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0016.json b/corpus/m6/live-collaboration-15/a/inbox/0016.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0016.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0017.json b/corpus/m6/live-collaboration-15/a/inbox/0017.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0017.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0018.json b/corpus/m6/live-collaboration-15/a/inbox/0018.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0018.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0019.json b/corpus/m6/live-collaboration-15/a/inbox/0019.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0019.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0020.json b/corpus/m6/live-collaboration-15/a/inbox/0020.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0020.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0021.json b/corpus/m6/live-collaboration-15/a/inbox/0021.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0021.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0022.json b/corpus/m6/live-collaboration-15/a/inbox/0022.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0022.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0023.json b/corpus/m6/live-collaboration-15/a/inbox/0023.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0023.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0024.json b/corpus/m6/live-collaboration-15/a/inbox/0024.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0024.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0025.json b/corpus/m6/live-collaboration-15/a/inbox/0025.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0025.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0026.json b/corpus/m6/live-collaboration-15/a/inbox/0026.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0026.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0027.json b/corpus/m6/live-collaboration-15/a/inbox/0027.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0027.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0028.json b/corpus/m6/live-collaboration-15/a/inbox/0028.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0028.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0029.json b/corpus/m6/live-collaboration-15/a/inbox/0029.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0029.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0030.json b/corpus/m6/live-collaboration-15/a/inbox/0030.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0030.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0031.json b/corpus/m6/live-collaboration-15/a/inbox/0031.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0031.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0032.json b/corpus/m6/live-collaboration-15/a/inbox/0032.json new file mode 100644 index 0000000000000000000000000000000000000000..d8cdeb32d6faec81266d8e3014813bab501e5532 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0032.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Rust disjoint edit.........", "text": "Client A concurrent edit."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0033.json b/corpus/m6/live-collaboration-15/a/inbox/0033.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0033.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0034.json b/corpus/m6/live-collaboration-15/a/inbox/0034.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0034.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0035.json b/corpus/m6/live-collaboration-15/a/inbox/0035.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0035.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0036.json b/corpus/m6/live-collaboration-15/a/inbox/0036.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0036.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0037.json b/corpus/m6/live-collaboration-15/a/inbox/0037.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0037.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0038.json b/corpus/m6/live-collaboration-15/a/inbox/0038.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0038.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0039.json b/corpus/m6/live-collaboration-15/a/inbox/0039.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0039.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0040.json b/corpus/m6/live-collaboration-15/a/inbox/0040.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0040.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0041.json b/corpus/m6/live-collaboration-15/a/inbox/0041.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0041.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0042.json b/corpus/m6/live-collaboration-15/a/inbox/0042.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0042.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0043.json b/corpus/m6/live-collaboration-15/a/inbox/0043.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0043.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0044.json b/corpus/m6/live-collaboration-15/a/inbox/0044.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0044.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0045.json b/corpus/m6/live-collaboration-15/a/inbox/0045.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0045.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0046.json b/corpus/m6/live-collaboration-15/a/inbox/0046.json new file mode 100644 index 0000000000000000000000000000000000000000..c4c41bebdd18f2b6c40e0ce20b4a6aefbf1fb4ab --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0046.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Native disjoint edit.", "text": "Client A offline edit."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0047.json b/corpus/m6/live-collaboration-15/a/inbox/0047.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0047.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0048.json b/corpus/m6/live-collaboration-15/a/inbox/0048.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0048.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0049.json b/corpus/m6/live-collaboration-15/a/inbox/0049.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0049.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0050.json b/corpus/m6/live-collaboration-15/a/inbox/0050.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0050.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0051.json b/corpus/m6/live-collaboration-15/a/inbox/0051.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0051.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0052.json b/corpus/m6/live-collaboration-15/a/inbox/0052.json new file mode 100644 index 0000000000000000000000000000000000000000..5982438704afb1b626a9a66112f02747adafbc83 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0052.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Client A offline edit.", "text": "Native lock recovery."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0053.json b/corpus/m6/live-collaboration-15/a/inbox/0053.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0053.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0054.json b/corpus/m6/live-collaboration-15/a/inbox/0054.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0054.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0055.json b/corpus/m6/live-collaboration-15/a/inbox/0055.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0055.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0056.json b/corpus/m6/live-collaboration-15/a/inbox/0056.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0056.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0057.json b/corpus/m6/live-collaboration-15/a/inbox/0057.json new file mode 100644 index 0000000000000000000000000000000000000000..bbd42442f8365efb4b03506312af854fb0bc3370 Binary files /dev/null and b/corpus/m6/live-collaboration-15/a/inbox/0057.json differ diff --git a/corpus/m6/live-collaboration-15/a/inbox/0058.json b/corpus/m6/live-collaboration-15/a/inbox/0058.json new file mode 100644 index 0000000000000000000000000000000000000000..bd6ceca60b983958a9c273a1ddff67877716d62a Binary files /dev/null and b/corpus/m6/live-collaboration-15/a/inbox/0058.json differ diff --git a/corpus/m6/live-collaboration-15/a/inbox/0059.json b/corpus/m6/live-collaboration-15/a/inbox/0059.json new file mode 100644 index 0000000000000000000000000000000000000000..5984bf61ecde2d07ce98c6463ae56a6fa4b228d1 Binary files /dev/null and b/corpus/m6/live-collaboration-15/a/inbox/0059.json differ diff --git a/corpus/m6/live-collaboration-15/a/inbox/0060.json b/corpus/m6/live-collaboration-15/a/inbox/0060.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0060.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0061.json b/corpus/m6/live-collaboration-15/a/inbox/0061.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0061.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/inbox/0062.json b/corpus/m6/live-collaboration-15/a/inbox/0062.json new file mode 100644 index 0000000000000000000000000000000000000000..7adf980027ef43cc77767d4fd1b1d67ad1541ab4 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/inbox/0062.json @@ -0,0 +1 @@ +{"action": "close"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/machine.json b/corpus/m6/live-collaboration-15/a/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..576ad2eb31c957d4cc40872106041ebcf4985601 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/machine.json @@ -0,0 +1 @@ +{"name": "m6-55ef988a", "hostname": "ONE-M6-55EF988A"} diff --git a/corpus/m6/live-collaboration-15/a/outbox/1/done b/corpus/m6/live-collaboration-15/a/outbox/1/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/1/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/10/done b/corpus/m6/live-collaboration-15/a/outbox/10/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/10/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/11/done b/corpus/m6/live-collaboration-15/a/outbox/11/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/11/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/11/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/11/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/11/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/11/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/11/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/11/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/12/done b/corpus/m6/live-collaboration-15/a/outbox/12/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/12/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/13/done b/corpus/m6/live-collaboration-15/a/outbox/13/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/13/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/13/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/13/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/13/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/13/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/13/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/13/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/14/done b/corpus/m6/live-collaboration-15/a/outbox/14/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/14/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/15/done b/corpus/m6/live-collaboration-15/a/outbox/15/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/15/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/15/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/15/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/15/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/15/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/15/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/15/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/16/done b/corpus/m6/live-collaboration-15/a/outbox/16/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/16/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/17/done b/corpus/m6/live-collaboration-15/a/outbox/17/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/17/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/17/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/17/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/17/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/17/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/17/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/17/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/18/done b/corpus/m6/live-collaboration-15/a/outbox/18/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/18/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/19/done b/corpus/m6/live-collaboration-15/a/outbox/19/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/19/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/19/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/19/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/19/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/19/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/19/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/19/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/2/done b/corpus/m6/live-collaboration-15/a/outbox/2/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/2/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/2/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/2/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/2/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/2/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/2/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..df225dd2c81021a9605fa989f4d7a890fb2fcd09 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/2/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/20/done b/corpus/m6/live-collaboration-15/a/outbox/20/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/20/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/21/done b/corpus/m6/live-collaboration-15/a/outbox/21/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/21/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/21/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/21/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/21/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/21/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/21/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/21/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/22/done b/corpus/m6/live-collaboration-15/a/outbox/22/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/22/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/23/done b/corpus/m6/live-collaboration-15/a/outbox/23/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/23/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/23/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/23/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/23/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/23/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/23/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/23/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/24/done b/corpus/m6/live-collaboration-15/a/outbox/24/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/24/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/25/done b/corpus/m6/live-collaboration-15/a/outbox/25/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/25/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/25/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/25/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/25/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/25/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/25/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/25/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/26/done b/corpus/m6/live-collaboration-15/a/outbox/26/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/26/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/27/done b/corpus/m6/live-collaboration-15/a/outbox/27/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/27/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/27/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/27/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/27/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/27/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/27/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/27/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/28/done b/corpus/m6/live-collaboration-15/a/outbox/28/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/28/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/29/done b/corpus/m6/live-collaboration-15/a/outbox/29/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/29/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/29/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/29/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/29/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/29/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/29/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/29/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/3/done b/corpus/m6/live-collaboration-15/a/outbox/3/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/3/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/3/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/3/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/3/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/3/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/3/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..df225dd2c81021a9605fa989f4d7a890fb2fcd09 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/3/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/30/done b/corpus/m6/live-collaboration-15/a/outbox/30/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/30/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/31/done b/corpus/m6/live-collaboration-15/a/outbox/31/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/31/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/31/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/31/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/31/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/31/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/31/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..0af3445f547c2033b88a1edcb4b9d03c409c6bd2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/31/page-0.xml @@ -0,0 +1,26 @@ + +Rust disjoint edit.........]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/32/done b/corpus/m6/live-collaboration-15/a/outbox/32/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/32/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/32/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/32/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/32/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/32/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/32/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..0af3445f547c2033b88a1edcb4b9d03c409c6bd2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/32/page-0.xml @@ -0,0 +1,26 @@ + +Rust disjoint edit.........]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/33/done b/corpus/m6/live-collaboration-15/a/outbox/33/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/33/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/34/done b/corpus/m6/live-collaboration-15/a/outbox/34/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/34/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/35/done b/corpus/m6/live-collaboration-15/a/outbox/35/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/35/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/36/done b/corpus/m6/live-collaboration-15/a/outbox/36/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/36/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/37/done b/corpus/m6/live-collaboration-15/a/outbox/37/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/37/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/38/done b/corpus/m6/live-collaboration-15/a/outbox/38/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/38/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/39/done b/corpus/m6/live-collaboration-15/a/outbox/39/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/39/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/4/done b/corpus/m6/live-collaboration-15/a/outbox/4/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/4/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/40/done b/corpus/m6/live-collaboration-15/a/outbox/40/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/40/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/41/done b/corpus/m6/live-collaboration-15/a/outbox/41/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/41/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/42/done b/corpus/m6/live-collaboration-15/a/outbox/42/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/42/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/43/done b/corpus/m6/live-collaboration-15/a/outbox/43/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/43/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/44/done b/corpus/m6/live-collaboration-15/a/outbox/44/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/44/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/45/done b/corpus/m6/live-collaboration-15/a/outbox/45/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/45/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/45/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/45/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f73cdd64bf17fe4c7c240ed615c9aeee8385111 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/45/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/45/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/45/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..bf37a59b2639314b8e7b416d0f6a9ec9d8074921 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/45/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/46/done b/corpus/m6/live-collaboration-15/a/outbox/46/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/46/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/46/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/46/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f73cdd64bf17fe4c7c240ed615c9aeee8385111 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/46/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/46/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/46/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..bf37a59b2639314b8e7b416d0f6a9ec9d8074921 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/46/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/47/done b/corpus/m6/live-collaboration-15/a/outbox/47/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/47/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/47/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/47/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f73cdd64bf17fe4c7c240ed615c9aeee8385111 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/47/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/47/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/47/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..86bb193c162a37b2ba3f49ff3277df60ec480bcc --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/47/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/48/done b/corpus/m6/live-collaboration-15/a/outbox/48/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/48/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/49/done b/corpus/m6/live-collaboration-15/a/outbox/49/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/49/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/49/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/49/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f73cdd64bf17fe4c7c240ed615c9aeee8385111 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/49/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/49/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/49/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..86bb193c162a37b2ba3f49ff3277df60ec480bcc --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/49/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/5/done b/corpus/m6/live-collaboration-15/a/outbox/5/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/5/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/5/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/5/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/5/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/5/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/5/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/5/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/50/done b/corpus/m6/live-collaboration-15/a/outbox/50/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/50/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/51/done b/corpus/m6/live-collaboration-15/a/outbox/51/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/51/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/51/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/51/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f73cdd64bf17fe4c7c240ed615c9aeee8385111 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/51/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/51/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/51/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..3f8a60c6616904f1a7e22a52b795d6f5aedc04e4 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/51/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/52/done b/corpus/m6/live-collaboration-15/a/outbox/52/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/52/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/52/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/52/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f73cdd64bf17fe4c7c240ed615c9aeee8385111 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/52/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/52/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/52/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..3f8a60c6616904f1a7e22a52b795d6f5aedc04e4 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/52/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/53/done b/corpus/m6/live-collaboration-15/a/outbox/53/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/53/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/54/done b/corpus/m6/live-collaboration-15/a/outbox/54/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/54/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/54/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/54/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f73cdd64bf17fe4c7c240ed615c9aeee8385111 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/54/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/54/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/54/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..11ce6bb6650d6225312c675d8621337f4fde906c --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/54/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/55/done b/corpus/m6/live-collaboration-15/a/outbox/55/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/55/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/56/done b/corpus/m6/live-collaboration-15/a/outbox/56/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/56/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/56/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/56/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f73cdd64bf17fe4c7c240ed615c9aeee8385111 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/56/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/56/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/56/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..11ce6bb6650d6225312c675d8621337f4fde906c --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/56/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/57/done b/corpus/m6/live-collaboration-15/a/outbox/57/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/57/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/58/done b/corpus/m6/live-collaboration-15/a/outbox/58/done new file mode 100644 index 0000000000000000000000000000000000000000..09f370e38f498a462e1ca0faa724559b6630c04f Binary files /dev/null and b/corpus/m6/live-collaboration-15/a/outbox/58/done differ diff --git a/corpus/m6/live-collaboration-15/a/outbox/59/done b/corpus/m6/live-collaboration-15/a/outbox/59/done new file mode 100644 index 0000000000000000000000000000000000000000..09f370e38f498a462e1ca0faa724559b6630c04f Binary files /dev/null and b/corpus/m6/live-collaboration-15/a/outbox/59/done differ diff --git a/corpus/m6/live-collaboration-15/a/outbox/59/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/59/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..f80e05555e15e68e783487c2e6e3b449dabe2e0e Binary files /dev/null and b/corpus/m6/live-collaboration-15/a/outbox/59/hierarchy.xml differ diff --git a/corpus/m6/live-collaboration-15/a/outbox/59/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/59/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..53c9a4a510d34a491a7901c4a53f86b90b0a52d3 Binary files /dev/null and b/corpus/m6/live-collaboration-15/a/outbox/59/page-0.xml differ diff --git a/corpus/m6/live-collaboration-15/a/outbox/6/done b/corpus/m6/live-collaboration-15/a/outbox/6/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/6/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/60/done b/corpus/m6/live-collaboration-15/a/outbox/60/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/60/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/61/done b/corpus/m6/live-collaboration-15/a/outbox/61/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/61/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/61/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/61/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f73cdd64bf17fe4c7c240ed615c9aeee8385111 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/61/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/61/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/61/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..11ce6bb6650d6225312c675d8621337f4fde906c --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/61/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/62/done b/corpus/m6/live-collaboration-15/a/outbox/62/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/62/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/7/done b/corpus/m6/live-collaboration-15/a/outbox/7/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/7/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/7/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/7/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/7/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/7/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/7/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/7/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/outbox/8/done b/corpus/m6/live-collaboration-15/a/outbox/8/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/8/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/9/done b/corpus/m6/live-collaboration-15/a/outbox/9/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/9/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/outbox/9/hierarchy.xml b/corpus/m6/live-collaboration-15/a/outbox/9/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..93eeed875f123275865d5a4841cbca3ce09a1d26 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/9/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/a/outbox/9/page-0.xml b/corpus/m6/live-collaboration-15/a/outbox/9/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/outbox/9/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/ready b/corpus/m6/live-collaboration-15/a/ready new file mode 100644 index 0000000000000000000000000000000000000000..ad50b53407197828b2a130a6ba58b9a4a4a62617 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/ready @@ -0,0 +1 @@ +ready \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0002.xml b/corpus/m6/live-collaboration-15/a/snapshot-0002.xml new file mode 100644 index 0000000000000000000000000000000000000000..df225dd2c81021a9605fa989f4d7a890fb2fcd09 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0002.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0005.xml b/corpus/m6/live-collaboration-15/a/snapshot-0005.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0005.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0007.xml b/corpus/m6/live-collaboration-15/a/snapshot-0007.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0007.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0009.xml b/corpus/m6/live-collaboration-15/a/snapshot-0009.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0009.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0011.xml b/corpus/m6/live-collaboration-15/a/snapshot-0011.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0011.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0013.xml b/corpus/m6/live-collaboration-15/a/snapshot-0013.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0013.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0015.xml b/corpus/m6/live-collaboration-15/a/snapshot-0015.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0015.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0017.xml b/corpus/m6/live-collaboration-15/a/snapshot-0017.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0017.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0019.xml b/corpus/m6/live-collaboration-15/a/snapshot-0019.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0019.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0021.xml b/corpus/m6/live-collaboration-15/a/snapshot-0021.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0021.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0023.xml b/corpus/m6/live-collaboration-15/a/snapshot-0023.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0023.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0025.xml b/corpus/m6/live-collaboration-15/a/snapshot-0025.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0025.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0027.xml b/corpus/m6/live-collaboration-15/a/snapshot-0027.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0027.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0029.xml b/corpus/m6/live-collaboration-15/a/snapshot-0029.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7197715f49b2dffc7088c4f7fc81958955addb9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0029.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0031.xml b/corpus/m6/live-collaboration-15/a/snapshot-0031.xml new file mode 100644 index 0000000000000000000000000000000000000000..0af3445f547c2033b88a1edcb4b9d03c409c6bd2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0031.xml @@ -0,0 +1,26 @@ + +Rust disjoint edit.........]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0045.xml b/corpus/m6/live-collaboration-15/a/snapshot-0045.xml new file mode 100644 index 0000000000000000000000000000000000000000..bf37a59b2639314b8e7b416d0f6a9ec9d8074921 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0045.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0047.xml b/corpus/m6/live-collaboration-15/a/snapshot-0047.xml new file mode 100644 index 0000000000000000000000000000000000000000..86bb193c162a37b2ba3f49ff3277df60ec480bcc --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0047.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0049.xml b/corpus/m6/live-collaboration-15/a/snapshot-0049.xml new file mode 100644 index 0000000000000000000000000000000000000000..86bb193c162a37b2ba3f49ff3277df60ec480bcc --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0049.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0051.xml b/corpus/m6/live-collaboration-15/a/snapshot-0051.xml new file mode 100644 index 0000000000000000000000000000000000000000..3f8a60c6616904f1a7e22a52b795d6f5aedc04e4 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0051.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0054.xml b/corpus/m6/live-collaboration-15/a/snapshot-0054.xml new file mode 100644 index 0000000000000000000000000000000000000000..11ce6bb6650d6225312c675d8621337f4fde906c --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0054.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0056.xml b/corpus/m6/live-collaboration-15/a/snapshot-0056.xml new file mode 100644 index 0000000000000000000000000000000000000000..11ce6bb6650d6225312c675d8621337f4fde906c --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0056.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0059.xml b/corpus/m6/live-collaboration-15/a/snapshot-0059.xml new file mode 100644 index 0000000000000000000000000000000000000000..11ce6bb6650d6225312c675d8621337f4fde906c --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0059.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/snapshot-0061.xml b/corpus/m6/live-collaboration-15/a/snapshot-0061.xml new file mode 100644 index 0000000000000000000000000000000000000000..11ce6bb6650d6225312c675d8621337f4fde906c --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/snapshot-0061.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/a/spawn-0.json b/corpus/m6/live-collaboration-15/a/spawn-0.json new file mode 100644 index 0000000000000000000000000000000000000000..ee4bf997469d9a1a5e888e2fcf8b8a320a0831ec --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/spawn-0.json @@ -0,0 +1,4 @@ +{ + "pid": 2404, + "error": null +} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/spawn-59.json b/corpus/m6/live-collaboration-15/a/spawn-59.json new file mode 100644 index 0000000000000000000000000000000000000000..eacc00b17dadca34c9b0ebf208c9786fb9fefc9d --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/spawn-59.json @@ -0,0 +1,4 @@ +{ + "pid": 2296, + "error": null +} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/a/teardown.json b/corpus/m6/live-collaboration-15/a/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/live-collaboration-15/a/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/live-collaboration-15/b/agent.py b/corpus/m6/live-collaboration-15/b/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/live-collaboration-15/b/closed b/corpus/m6/live-collaboration-15/b/closed new file mode 100644 index 0000000000000000000000000000000000000000..277f9daa9548d402d4174aa1f585b80ea9e20806 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/closed @@ -0,0 +1 @@ +closed \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0001.json b/corpus/m6/live-collaboration-15/b/command-0001.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0001.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0002.json b/corpus/m6/live-collaboration-15/b/command-0002.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0002.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0003.json b/corpus/m6/live-collaboration-15/b/command-0003.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0003.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0004.json b/corpus/m6/live-collaboration-15/b/command-0004.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0004.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0005.json b/corpus/m6/live-collaboration-15/b/command-0005.json new file mode 100644 index 0000000000000000000000000000000000000000..8b204bc272e0e635045ab160d68759138dbe684d --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0005.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Rust disjoint edit.........", "text": "Client B concurrent edit."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0006.json b/corpus/m6/live-collaboration-15/b/command-0006.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0006.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0007.json b/corpus/m6/live-collaboration-15/b/command-0007.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0007.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0008.json b/corpus/m6/live-collaboration-15/b/command-0008.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0008.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0009.json b/corpus/m6/live-collaboration-15/b/command-0009.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0009.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0010.json b/corpus/m6/live-collaboration-15/b/command-0010.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0010.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0011.json b/corpus/m6/live-collaboration-15/b/command-0011.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0011.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0012.json b/corpus/m6/live-collaboration-15/b/command-0012.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0012.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0013.json b/corpus/m6/live-collaboration-15/b/command-0013.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0013.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0014.json b/corpus/m6/live-collaboration-15/b/command-0014.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0014.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0015.json b/corpus/m6/live-collaboration-15/b/command-0015.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0015.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0016.json b/corpus/m6/live-collaboration-15/b/command-0016.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0016.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0017.json b/corpus/m6/live-collaboration-15/b/command-0017.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0017.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0018.json b/corpus/m6/live-collaboration-15/b/command-0018.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0018.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0019.json b/corpus/m6/live-collaboration-15/b/command-0019.json new file mode 100644 index 0000000000000000000000000000000000000000..4a42cca4bc6997c829fae8c9911143eb01c6902d --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0019.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Left cell", "text": "Client B online cell."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0020.json b/corpus/m6/live-collaboration-15/b/command-0020.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0020.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0021.json b/corpus/m6/live-collaboration-15/b/command-0021.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0021.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0022.json b/corpus/m6/live-collaboration-15/b/command-0022.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0022.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0023.json b/corpus/m6/live-collaboration-15/b/command-0023.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0023.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0024.json b/corpus/m6/live-collaboration-15/b/command-0024.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0024.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0025.json b/corpus/m6/live-collaboration-15/b/command-0025.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0025.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0026.json b/corpus/m6/live-collaboration-15/b/command-0026.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0026.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0027.json b/corpus/m6/live-collaboration-15/b/command-0027.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0027.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0028.json b/corpus/m6/live-collaboration-15/b/command-0028.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0028.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0029.json b/corpus/m6/live-collaboration-15/b/command-0029.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0029.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0030.json b/corpus/m6/live-collaboration-15/b/command-0030.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0030.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0031.json b/corpus/m6/live-collaboration-15/b/command-0031.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0031.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0032.json b/corpus/m6/live-collaboration-15/b/command-0032.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0032.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0033.json b/corpus/m6/live-collaboration-15/b/command-0033.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0033.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0034.json b/corpus/m6/live-collaboration-15/b/command-0034.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0034.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0035.json b/corpus/m6/live-collaboration-15/b/command-0035.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0035.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0036.json b/corpus/m6/live-collaboration-15/b/command-0036.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0036.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0037.json b/corpus/m6/live-collaboration-15/b/command-0037.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0037.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0038.json b/corpus/m6/live-collaboration-15/b/command-0038.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0038.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0039.json b/corpus/m6/live-collaboration-15/b/command-0039.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0039.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0040.json b/corpus/m6/live-collaboration-15/b/command-0040.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0040.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0041.json b/corpus/m6/live-collaboration-15/b/command-0041.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0041.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0042.json b/corpus/m6/live-collaboration-15/b/command-0042.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0042.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0043.json b/corpus/m6/live-collaboration-15/b/command-0043.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0043.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0044.json b/corpus/m6/live-collaboration-15/b/command-0044.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0044.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0045.json b/corpus/m6/live-collaboration-15/b/command-0045.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0045.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0046.json b/corpus/m6/live-collaboration-15/b/command-0046.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0046.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0047.json b/corpus/m6/live-collaboration-15/b/command-0047.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0047.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0048.json b/corpus/m6/live-collaboration-15/b/command-0048.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0048.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0049.json b/corpus/m6/live-collaboration-15/b/command-0049.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0049.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0050.json b/corpus/m6/live-collaboration-15/b/command-0050.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0050.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0051.json b/corpus/m6/live-collaboration-15/b/command-0051.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0051.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0052.json b/corpus/m6/live-collaboration-15/b/command-0052.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0052.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0053.json b/corpus/m6/live-collaboration-15/b/command-0053.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0053.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0054.json b/corpus/m6/live-collaboration-15/b/command-0054.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0054.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0055.json b/corpus/m6/live-collaboration-15/b/command-0055.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0055.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/command-0056.json b/corpus/m6/live-collaboration-15/b/command-0056.json new file mode 100644 index 0000000000000000000000000000000000000000..7adf980027ef43cc77767d4fd1b1d67ad1541ab4 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/command-0056.json @@ -0,0 +1 @@ +{"action": "close"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/commands.jsonl b/corpus/m6/live-collaboration-15/b/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..e991e2c69b9c56dce40166a762ed3c1f9f6e1ecd --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/commands.jsonl @@ -0,0 +1,63 @@ +{"command": "mkdir C:\\one-tests\\runs\\capture", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -ExecutionPolicy Bypass -File C:\\one-tests\\network.ps1 -LabMac 52:54:02:70:5a:72", "exit": 0, "stdout": "{\"renewalResult\":0,\"releaseResult\":83,\"mac\":\"52:54:02:70:5a:72\",\"address\":\"192.168.77.159\"}\r\n", "stderr": "", "error": null} +{"command": "ipconfig", "exit": 0, "stdout": "\r\nWindows IP Configuration\r\n\r\n\r\nEthernet adapter Local Area Connection 2:\r\n\r\n Connection-specific DNS Suffix . : \r\n Link-local IPv6 Address . . . . . : fe80::fdc9:d8f5:ed53:866%13\r\n IPv4 Address. . . . . . . . . . . : 192.168.77.159\r\n Subnet Mask . . . . . . . . . . . : 255.255.255.0\r\n Default Gateway . . . . . . . . . : \r\n\r\nEthernet adapter Local Area Connection:\r\n\r\n Connection-specific DNS Suffix . : \r\n Site-local IPv6 Address . . . . . : fec0::b1bf:9d18:ecc0:6131%1\r\n Link-local IPv6 Address . . . . . : fe80::b1bf:9d18:ecc0:6131%11\r\n IPv4 Address. . . . . . . . . . . : 10.0.2.15\r\n Subnet Mask . . . . . . . . . . . : 255.255.255.0\r\n Default Gateway . . . . . . . . . : fe80::2%11\r\n 10.0.2.2\r\n\r\nTunnel adapter isatap.{2913F119-34A2-4D05-B185-573FF3B2121A}:\r\n\r\n Media State . . . . . . . . . . . : Media disconnected\r\n Connection-specific DNS Suffix . : \r\n\r\nTunnel adapter isatap.{A59CB099-98D4-4C81-9159-48128C5EBB69}:\r\n\r\n Media State . . . . . . . . . . . : Media disconnected\r\n Connection-specific DNS Suffix . : \r\n", "stderr": "", "error": null} +{"command": "dir \\\\192.168.77.1\\agent\\m6-collaboration", "exit": 0, "stdout": " Volume in drive \\\\192.168.77.1\\agent is agent\r\n Volume Serial Number is 640F-A719\r\n\r\n Directory of \\\\192.168.77.1\\agent\\m6-collaboration\r\n\r\n09/05/2026 10:58 PM .\r\n09/05/2026 10:58 PM ..\r\n09/04/2026 10:12 PM 4,944 Open Notebook.onetoc2\r\n09/04/2026 10:12 PM 27,808 synthetic.one\r\n 2 File(s) 32,752 bytes\r\n 2 Dir(s) 14,688,845,824 bytes free\r\n", "stderr": "", "error": null} +{"command": "if exist C:\\one-tests\\runs\\capture\\ready del C:\\one-tests\\runs\\capture\\ready", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "ipconfig", "exit": 0, "stdout": "\r\nWindows IP Configuration\r\n\r\n\r\nEthernet adapter Local Area Connection 2:\r\n\r\n Connection-specific DNS Suffix . : \r\n Link-local IPv6 Address . . . . . : fe80::fdc9:d8f5:ed53:866%13\r\n IPv4 Address. . . . . . . . . . . : 192.168.77.159\r\n Subnet Mask . . . . . . . . . . . : 255.255.255.0\r\n Default Gateway . . . . . . . . . : \r\n\r\nEthernet adapter Local Area Connection:\r\n\r\n Connection-specific DNS Suffix . : \r\n Site-local IPv6 Address . . . . . : fec0::b1bf:9d18:ecc0:6131%1\r\n Link-local IPv6 Address . . . . . : fe80::b1bf:9d18:ecc0:6131%11\r\n IPv4 Address. . . . . . . . . . . : 10.0.2.15\r\n Subnet Mask . . . . . . . . . . . : 255.255.255.0\r\n Default Gateway . . . . . . . . . : fe80::2%11\r\n 10.0.2.2\r\n\r\nTunnel adapter isatap.{2913F119-34A2-4D05-B185-573FF3B2121A}:\r\n\r\n Media State . . . . . . . . . . . : Media disconnected\r\n Connection-specific DNS Suffix . : \r\n\r\nTunnel adapter isatap.{A59CB099-98D4-4C81-9159-48128C5EBB69}:\r\n\r\n Media State . . . . . . . . . . . : Media disconnected\r\n Connection-specific DNS Suffix . : \r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0001.tmp C:\\one-tests\\runs\\capture\\inbox\\0001.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0002.tmp C:\\one-tests\\runs\\capture\\inbox\\0002.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0003.tmp C:\\one-tests\\runs\\capture\\inbox\\0003.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0004.tmp C:\\one-tests\\runs\\capture\\inbox\\0004.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0005.tmp C:\\one-tests\\runs\\capture\\inbox\\0005.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0006.tmp C:\\one-tests\\runs\\capture\\inbox\\0006.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0007.tmp C:\\one-tests\\runs\\capture\\inbox\\0007.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0008.tmp C:\\one-tests\\runs\\capture\\inbox\\0008.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0009.tmp C:\\one-tests\\runs\\capture\\inbox\\0009.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0010.tmp C:\\one-tests\\runs\\capture\\inbox\\0010.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0011.tmp C:\\one-tests\\runs\\capture\\inbox\\0011.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0012.tmp C:\\one-tests\\runs\\capture\\inbox\\0012.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0013.tmp C:\\one-tests\\runs\\capture\\inbox\\0013.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0014.tmp C:\\one-tests\\runs\\capture\\inbox\\0014.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0015.tmp C:\\one-tests\\runs\\capture\\inbox\\0015.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0016.tmp C:\\one-tests\\runs\\capture\\inbox\\0016.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0017.tmp C:\\one-tests\\runs\\capture\\inbox\\0017.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0018.tmp C:\\one-tests\\runs\\capture\\inbox\\0018.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0019.tmp C:\\one-tests\\runs\\capture\\inbox\\0019.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0020.tmp C:\\one-tests\\runs\\capture\\inbox\\0020.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0021.tmp C:\\one-tests\\runs\\capture\\inbox\\0021.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0022.tmp C:\\one-tests\\runs\\capture\\inbox\\0022.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0023.tmp C:\\one-tests\\runs\\capture\\inbox\\0023.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0024.tmp C:\\one-tests\\runs\\capture\\inbox\\0024.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0025.tmp C:\\one-tests\\runs\\capture\\inbox\\0025.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0026.tmp C:\\one-tests\\runs\\capture\\inbox\\0026.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0027.tmp C:\\one-tests\\runs\\capture\\inbox\\0027.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0028.tmp C:\\one-tests\\runs\\capture\\inbox\\0028.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0029.tmp C:\\one-tests\\runs\\capture\\inbox\\0029.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0030.tmp C:\\one-tests\\runs\\capture\\inbox\\0030.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0031.tmp C:\\one-tests\\runs\\capture\\inbox\\0031.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0032.tmp C:\\one-tests\\runs\\capture\\inbox\\0032.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0033.tmp C:\\one-tests\\runs\\capture\\inbox\\0033.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0034.tmp C:\\one-tests\\runs\\capture\\inbox\\0034.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0035.tmp C:\\one-tests\\runs\\capture\\inbox\\0035.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0036.tmp C:\\one-tests\\runs\\capture\\inbox\\0036.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0037.tmp C:\\one-tests\\runs\\capture\\inbox\\0037.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0038.tmp C:\\one-tests\\runs\\capture\\inbox\\0038.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0039.tmp C:\\one-tests\\runs\\capture\\inbox\\0039.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0040.tmp C:\\one-tests\\runs\\capture\\inbox\\0040.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0041.tmp C:\\one-tests\\runs\\capture\\inbox\\0041.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0042.tmp C:\\one-tests\\runs\\capture\\inbox\\0042.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0043.tmp C:\\one-tests\\runs\\capture\\inbox\\0043.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0044.tmp C:\\one-tests\\runs\\capture\\inbox\\0044.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0045.tmp C:\\one-tests\\runs\\capture\\inbox\\0045.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0046.tmp C:\\one-tests\\runs\\capture\\inbox\\0046.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0047.tmp C:\\one-tests\\runs\\capture\\inbox\\0047.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0048.tmp C:\\one-tests\\runs\\capture\\inbox\\0048.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0049.tmp C:\\one-tests\\runs\\capture\\inbox\\0049.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0050.tmp C:\\one-tests\\runs\\capture\\inbox\\0050.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0051.tmp C:\\one-tests\\runs\\capture\\inbox\\0051.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0052.tmp C:\\one-tests\\runs\\capture\\inbox\\0052.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0053.tmp C:\\one-tests\\runs\\capture\\inbox\\0053.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0054.tmp C:\\one-tests\\runs\\capture\\inbox\\0054.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0055.tmp C:\\one-tests\\runs\\capture\\inbox\\0055.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "move C:\\one-tests\\runs\\capture\\inbox\\0056.tmp C:\\one-tests\\runs\\capture\\inbox\\0056.json", "exit": 0, "stdout": " 1 file(s) moved.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/live-collaboration-15/b/controller-0.log b/corpus/m6/live-collaboration-15/b/controller-0.log new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/corpus/m6/live-collaboration-15/b/health.json b/corpus/m6/live-collaboration-15/b/health.json new file mode 100644 index 0000000000000000000000000000000000000000..6ec02e53ea2fa6cc4285b199329d5d9893b0e7b7 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-F79A3B95", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/live-collaboration-15/b/inbox/0001.json b/corpus/m6/live-collaboration-15/b/inbox/0001.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0001.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0002.json b/corpus/m6/live-collaboration-15/b/inbox/0002.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0002.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0003.json b/corpus/m6/live-collaboration-15/b/inbox/0003.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0003.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0004.json b/corpus/m6/live-collaboration-15/b/inbox/0004.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0004.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0005.json b/corpus/m6/live-collaboration-15/b/inbox/0005.json new file mode 100644 index 0000000000000000000000000000000000000000..8b204bc272e0e635045ab160d68759138dbe684d --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0005.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Rust disjoint edit.........", "text": "Client B concurrent edit."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0006.json b/corpus/m6/live-collaboration-15/b/inbox/0006.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0006.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0007.json b/corpus/m6/live-collaboration-15/b/inbox/0007.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0007.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0008.json b/corpus/m6/live-collaboration-15/b/inbox/0008.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0008.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0009.json b/corpus/m6/live-collaboration-15/b/inbox/0009.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0009.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0010.json b/corpus/m6/live-collaboration-15/b/inbox/0010.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0010.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0011.json b/corpus/m6/live-collaboration-15/b/inbox/0011.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0011.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0012.json b/corpus/m6/live-collaboration-15/b/inbox/0012.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0012.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0013.json b/corpus/m6/live-collaboration-15/b/inbox/0013.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0013.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0014.json b/corpus/m6/live-collaboration-15/b/inbox/0014.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0014.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0015.json b/corpus/m6/live-collaboration-15/b/inbox/0015.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0015.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0016.json b/corpus/m6/live-collaboration-15/b/inbox/0016.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0016.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0017.json b/corpus/m6/live-collaboration-15/b/inbox/0017.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0017.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0018.json b/corpus/m6/live-collaboration-15/b/inbox/0018.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0018.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0019.json b/corpus/m6/live-collaboration-15/b/inbox/0019.json new file mode 100644 index 0000000000000000000000000000000000000000..4a42cca4bc6997c829fae8c9911143eb01c6902d --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0019.json @@ -0,0 +1 @@ +{"action": "edit", "expected": "Left cell", "text": "Client B online cell."} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0020.json b/corpus/m6/live-collaboration-15/b/inbox/0020.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0020.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0021.json b/corpus/m6/live-collaboration-15/b/inbox/0021.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0021.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0022.json b/corpus/m6/live-collaboration-15/b/inbox/0022.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0022.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0023.json b/corpus/m6/live-collaboration-15/b/inbox/0023.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0023.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0024.json b/corpus/m6/live-collaboration-15/b/inbox/0024.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0024.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0025.json b/corpus/m6/live-collaboration-15/b/inbox/0025.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0025.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0026.json b/corpus/m6/live-collaboration-15/b/inbox/0026.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0026.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0027.json b/corpus/m6/live-collaboration-15/b/inbox/0027.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0027.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0028.json b/corpus/m6/live-collaboration-15/b/inbox/0028.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0028.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0029.json b/corpus/m6/live-collaboration-15/b/inbox/0029.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0029.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0030.json b/corpus/m6/live-collaboration-15/b/inbox/0030.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0030.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0031.json b/corpus/m6/live-collaboration-15/b/inbox/0031.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0031.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0032.json b/corpus/m6/live-collaboration-15/b/inbox/0032.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0032.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0033.json b/corpus/m6/live-collaboration-15/b/inbox/0033.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0033.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0034.json b/corpus/m6/live-collaboration-15/b/inbox/0034.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0034.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0035.json b/corpus/m6/live-collaboration-15/b/inbox/0035.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0035.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0036.json b/corpus/m6/live-collaboration-15/b/inbox/0036.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0036.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0037.json b/corpus/m6/live-collaboration-15/b/inbox/0037.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0037.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0038.json b/corpus/m6/live-collaboration-15/b/inbox/0038.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0038.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0039.json b/corpus/m6/live-collaboration-15/b/inbox/0039.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0039.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0040.json b/corpus/m6/live-collaboration-15/b/inbox/0040.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0040.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0041.json b/corpus/m6/live-collaboration-15/b/inbox/0041.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0041.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0042.json b/corpus/m6/live-collaboration-15/b/inbox/0042.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0042.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0043.json b/corpus/m6/live-collaboration-15/b/inbox/0043.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0043.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0044.json b/corpus/m6/live-collaboration-15/b/inbox/0044.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0044.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0045.json b/corpus/m6/live-collaboration-15/b/inbox/0045.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0045.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0046.json b/corpus/m6/live-collaboration-15/b/inbox/0046.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0046.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0047.json b/corpus/m6/live-collaboration-15/b/inbox/0047.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0047.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0048.json b/corpus/m6/live-collaboration-15/b/inbox/0048.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0048.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0049.json b/corpus/m6/live-collaboration-15/b/inbox/0049.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0049.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0050.json b/corpus/m6/live-collaboration-15/b/inbox/0050.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0050.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0051.json b/corpus/m6/live-collaboration-15/b/inbox/0051.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0051.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0052.json b/corpus/m6/live-collaboration-15/b/inbox/0052.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0052.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0053.json b/corpus/m6/live-collaboration-15/b/inbox/0053.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0053.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0054.json b/corpus/m6/live-collaboration-15/b/inbox/0054.json new file mode 100644 index 0000000000000000000000000000000000000000..2272087176d433cd1d42b77fb18efd145b9bbbf5 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0054.json @@ -0,0 +1 @@ +{"action": "sync"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0055.json b/corpus/m6/live-collaboration-15/b/inbox/0055.json new file mode 100644 index 0000000000000000000000000000000000000000..554ff0ef8a35478d74f3e5388f75789140b158b8 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0055.json @@ -0,0 +1 @@ +{"action": "snapshot"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/inbox/0056.json b/corpus/m6/live-collaboration-15/b/inbox/0056.json new file mode 100644 index 0000000000000000000000000000000000000000..7adf980027ef43cc77767d4fd1b1d67ad1541ab4 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/inbox/0056.json @@ -0,0 +1 @@ +{"action": "close"} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/machine.json b/corpus/m6/live-collaboration-15/b/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..5e63a12a287d2e21ee151c37ce58d857ffe998f6 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/machine.json @@ -0,0 +1 @@ +{"name": "m6-f79a3b95", "hostname": "ONE-M6-F79A3B95"} diff --git a/corpus/m6/live-collaboration-15/b/outbox/1/done b/corpus/m6/live-collaboration-15/b/outbox/1/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/1/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/10/done b/corpus/m6/live-collaboration-15/b/outbox/10/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/10/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/11/done b/corpus/m6/live-collaboration-15/b/outbox/11/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/11/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/12/done b/corpus/m6/live-collaboration-15/b/outbox/12/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/12/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/13/done b/corpus/m6/live-collaboration-15/b/outbox/13/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/13/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/14/done b/corpus/m6/live-collaboration-15/b/outbox/14/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/14/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/15/done b/corpus/m6/live-collaboration-15/b/outbox/15/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/15/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/16/done b/corpus/m6/live-collaboration-15/b/outbox/16/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/16/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/17/done b/corpus/m6/live-collaboration-15/b/outbox/17/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/17/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/18/done b/corpus/m6/live-collaboration-15/b/outbox/18/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/18/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/18/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/18/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..544ca571d7c7d2d5f042dd1aaaeb1126c5fd2a3d --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/18/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/18/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/18/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..6b5b83c53bd56a9bdf959c4eff10d04ad95df601 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/18/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/19/done b/corpus/m6/live-collaboration-15/b/outbox/19/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/19/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/19/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/19/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..544ca571d7c7d2d5f042dd1aaaeb1126c5fd2a3d --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/19/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/19/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/19/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..6b5b83c53bd56a9bdf959c4eff10d04ad95df601 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/19/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/2/done b/corpus/m6/live-collaboration-15/b/outbox/2/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/2/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/2/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/2/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..d81a08ffdf5def3c19ad7774df9dd4a73cdc971e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/2/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/2/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/2/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..a740e1e23afd2c9124aee4e63f33ab005f41b3f0 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/2/page-0.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/20/done b/corpus/m6/live-collaboration-15/b/outbox/20/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/20/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/21/done b/corpus/m6/live-collaboration-15/b/outbox/21/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/21/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/21/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/21/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..04b6757e03e794f8f62c9354b24402d6700e1679 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/21/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/21/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/21/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..3714f31e7c2382407bf0e52ebedad6234e7559df --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/21/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/22/done b/corpus/m6/live-collaboration-15/b/outbox/22/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/22/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/23/done b/corpus/m6/live-collaboration-15/b/outbox/23/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/23/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/23/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/23/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/23/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/23/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/23/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/23/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/24/done b/corpus/m6/live-collaboration-15/b/outbox/24/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/24/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/25/done b/corpus/m6/live-collaboration-15/b/outbox/25/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/25/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/25/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/25/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/25/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/25/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/25/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/25/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/26/done b/corpus/m6/live-collaboration-15/b/outbox/26/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/26/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/27/done b/corpus/m6/live-collaboration-15/b/outbox/27/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/27/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/27/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/27/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/27/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/27/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/27/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/27/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/28/done b/corpus/m6/live-collaboration-15/b/outbox/28/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/28/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/29/done b/corpus/m6/live-collaboration-15/b/outbox/29/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/29/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/29/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/29/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/29/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/29/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/29/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/29/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/3/done b/corpus/m6/live-collaboration-15/b/outbox/3/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/3/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/30/done b/corpus/m6/live-collaboration-15/b/outbox/30/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/30/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/31/done b/corpus/m6/live-collaboration-15/b/outbox/31/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/31/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/31/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/31/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/31/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/31/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/31/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/31/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/32/done b/corpus/m6/live-collaboration-15/b/outbox/32/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/32/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/33/done b/corpus/m6/live-collaboration-15/b/outbox/33/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/33/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/33/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/33/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/33/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/33/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/33/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/33/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/34/done b/corpus/m6/live-collaboration-15/b/outbox/34/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/34/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/35/done b/corpus/m6/live-collaboration-15/b/outbox/35/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/35/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/35/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/35/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/35/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/35/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/35/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/35/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/36/done b/corpus/m6/live-collaboration-15/b/outbox/36/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/36/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/37/done b/corpus/m6/live-collaboration-15/b/outbox/37/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/37/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/37/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/37/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/37/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/37/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/37/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/37/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/38/done b/corpus/m6/live-collaboration-15/b/outbox/38/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/38/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/39/done b/corpus/m6/live-collaboration-15/b/outbox/39/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/39/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/39/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/39/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/39/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/39/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/39/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/39/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/4/done b/corpus/m6/live-collaboration-15/b/outbox/4/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/4/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/4/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/4/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..d81a08ffdf5def3c19ad7774df9dd4a73cdc971e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/4/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/4/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/4/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..19a4d147f6fa80ff1ca8388764ca5ce2c78be0e0 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/4/page-0.xml @@ -0,0 +1,26 @@ + +Rust disjoint edit.........]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/40/done b/corpus/m6/live-collaboration-15/b/outbox/40/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/40/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/41/done b/corpus/m6/live-collaboration-15/b/outbox/41/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/41/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/41/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/41/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/41/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/41/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/41/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/41/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/42/done b/corpus/m6/live-collaboration-15/b/outbox/42/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/42/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/43/done b/corpus/m6/live-collaboration-15/b/outbox/43/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/43/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/43/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/43/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/43/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/43/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/43/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/43/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/44/done b/corpus/m6/live-collaboration-15/b/outbox/44/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/44/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/45/done b/corpus/m6/live-collaboration-15/b/outbox/45/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/45/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/45/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/45/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/45/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/45/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/45/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/45/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/46/done b/corpus/m6/live-collaboration-15/b/outbox/46/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/46/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/47/done b/corpus/m6/live-collaboration-15/b/outbox/47/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/47/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/47/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/47/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/47/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/47/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/47/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/47/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/48/done b/corpus/m6/live-collaboration-15/b/outbox/48/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/48/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/49/done b/corpus/m6/live-collaboration-15/b/outbox/49/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/49/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/49/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/49/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/49/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/49/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/49/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/49/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/5/done b/corpus/m6/live-collaboration-15/b/outbox/5/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/5/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/5/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/5/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..d81a08ffdf5def3c19ad7774df9dd4a73cdc971e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/5/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/5/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/5/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..19a4d147f6fa80ff1ca8388764ca5ce2c78be0e0 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/5/page-0.xml @@ -0,0 +1,26 @@ + +Rust disjoint edit.........]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/50/done b/corpus/m6/live-collaboration-15/b/outbox/50/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/50/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/51/done b/corpus/m6/live-collaboration-15/b/outbox/51/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/51/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/51/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/51/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/51/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/51/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/51/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..2033749ffc01f7662c9726f9682de93bc4eb141a --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/51/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/52/done b/corpus/m6/live-collaboration-15/b/outbox/52/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/52/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/53/done b/corpus/m6/live-collaboration-15/b/outbox/53/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/53/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/53/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/53/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/53/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/53/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/53/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..2033749ffc01f7662c9726f9682de93bc4eb141a --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/53/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/54/done b/corpus/m6/live-collaboration-15/b/outbox/54/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/54/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/55/done b/corpus/m6/live-collaboration-15/b/outbox/55/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/55/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/55/hierarchy.xml b/corpus/m6/live-collaboration-15/b/outbox/55/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d194cb6e987b2847d7ecf6de0a446a5d1338c6e --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/55/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-15/b/outbox/55/page-0.xml b/corpus/m6/live-collaboration-15/b/outbox/55/page-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..2033749ffc01f7662c9726f9682de93bc4eb141a --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/55/page-0.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/outbox/56/done b/corpus/m6/live-collaboration-15/b/outbox/56/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/56/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/6/done b/corpus/m6/live-collaboration-15/b/outbox/6/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/6/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/7/done b/corpus/m6/live-collaboration-15/b/outbox/7/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/7/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/8/done b/corpus/m6/live-collaboration-15/b/outbox/8/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/8/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/outbox/9/done b/corpus/m6/live-collaboration-15/b/outbox/9/done new file mode 100644 index 0000000000000000000000000000000000000000..b5754e20373fdaa5331ef6e4623dbae636225e3b --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/outbox/9/done @@ -0,0 +1 @@ +ok \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/ready b/corpus/m6/live-collaboration-15/b/ready new file mode 100644 index 0000000000000000000000000000000000000000..ad50b53407197828b2a130a6ba58b9a4a4a62617 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/ready @@ -0,0 +1 @@ +ready \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0002.xml b/corpus/m6/live-collaboration-15/b/snapshot-0002.xml new file mode 100644 index 0000000000000000000000000000000000000000..a740e1e23afd2c9124aee4e63f33ab005f41b3f0 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0002.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0004.xml b/corpus/m6/live-collaboration-15/b/snapshot-0004.xml new file mode 100644 index 0000000000000000000000000000000000000000..19a4d147f6fa80ff1ca8388764ca5ce2c78be0e0 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0004.xml @@ -0,0 +1,26 @@ + +Rust disjoint edit.........]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0018.xml b/corpus/m6/live-collaboration-15/b/snapshot-0018.xml new file mode 100644 index 0000000000000000000000000000000000000000..6b5b83c53bd56a9bdf959c4eff10d04ad95df601 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0018.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0021.xml b/corpus/m6/live-collaboration-15/b/snapshot-0021.xml new file mode 100644 index 0000000000000000000000000000000000000000..3714f31e7c2382407bf0e52ebedad6234e7559df --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0021.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0023.xml b/corpus/m6/live-collaboration-15/b/snapshot-0023.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0023.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0025.xml b/corpus/m6/live-collaboration-15/b/snapshot-0025.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0025.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0027.xml b/corpus/m6/live-collaboration-15/b/snapshot-0027.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0027.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0029.xml b/corpus/m6/live-collaboration-15/b/snapshot-0029.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0029.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0031.xml b/corpus/m6/live-collaboration-15/b/snapshot-0031.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0031.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0033.xml b/corpus/m6/live-collaboration-15/b/snapshot-0033.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0033.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0035.xml b/corpus/m6/live-collaboration-15/b/snapshot-0035.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0035.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0037.xml b/corpus/m6/live-collaboration-15/b/snapshot-0037.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0037.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0039.xml b/corpus/m6/live-collaboration-15/b/snapshot-0039.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0039.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0041.xml b/corpus/m6/live-collaboration-15/b/snapshot-0041.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0041.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0043.xml b/corpus/m6/live-collaboration-15/b/snapshot-0043.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0043.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0045.xml b/corpus/m6/live-collaboration-15/b/snapshot-0045.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0045.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0047.xml b/corpus/m6/live-collaboration-15/b/snapshot-0047.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0047.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0049.xml b/corpus/m6/live-collaboration-15/b/snapshot-0049.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9b32bb8d9688989e0adf298828ae75473064f28 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0049.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0051.xml b/corpus/m6/live-collaboration-15/b/snapshot-0051.xml new file mode 100644 index 0000000000000000000000000000000000000000..2033749ffc01f7662c9726f9682de93bc4eb141a --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0051.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0053.xml b/corpus/m6/live-collaboration-15/b/snapshot-0053.xml new file mode 100644 index 0000000000000000000000000000000000000000..2033749ffc01f7662c9726f9682de93bc4eb141a --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0053.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/snapshot-0055.xml b/corpus/m6/live-collaboration-15/b/snapshot-0055.xml new file mode 100644 index 0000000000000000000000000000000000000000..2033749ffc01f7662c9726f9682de93bc4eb141a --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/snapshot-0055.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-15/b/spawn-0.json b/corpus/m6/live-collaboration-15/b/spawn-0.json new file mode 100644 index 0000000000000000000000000000000000000000..5759c03208db492a90341396967d7d43a15391c7 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/spawn-0.json @@ -0,0 +1,4 @@ +{ + "pid": 2416, + "error": null +} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/b/teardown.json b/corpus/m6/live-collaboration-15/b/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/live-collaboration-15/b/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/live-collaboration-15/conflict-model/assets.json b/corpus/m6/live-collaboration-15/conflict-model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..b1137d2c8f93b856619ffc841a598840985718cf --- /dev/null +++ b/corpus/m6/live-collaboration-15/conflict-model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}},{"path":"assets/1.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/2.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}}] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/conflict-model/assets/0.bin b/corpus/m6/live-collaboration-15/conflict-model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/live-collaboration-15/conflict-model/assets/0.bin differ diff --git a/corpus/m6/live-collaboration-15/conflict-model/assets/1.bin b/corpus/m6/live-collaboration-15/conflict-model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/conflict-model/assets/1.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/conflict-model/assets/2.bin b/corpus/m6/live-collaboration-15/conflict-model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/live-collaboration-15/conflict-model/assets/2.bin differ diff --git a/corpus/m6/live-collaboration-15/conflict-model/document.json b/corpus/m6/live-collaboration-15/conflict-model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..673d19d97550bd959b0fbad29c95f716cb354fb4 --- /dev/null +++ b/corpus/m6/live-collaboration-15/conflict-model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1"},"revisions":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]}}}}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{3322FC41-5152-002C-1A6F-6E54765F3328},1"},"revisions":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"roots":{"1":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10","2":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52","4":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12"},"nodes":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10":{"jcid":393271,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14":{"jcid":393227,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client A concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":2281708924,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141863,"modified":1473141863,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client A concurrent edit.","runs":[{"start":0,"end":25,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281709019,"value":"NoData"},{"id":2281708950,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32","preview":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36":{"jcid":393250,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37":{"jcid":393251,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{4C7E79C8-29B9-0295-2006-87088B9270C7},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{4C7E79C8-29B9-0295-2006-87088B9270C7},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-F79A3B95"},"extra":[[{"id":469769720,"value":{"Bytes":"4200390035000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141866,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B concurrent edit.","runs":[{"start":0,"end":25,"format":"{523F023B-8667-0712-0EBD-FF04058A53A5},20","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{523F023B-8667-0712-0EBD-FF04058A53A5},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141866,"modified":1473141866,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},17":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","latest_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":["{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[{"id":603993154,"value":{"Objects":["{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1"]}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},10","{55644A5D-B639-0555-287F-86AC4C458A34},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client B concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12":{"jcid":393250,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13":{"jcid":393251,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/conflict-model/text.json b/corpus/m6/live-collaboration-15/conflict-model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..2a64eeef9b771c1ab93b78b583fbaab0502e5168 --- /dev/null +++ b/corpus/m6/live-collaboration-15/conflict-model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":[{"text":"Client A concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{},"{4C7E79C8-29B9-0295-2006-87088B9270C7},1":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{523F023B-8667-0712-0EBD-FF04058A53A5},19":[{"text":"Client B concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/conflict.one b/corpus/m6/live-collaboration-15/conflict.one new file mode 100644 index 0000000000000000000000000000000000000000..ac37f87af5f0259537d6a89d11b4bb2c26f8bc24 Binary files /dev/null and b/corpus/m6/live-collaboration-15/conflict.one differ diff --git a/corpus/m6/live-collaboration-15/conflict/locks.txt b/corpus/m6/live-collaboration-15/conflict/locks.txt new file mode 100644 index 0000000000000000000000000000000000000000..85fd346b322d428f490eb160c55d35ecd615589d --- /dev/null +++ b/corpus/m6/live-collaboration-15/conflict/locks.txt @@ -0,0 +1,9 @@ + +Locked files: +Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time +-------------------------------------------------------------------------------------------------- +4403 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:50 2026 +4403 1000 DENY_WRITE 0x12019f RDWR LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:50 2026 +4382 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:56 2026 +4382 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:04:56 2026 + diff --git a/corpus/m6/live-collaboration-15/conflict/model/assets.json b/corpus/m6/live-collaboration-15/conflict/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..b1137d2c8f93b856619ffc841a598840985718cf --- /dev/null +++ b/corpus/m6/live-collaboration-15/conflict/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}},{"path":"assets/1.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/2.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}}] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/conflict/model/assets/0.bin b/corpus/m6/live-collaboration-15/conflict/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/live-collaboration-15/conflict/model/assets/0.bin differ diff --git a/corpus/m6/live-collaboration-15/conflict/model/assets/1.bin b/corpus/m6/live-collaboration-15/conflict/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/conflict/model/assets/1.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/conflict/model/assets/2.bin b/corpus/m6/live-collaboration-15/conflict/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/live-collaboration-15/conflict/model/assets/2.bin differ diff --git a/corpus/m6/live-collaboration-15/conflict/model/document.json b/corpus/m6/live-collaboration-15/conflict/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..673d19d97550bd959b0fbad29c95f716cb354fb4 --- /dev/null +++ b/corpus/m6/live-collaboration-15/conflict/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1"},"revisions":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]}}}}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{3322FC41-5152-002C-1A6F-6E54765F3328},1"},"revisions":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"roots":{"1":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10","2":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52","4":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12"},"nodes":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10":{"jcid":393271,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14":{"jcid":393227,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client A concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":2281708924,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141863,"modified":1473141863,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client A concurrent edit.","runs":[{"start":0,"end":25,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281709019,"value":"NoData"},{"id":2281708950,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32","preview":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36":{"jcid":393250,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37":{"jcid":393251,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{4C7E79C8-29B9-0295-2006-87088B9270C7},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{4C7E79C8-29B9-0295-2006-87088B9270C7},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-F79A3B95"},"extra":[[{"id":469769720,"value":{"Bytes":"4200390035000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141866,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B concurrent edit.","runs":[{"start":0,"end":25,"format":"{523F023B-8667-0712-0EBD-FF04058A53A5},20","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{523F023B-8667-0712-0EBD-FF04058A53A5},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141866,"modified":1473141866,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},17":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","latest_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":["{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[{"id":603993154,"value":{"Objects":["{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1"]}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},10","{55644A5D-B639-0555-287F-86AC4C458A34},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client B concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12":{"jcid":393250,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13":{"jcid":393251,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/conflict/model/text.json b/corpus/m6/live-collaboration-15/conflict/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..2a64eeef9b771c1ab93b78b583fbaab0502e5168 --- /dev/null +++ b/corpus/m6/live-collaboration-15/conflict/model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":[{"text":"Client A concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{},"{4C7E79C8-29B9-0295-2006-87088B9270C7},1":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{523F023B-8667-0712-0EBD-FF04058A53A5},19":[{"text":"Client B concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/conflict/notebook/Open Notebook.onetoc2 b/corpus/m6/live-collaboration-15/conflict/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/live-collaboration-15/conflict/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/live-collaboration-15/conflict/notebook/synthetic.one b/corpus/m6/live-collaboration-15/conflict/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..ac37f87af5f0259537d6a89d11b4bb2c26f8bc24 Binary files /dev/null and b/corpus/m6/live-collaboration-15/conflict/notebook/synthetic.one differ diff --git a/corpus/m6/live-collaboration-15/contention.json b/corpus/m6/live-collaboration-15/contention.json new file mode 100644 index 0000000000000000000000000000000000000000..4e23e8d26299c56e21be7f55bfcdb355eb085d20 --- /dev/null +++ b/corpus/m6/live-collaboration-15/contention.json @@ -0,0 +1,4 @@ +{ + "unchanged_sha256": "78b139fe514ef75318d47ebbdff4512d39ead2c57ff8c2dc8760d1125d59639c", + "locks": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:15 2026\n4474 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:22 2026\n4474 1000 DENY_WRITE 0x12019f RDWR LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:22 2026\n4473 1000 DENY_NONE 0x81 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:20 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:20 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:04:59 2026\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026\n4474 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026\n\n" +} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/disjoint/locks.txt b/corpus/m6/live-collaboration-15/disjoint/locks.txt new file mode 100644 index 0000000000000000000000000000000000000000..aadde2b7b127991a94918b8589f435401ce4c091 --- /dev/null +++ b/corpus/m6/live-collaboration-15/disjoint/locks.txt @@ -0,0 +1,14 @@ + +Locked files: +Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time +-------------------------------------------------------------------------------------------------- +4209 1000 DENY_ALL 0x100080 RDONLY NONE /srv/agent . Sun Sep 6 06:03:06 2026 +4188 1000 DENY_ALL 0x100080 RDONLY NONE /srv/agent . Sun Sep 6 06:00:31 2026 +4188 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:14 2026 +4188 1000 DENY_WRITE 0x12019f RDWR LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:14 2026 +3677 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:22 2026 +3677 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:03:39 2026 +4209 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:03:18 2026 +4188 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:00:41 2026 +3677 1000 DENY_NONE 0x20087 RDWR LEASE(RWH) /srv/agent m6-collaboration/._synthetic.one Sun Sep 6 06:03:39 2026 + diff --git a/corpus/m6/live-collaboration-15/disjoint/model/assets.json b/corpus/m6/live-collaboration-15/disjoint/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..f05eb471475a6f09d82bd2202938dc604c69b31d --- /dev/null +++ b/corpus/m6/live-collaboration-15/disjoint/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/1.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}},{"path":"assets/2.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}}] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/disjoint/model/assets/0.bin b/corpus/m6/live-collaboration-15/disjoint/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/disjoint/model/assets/0.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/disjoint/model/assets/1.bin b/corpus/m6/live-collaboration-15/disjoint/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/live-collaboration-15/disjoint/model/assets/1.bin differ diff --git a/corpus/m6/live-collaboration-15/disjoint/model/assets/2.bin b/corpus/m6/live-collaboration-15/disjoint/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/live-collaboration-15/disjoint/model/assets/2.bin differ diff --git a/corpus/m6/live-collaboration-15/disjoint/model/document.json b/corpus/m6/live-collaboration-15/disjoint/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..cad3427855090d0231e53a959fc379233079e861 --- /dev/null +++ b/corpus/m6/live-collaboration-15/disjoint/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{9E24424C-0CD9-0E62-29EE-A244369C13D7},1"},"revisions":{"{9E24424C-0CD9-0E62-29EE-A244369C13D7},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Fictitious: café, 東京, مرحبا","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{125A48D7-C513-06A7-28EF-F7EC84D1B3B9},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{125A48D7-C513-06A7-28EF-F7EC84D1B3B9},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{57D959A7-EBAB-0B48-091B-646F994DD19F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052015,"modified":1473052016,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},17":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","latest_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Rust disjoint edit.........","runs":[{"start":0,"end":18,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},19","extra_set":null},{"start":18,"end":20,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},20","extra_set":null},{"start":20,"end":22,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},19","extra_set":null},{"start":22,"end":27,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},21","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"SimSun","font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":2281714858,"value":"NoData"},{"id":201334017,"value":{"Bytes":"86"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},21":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Arial","font_size":null,"color":7949855,"highlight":null,"language":1025,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":2281714858,"value":"NoData"},{"id":201334017,"value":{"Bytes":"b2"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Fictitious: café, 東京, مرحبا","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},10","{03D49648-056C-0F08-32C9-0424E8496E7D},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141854,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Fictitious: café, 東京, مرحبا","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12":{"jcid":393250,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13":{"jcid":393251,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/disjoint/model/text.json b/corpus/m6/live-collaboration-15/disjoint/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..46b6adf77702a3efa6c2d5cd02a50ab9a8611343 --- /dev/null +++ b/corpus/m6/live-collaboration-15/disjoint/model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{9E24424C-0CD9-0E62-29EE-A244369C13D7},1":{}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{},"{125A48D7-C513-06A7-28EF-F7EC84D1B3B9},1":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{57D959A7-EBAB-0B48-091B-646F994DD19F},18":[{"text":"Rust disjoint edit","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"..","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"SimSun","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"..","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":".....","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Arial","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1025,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/disjoint/notebook/Open Notebook.onetoc2 b/corpus/m6/live-collaboration-15/disjoint/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/live-collaboration-15/disjoint/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/live-collaboration-15/disjoint/notebook/synthetic.one b/corpus/m6/live-collaboration-15/disjoint/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..9ace1678a09eda72e7a3acfb9b99e3f57bd9ce8a Binary files /dev/null and b/corpus/m6/live-collaboration-15/disjoint/notebook/synthetic.one differ diff --git a/corpus/m6/live-collaboration-15/initial/locks.txt b/corpus/m6/live-collaboration-15/initial/locks.txt new file mode 100644 index 0000000000000000000000000000000000000000..916798513bb49aff1ddcb9d6bf432d69c1a1d55d --- /dev/null +++ b/corpus/m6/live-collaboration-15/initial/locks.txt @@ -0,0 +1,11 @@ + +Locked files: +Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time +-------------------------------------------------------------------------------------------------- +4209 1000 DENY_ALL 0x100080 RDONLY NONE /srv/agent . Sun Sep 6 06:03:06 2026 +4188 1000 DENY_ALL 0x100080 RDONLY NONE /srv/agent . Sun Sep 6 06:00:31 2026 +3677 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:03:39 2026 +3677 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:03:39 2026 +4209 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:03:18 2026 +4188 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:00:41 2026 + diff --git a/corpus/m6/live-collaboration-15/initial/model/assets.json b/corpus/m6/live-collaboration-15/initial/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..f05eb471475a6f09d82bd2202938dc604c69b31d --- /dev/null +++ b/corpus/m6/live-collaboration-15/initial/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/1.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}},{"path":"assets/2.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}}] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/initial/model/assets/0.bin b/corpus/m6/live-collaboration-15/initial/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/initial/model/assets/0.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/initial/model/assets/1.bin b/corpus/m6/live-collaboration-15/initial/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/live-collaboration-15/initial/model/assets/1.bin differ diff --git a/corpus/m6/live-collaboration-15/initial/model/assets/2.bin b/corpus/m6/live-collaboration-15/initial/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/live-collaboration-15/initial/model/assets/2.bin differ diff --git a/corpus/m6/live-collaboration-15/initial/model/document.json b/corpus/m6/live-collaboration-15/initial/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..d4bd933bf60244150532c8f3ed0f82f5efb8fc92 --- /dev/null +++ b/corpus/m6/live-collaboration-15/initial/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{9E24424C-0CD9-0E62-29EE-A244369C13D7},1"},"revisions":{"{9E24424C-0CD9-0E62-29EE-A244369C13D7},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Fictitious: café, 東京, مرحبا","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{74A71964-B70E-0589-3BB3-56F955273024},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{74A71964-B70E-0589-3BB3-56F955273024},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{57D959A7-EBAB-0B48-091B-646F994DD19F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052015,"modified":1473052016,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},17":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":260.0,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052017,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"c013e140"}}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{55644A5D-B639-0555-287F-86AC4C458A34},15"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052017,"modified":1473052017,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},15":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052017,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Fictitious positioned outline.","runs":[{"start":0,"end":30,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Fictitious: café, 東京, مرحبا","runs":[{"start":0,"end":18,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},19","extra_set":null},{"start":18,"end":20,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},20","extra_set":null},{"start":20,"end":22,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},19","extra_set":null},{"start":22,"end":27,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},21","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"SimSun","font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":2281714858,"value":"NoData"},{"id":201334017,"value":{"Bytes":"86"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},21":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Arial","font_size":null,"color":7949855,"highlight":null,"language":1025,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":2281714858,"value":"NoData"},{"id":201334017,"value":{"Bytes":"b2"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Fictitious: café, 東京, مرحبا","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},10","{55644A5D-B639-0555-287F-86AC4C458A34},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},20","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Fictitious: café, 東京, مرحبا","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},20":{"jcid":393228,"children":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},21"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":501.52203,"y":139.75984,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":335551620,"value":{"Bytes":"09000000"}},{"id":335551707,"value":{"Bytes":"456f0341"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},21":{"jcid":393229,"children":[],"content":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052301,"modified":1473052301,"original_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"","runs":[{"start":0,"end":0,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12":{"jcid":393250,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13":{"jcid":393251,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}},"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/initial/model/text.json b/corpus/m6/live-collaboration-15/initial/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..a474b96699783f6f3b588f3251f2a7b4739652b6 --- /dev/null +++ b/corpus/m6/live-collaboration-15/initial/model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{9E24424C-0CD9-0E62-29EE-A244369C13D7},1":{}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{74A71964-B70E-0589-3BB3-56F955273024},1":{"{55644A5D-B639-0555-287F-86AC4C458A34},15":[{"text":"Fictitious positioned outline.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{57D959A7-EBAB-0B48-091B-646F994DD19F},18":[{"text":"Fictitious: café, ","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"東京","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"SimSun","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":", ","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"مرحبا","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Arial","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1025,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},22":[{"text":"","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/initial/notebook/Open Notebook.onetoc2 b/corpus/m6/live-collaboration-15/initial/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/live-collaboration-15/initial/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/live-collaboration-15/initial/notebook/synthetic.one b/corpus/m6/live-collaboration-15/initial/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..e46d7a24cead34b8521bc6e1d117d68a9ff70f09 Binary files /dev/null and b/corpus/m6/live-collaboration-15/initial/notebook/synthetic.one differ diff --git a/corpus/m6/live-collaboration-15/input.tar b/corpus/m6/live-collaboration-15/input.tar new file mode 100644 index 0000000000000000000000000000000000000000..1154e60a35d8dc9d6ce1d4a5b3c99ab9e2d16372 Binary files /dev/null and b/corpus/m6/live-collaboration-15/input.tar differ diff --git a/corpus/m6/live-collaboration-15/linux.json b/corpus/m6/live-collaboration-15/linux.json new file mode 100644 index 0000000000000000000000000000000000000000..6e157e54a9d1274e094904cfa2d23f002ffc0e1c --- /dev/null +++ b/corpus/m6/live-collaboration-15/linux.json @@ -0,0 +1,11 @@ +{ + "cpus": 2, + "disk_gb": 16, + "hostname": "one-m6-collaboration", + "lab_address": "192.168.77.1", + "lab_mac": "52:54:04:d8:85:41", + "memory_mb": 2048, + "samba_port": 14450, + "ssh_port": 22000, + "wan_mac": "52:54:03:69:92:f7" +} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/lock-released/locks.txt b/corpus/m6/live-collaboration-15/lock-released/locks.txt new file mode 100644 index 0000000000000000000000000000000000000000..84573e5008f027d77d644493f1cf880526e602e9 --- /dev/null +++ b/corpus/m6/live-collaboration-15/lock-released/locks.txt @@ -0,0 +1,12 @@ + +Locked files: +Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time +-------------------------------------------------------------------------------------------------- +4475 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:59 2026 +4474 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:59 2026 +4474 1000 DENY_WRITE 0x12019f RDWR LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:22 2026 +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:06:04 2026 +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:06:04 2026 +4475 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026 +4474 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026 + diff --git a/corpus/m6/live-collaboration-15/lock-released/model/assets.json b/corpus/m6/live-collaboration-15/lock-released/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..b1137d2c8f93b856619ffc841a598840985718cf --- /dev/null +++ b/corpus/m6/live-collaboration-15/lock-released/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}},{"path":"assets/1.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/2.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}}] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/lock-released/model/assets/0.bin b/corpus/m6/live-collaboration-15/lock-released/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/live-collaboration-15/lock-released/model/assets/0.bin differ diff --git a/corpus/m6/live-collaboration-15/lock-released/model/assets/1.bin b/corpus/m6/live-collaboration-15/lock-released/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/lock-released/model/assets/1.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/lock-released/model/assets/2.bin b/corpus/m6/live-collaboration-15/lock-released/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/live-collaboration-15/lock-released/model/assets/2.bin differ diff --git a/corpus/m6/live-collaboration-15/lock-released/model/document.json b/corpus/m6/live-collaboration-15/lock-released/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..580c8fd6fb599060b524c7fa26e166f0028c2ddd --- /dev/null +++ b/corpus/m6/live-collaboration-15/lock-released/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1"},"revisions":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]}}}}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{3322FC41-5152-002C-1A6F-6E54765F3328},1"},"revisions":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"roots":{"1":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10","2":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52","4":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12"},"nodes":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10":{"jcid":393271,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14":{"jcid":393227,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client A concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":2281708924,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141863,"modified":1473141863,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client A concurrent edit.","runs":[{"start":0,"end":25,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281709019,"value":"NoData"},{"id":2281708950,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32","preview":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36":{"jcid":393250,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37":{"jcid":393251,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{20D097D3-E132-074C-00BE-E24B1DB08942},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{20D097D3-E132-074C-00BE-E24B1DB08942},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-F79A3B95"},"extra":[[{"id":469769720,"value":{"Bytes":"4200390035000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141866,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B concurrent edit.","runs":[{"start":0,"end":25,"format":"{523F023B-8667-0712-0EBD-FF04058A53A5},20","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{523F023B-8667-0712-0EBD-FF04058A53A5},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141866,"modified":1473141866,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":128.48047,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141921,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{1478AE7B-9555-0667-0590-22A323B21308},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141921,"modified":1473141921,"original_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","latest_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{1478AE7B-9555-0667-0590-22A323B21308},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141921,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native lock recovery.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":["{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[{"id":603993154,"value":{"Objects":["{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1"]}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},10","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{03D49648-056C-0F08-32C9-0424E8496E7D},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141922,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client B concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},15"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":92.421814,"max_height":21.947718},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},24"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},15":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},16"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},16":{"jcid":393250,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},17"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[45.76938,38.522434],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},17":{"jcid":393251,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},18","{E594A3F5-9F29-07F9-28B0-17B912FA121D},25"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},18":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e9d5eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},24":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141902,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B online cell.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},25":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"0404a9eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},31":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141902,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/lock-released/model/text.json b/corpus/m6/live-collaboration-15/lock-released/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..860a0d557fbccc68d66d64378e0a71fb69bafc3e --- /dev/null +++ b/corpus/m6/live-collaboration-15/lock-released/model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":[{"text":"Client A concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{},"{20D097D3-E132-074C-00BE-E24B1DB08942},1":{"{523F023B-8667-0712-0EBD-FF04058A53A5},19":[{"text":"Client B concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{1478AE7B-9555-0667-0590-22A323B21308},19":[{"text":"Native lock recovery.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{E594A3F5-9F29-07F9-28B0-17B912FA121D},24":[{"text":"Client B online cell.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{E594A3F5-9F29-07F9-28B0-17B912FA121D},31":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}]}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/lock-released/notebook/Open Notebook.onetoc2 b/corpus/m6/live-collaboration-15/lock-released/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/live-collaboration-15/lock-released/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/live-collaboration-15/lock-released/notebook/synthetic.one b/corpus/m6/live-collaboration-15/lock-released/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..e612c4a44e5af1e4a4fd12dd8868e8a79cb78aa1 Binary files /dev/null and b/corpus/m6/live-collaboration-15/lock-released/notebook/synthetic.one differ diff --git a/corpus/m6/live-collaboration-15/process-restarted/locks.txt b/corpus/m6/live-collaboration-15/process-restarted/locks.txt new file mode 100644 index 0000000000000000000000000000000000000000..c66032cca9337ad1470058c4830272f9bf55ff51 --- /dev/null +++ b/corpus/m6/live-collaboration-15/process-restarted/locks.txt @@ -0,0 +1,12 @@ + +Locked files: +Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time +-------------------------------------------------------------------------------------------------- +4475 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:59 2026 +4474 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:59 2026 +4474 1000 DENY_WRITE 0x12019f RDWR LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:22 2026 +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:06:14 2026 +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:06:04 2026 +4475 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026 +4474 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:06:08 2026 + diff --git a/corpus/m6/live-collaboration-15/process-restarted/model/assets.json b/corpus/m6/live-collaboration-15/process-restarted/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..b1137d2c8f93b856619ffc841a598840985718cf --- /dev/null +++ b/corpus/m6/live-collaboration-15/process-restarted/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}},{"path":"assets/1.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/2.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}}] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/process-restarted/model/assets/0.bin b/corpus/m6/live-collaboration-15/process-restarted/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/live-collaboration-15/process-restarted/model/assets/0.bin differ diff --git a/corpus/m6/live-collaboration-15/process-restarted/model/assets/1.bin b/corpus/m6/live-collaboration-15/process-restarted/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/process-restarted/model/assets/1.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/process-restarted/model/assets/2.bin b/corpus/m6/live-collaboration-15/process-restarted/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/live-collaboration-15/process-restarted/model/assets/2.bin differ diff --git a/corpus/m6/live-collaboration-15/process-restarted/model/document.json b/corpus/m6/live-collaboration-15/process-restarted/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..580c8fd6fb599060b524c7fa26e166f0028c2ddd --- /dev/null +++ b/corpus/m6/live-collaboration-15/process-restarted/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1"},"revisions":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]}}}}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{3322FC41-5152-002C-1A6F-6E54765F3328},1"},"revisions":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"roots":{"1":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10","2":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52","4":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12"},"nodes":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10":{"jcid":393271,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14":{"jcid":393227,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client A concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":2281708924,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141863,"modified":1473141863,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client A concurrent edit.","runs":[{"start":0,"end":25,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281709019,"value":"NoData"},{"id":2281708950,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32","preview":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36":{"jcid":393250,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37":{"jcid":393251,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{20D097D3-E132-074C-00BE-E24B1DB08942},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{20D097D3-E132-074C-00BE-E24B1DB08942},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-F79A3B95"},"extra":[[{"id":469769720,"value":{"Bytes":"4200390035000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141866,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B concurrent edit.","runs":[{"start":0,"end":25,"format":"{523F023B-8667-0712-0EBD-FF04058A53A5},20","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{523F023B-8667-0712-0EBD-FF04058A53A5},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141866,"modified":1473141866,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":128.48047,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141921,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{1478AE7B-9555-0667-0590-22A323B21308},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141921,"modified":1473141921,"original_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","latest_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{1478AE7B-9555-0667-0590-22A323B21308},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141921,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native lock recovery.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":["{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[{"id":603993154,"value":{"Objects":["{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1"]}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},10","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{03D49648-056C-0F08-32C9-0424E8496E7D},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141922,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client B concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},15"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":92.421814,"max_height":21.947718},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},24"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},15":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},16"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},16":{"jcid":393250,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},17"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[45.76938,38.522434],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},17":{"jcid":393251,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},18","{E594A3F5-9F29-07F9-28B0-17B912FA121D},25"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},18":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e9d5eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},24":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141902,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B online cell.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},25":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"0404a9eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},31":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141902,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/process-restarted/model/text.json b/corpus/m6/live-collaboration-15/process-restarted/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..860a0d557fbccc68d66d64378e0a71fb69bafc3e --- /dev/null +++ b/corpus/m6/live-collaboration-15/process-restarted/model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":[{"text":"Client A concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{},"{20D097D3-E132-074C-00BE-E24B1DB08942},1":{"{523F023B-8667-0712-0EBD-FF04058A53A5},19":[{"text":"Client B concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{1478AE7B-9555-0667-0590-22A323B21308},19":[{"text":"Native lock recovery.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{E594A3F5-9F29-07F9-28B0-17B912FA121D},24":[{"text":"Client B online cell.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{E594A3F5-9F29-07F9-28B0-17B912FA121D},31":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}]}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/process-restarted/notebook/Open Notebook.onetoc2 b/corpus/m6/live-collaboration-15/process-restarted/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/live-collaboration-15/process-restarted/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/live-collaboration-15/process-restarted/notebook/synthetic.one b/corpus/m6/live-collaboration-15/process-restarted/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..d0b183b459363f16f5318993b7ec762e3c5046f0 Binary files /dev/null and b/corpus/m6/live-collaboration-15/process-restarted/notebook/synthetic.one differ diff --git a/corpus/m6/live-collaboration-15/read-retries.jsonl b/corpus/m6/live-collaboration-15/read-retries.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..714da6664f0a083be4d5436933703dee1bada1c0 --- /dev/null +++ b/corpus/m6/live-collaboration-15/read-retries.jsonl @@ -0,0 +1,289 @@ +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} +{"file": "synthetic.one", "errno": 13, "error": "[Errno 13] Permission denied"} diff --git a/corpus/m6/live-collaboration-15/result.json b/corpus/m6/live-collaboration-15/result.json new file mode 100644 index 0000000000000000000000000000000000000000..758e2b4b38a28b38fd9a4c787d9f86b46ff64a2d --- /dev/null +++ b/corpus/m6/live-collaboration-15/result.json @@ -0,0 +1,9 @@ +{ + "disjoint": true, + "conflict_retained": true, + "server_restart": true, + "transport_reconnect": true, + "lock_contention": true, + "process_restart": true, + "vm_restart": true +} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/retention.json b/corpus/m6/live-collaboration-15/retention.json new file mode 100644 index 0000000000000000000000000000000000000000..39294945613c6b2cb0030448f526b379aae4c997 --- /dev/null +++ b/corpus/m6/live-collaboration-15/retention.json @@ -0,0 +1,8 @@ +{ + "main_space": "{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1", + "conflict_space": "{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1", + "competing_edits": [ + "Client A concurrent edit.", + "Client B concurrent edit." + ] +} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/run.json b/corpus/m6/live-collaboration-15/run.json new file mode 100644 index 0000000000000000000000000000000000000000..b4b0035e287c7b4ba81449b2ca14f2d0a29f6ffc --- /dev/null +++ b/corpus/m6/live-collaboration-15/run.json @@ -0,0 +1,8 @@ +{ + "server": "m6-collaboration", + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "network.ps1": "8737a25b9ff28a9a33e99239efdbe6b3f4933889d327c1d704fc27d009eae471", + "collaborate.ps1": "0c336b1db52f8878d4eac08fcbe62fce1637b5b3538b97fb6df3f1b8d9f5aa1f" + } +} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/scripts/cold.ps1 b/corpus/m6/live-collaboration-15/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/live-collaboration-15/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/live-collaboration-15/scripts/collaborate.ps1 b/corpus/m6/live-collaboration-15/scripts/collaborate.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..8acc3d9eacfcae78c8e2fe78a706f1667e261eed --- /dev/null +++ b/corpus/m6/live-collaboration-15/scripts/collaborate.ps1 @@ -0,0 +1,97 @@ +param([Parameter(Mandatory=$true)][string]$Root, + [Parameter(Mandatory=$true)][string]$SharedPath, + [Parameter(Mandatory=$true)][string]$CloneHost, + [switch]$ResumeCache, + [int]$StartSequence = 1) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +if ($SharedPath -notmatch '^\\\\192\.168\.77\.1\\agent\\m6-[a-z0-9-]+$') { throw 'Choose a disposable Linux lab notebook.' } +if ($env:COMPUTERNAME -ne $CloneHost) { throw 'The collaboration controller requires its owned clone.' } +if (-not $ResumeCache) { & "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost } +$shared = $SharedPath +if (-not (Test-Path "$shared\synthetic.one")) { throw 'Create the shared fixture first.' } +New-Item -ItemType Directory "$Root\inbox", "$Root\outbox" -Force | Out-Null +$user = 'HKCU:\Software\Microsoft\Office\Common\UserInfo' +New-Item $user -Force | Out-Null +New-ItemProperty $user -Name UserName -Value $CloneHost -PropertyType String -Force | Out-Null +New-ItemProperty $user -Name UserInitials -Value $CloneHost.Substring($CloneHost.Length - 3) -PropertyType String -Force | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy($shared, '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + [IO.File]::WriteAllText("$Root\ready", 'ready') + $deadline = [DateTime]::UtcNow.AddMinutes(30) + $sequence = $StartSequence + while ([DateTime]::UtcNow -lt $deadline) { + $name = '{0:d4}.json' -f $sequence + $input = "$Root\inbox\$name" + if (-not (Test-Path $input)) { Start-Sleep -Milliseconds 100; continue } + $command = Get-Content -Raw -Encoding UTF8 $input | ConvertFrom-Json + $output = "$Root\outbox\$sequence" + New-Item -ItemType Directory $output | Out-Null + try { + if ($command.action -eq 'sync') { $app.SyncHierarchy($notebook) } + elseif ($command.action -eq 'kill-process') { + Get-Process ONENOTE | Stop-Process -Force + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = New-Object -ComObject OneNote.Application + $app.OpenHierarchy($shared, '', [ref]$notebook, 0) + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + } + elseif ($command.action -eq 'edit' -or $command.action -eq 'snapshot') { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText("$output\hierarchy.xml", $hierarchy, [Text.Encoding]::UTF8) + [xml]$tree = $hierarchy + $matches = 0 + $editedPage = $null + $i = 0 + foreach ($node in $tree.SelectNodes('//*[local-name()="Page"]')) { + $content = '' + $app.GetPageContent($node.GetAttribute('ID'), [ref]$content, 1, 1) + [IO.File]::WriteAllText("$output\page-$i.xml", $content, [Text.Encoding]::UTF8) + [xml]$page = $content + if ($command.action -eq 'edit') { + $targets = @($page.SelectNodes('//*[local-name()="T"]') | Where-Object { + [Net.WebUtility]::HtmlDecode([regex]::Replace($_.InnerText, '<[^>]*>', '')) -eq $command.expected + }) + if ($targets.Count -gt 1) { throw 'Expected one matching text object.' } + if ($targets.Count -eq 1) { + $matches++ + if ($matches -gt 1) { throw 'The text occurs on multiple pages.' } + $targets[0].InnerText = [Security.SecurityElement]::Escape($command.text) + $container = $targets[0] + while ($container.ParentNode -ne $page.DocumentElement) { $container = $container.ParentNode } + foreach ($sibling in @($page.DocumentElement.ChildNodes)) { + if ($sibling -ne $container -and $sibling.LocalName -in @('Outline', 'Title', 'Image', 'InkDrawing')) { + [void]$page.DocumentElement.RemoveChild($sibling) + } + } + $editedPage = $page + } + } + $i++ + } + if ($command.action -eq 'edit' -and $matches -ne 1) { throw 'Expected one matching text object.' } + if ($editedPage) { $app.UpdatePageContent($editedPage.OuterXml, [DateTime]::MinValue, 1, $false) } + } elseif ($command.action -ne 'close') { throw 'Unknown collaboration command.' } + [IO.File]::WriteAllText("$output\done", 'ok') + } catch { + [IO.File]::WriteAllText("$output\error", $_.Exception.ToString()) + } + if ($command.action -eq 'close') { break } + $sequence++ + } +} finally { + try { if ($notebook) { $app.CloseNotebook($notebook, $false) } } + finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + [IO.File]::WriteAllText("$Root\closed", 'closed') + } +} diff --git a/corpus/m6/live-collaboration-15/scripts/network.ps1 b/corpus/m6/live-collaboration-15/scripts/network.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..2e59b9258bc4a12fe52279e70706a8efdda3cd83 --- /dev/null +++ b/corpus/m6/live-collaboration-15/scripts/network.ps1 @@ -0,0 +1,16 @@ +param([Parameter(Mandatory=$true)][string]$LabMac) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$adapter = @(Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object { $_.MACAddress -eq $LabMac }) +if ($adapter.Count -ne 1) { throw 'The clone lab adapter is ambiguous.' } +$release = $adapter[0].ReleaseDHCPLease() +$result = $adapter[0].RenewDHCPLease() +$deadline = [DateTime]::UtcNow.AddSeconds(60) +do { + $adapter = @(Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object { $_.MACAddress -eq $LabMac }) + $addresses = @($adapter[0].IPAddress | Where-Object { $_ -match '^192\.168\.77\.\d+$' -and $_ -ne '192.168.77.1' }) + if ($addresses.Count -eq 1) { break } + Start-Sleep -Milliseconds 250 +} while ([DateTime]::UtcNow -lt $deadline) +if ($addresses.Count -ne 1) { throw ('The clone did not receive a lab IPv4 address; renewal result ' + $result.ReturnValue) } +@{mac=$LabMac;address=$addresses[0];releaseResult=$release.ReturnValue;renewalResult=$result.ReturnValue} | ConvertTo-Json -Compress diff --git a/corpus/m6/live-collaboration-15/server-restart/locks.txt b/corpus/m6/live-collaboration-15/server-restart/locks.txt new file mode 100644 index 0000000000000000000000000000000000000000..ec2525781862f9b83feb862dccaae5dd34ab5645 --- /dev/null +++ b/corpus/m6/live-collaboration-15/server-restart/locks.txt @@ -0,0 +1,7 @@ + +Locked files: +Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time +-------------------------------------------------------------------------------------------------- +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:59 2026 +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:04:59 2026 + diff --git a/corpus/m6/live-collaboration-15/server-restart/model/assets.json b/corpus/m6/live-collaboration-15/server-restart/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..b1137d2c8f93b856619ffc841a598840985718cf --- /dev/null +++ b/corpus/m6/live-collaboration-15/server-restart/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}},{"path":"assets/1.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/2.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}}] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/server-restart/model/assets/0.bin b/corpus/m6/live-collaboration-15/server-restart/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/live-collaboration-15/server-restart/model/assets/0.bin differ diff --git a/corpus/m6/live-collaboration-15/server-restart/model/assets/1.bin b/corpus/m6/live-collaboration-15/server-restart/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/server-restart/model/assets/1.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/server-restart/model/assets/2.bin b/corpus/m6/live-collaboration-15/server-restart/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/live-collaboration-15/server-restart/model/assets/2.bin differ diff --git a/corpus/m6/live-collaboration-15/server-restart/model/document.json b/corpus/m6/live-collaboration-15/server-restart/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..673d19d97550bd959b0fbad29c95f716cb354fb4 --- /dev/null +++ b/corpus/m6/live-collaboration-15/server-restart/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1"},"revisions":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]}}}}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{3322FC41-5152-002C-1A6F-6E54765F3328},1"},"revisions":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"roots":{"1":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10","2":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52","4":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12"},"nodes":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10":{"jcid":393271,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14":{"jcid":393227,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client A concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":2281708924,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141863,"modified":1473141863,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client A concurrent edit.","runs":[{"start":0,"end":25,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281709019,"value":"NoData"},{"id":2281708950,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32","preview":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36":{"jcid":393250,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37":{"jcid":393251,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{4C7E79C8-29B9-0295-2006-87088B9270C7},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{4C7E79C8-29B9-0295-2006-87088B9270C7},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-F79A3B95"},"extra":[[{"id":469769720,"value":{"Bytes":"4200390035000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141866,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B concurrent edit.","runs":[{"start":0,"end":25,"format":"{523F023B-8667-0712-0EBD-FF04058A53A5},20","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{523F023B-8667-0712-0EBD-FF04058A53A5},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141866,"modified":1473141866,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},17":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","latest_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":["{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[{"id":603993154,"value":{"Objects":["{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1"]}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},10","{55644A5D-B639-0555-287F-86AC4C458A34},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client B concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12":{"jcid":393250,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13":{"jcid":393251,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/server-restart/model/text.json b/corpus/m6/live-collaboration-15/server-restart/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..2a64eeef9b771c1ab93b78b583fbaab0502e5168 --- /dev/null +++ b/corpus/m6/live-collaboration-15/server-restart/model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":[{"text":"Client A concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{},"{4C7E79C8-29B9-0295-2006-87088B9270C7},1":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{523F023B-8667-0712-0EBD-FF04058A53A5},19":[{"text":"Client B concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/server-restart/notebook/Open Notebook.onetoc2 b/corpus/m6/live-collaboration-15/server-restart/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/live-collaboration-15/server-restart/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/live-collaboration-15/server-restart/notebook/synthetic.one b/corpus/m6/live-collaboration-15/server-restart/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..ac37f87af5f0259537d6a89d11b4bb2c26f8bc24 Binary files /dev/null and b/corpus/m6/live-collaboration-15/server-restart/notebook/synthetic.one differ diff --git a/corpus/m6/live-collaboration-15/server.jsonl b/corpus/m6/live-collaboration-15/server.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..9d46a11a8884cdb6f6ab782db81f268b03842319 --- /dev/null +++ b/corpus/m6/live-collaboration-15/server.jsonl @@ -0,0 +1,18 @@ +{"command": "mkdir /srv/agent/m6-collaboration", "exit": 0, "stdout": "", "stderr": ""} +{"command": "chmod u+w /srv/agent/m6-collaboration/*", "exit": 0, "stdout": "", "stderr": ""} +{"command": "sudo smbd --version", "exit": 0, "stdout": "Version 4.22.10-Debian-4.22.10+dfsg-0+deb13u2\n", "stderr": ""} +{"command": "uname -a", "exit": 0, "stdout": "Linux one-m6-collaboration 6.12.107+deb13-cloud-arm64 #1 SMP Debian 6.12.107-1 (2026-08-29) aarch64 GNU/Linux\n", "stderr": ""} +{"command": "testparm -s 2>&1", "exit": 0, "stdout": "Load smb config files from /etc/samba/smb.conf\nLoaded services file OK.\nWeak crypto is allowed by GnuTLS (e.g. NTLM as a compatibility fallback)\n\nWARNING: The 'netbios name' is too long (max. 15 chars).\n\nServer role: ROLE_STANDALONE\n\n# Global parameters\n[global]\n\tbind interfaces only = Yes\n\tinterfaces = lo wan0 lab0\n\tmap to guest = Bad User\n\tserver role = standalone server\n\tidmap config * : backend = tdb\n\n\n[agent]\n\tcreate mask = 0666\n\tdirectory mask = 0777\n\tforce user = agent\n\tguest ok = Yes\n\tpath = /srv/agent\n\tread only = No\n", "stderr": ""} +{"command": "sudo smbstatus --locks", "exit": 0, "stdout": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4209 1000 DENY_ALL 0x100080 RDONLY NONE /srv/agent . Sun Sep 6 06:03:06 2026\n4188 1000 DENY_ALL 0x100080 RDONLY NONE /srv/agent . Sun Sep 6 06:00:31 2026\n3677 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:03:39 2026\n3677 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:03:39 2026\n4209 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:03:18 2026\n4188 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:00:41 2026\n\n", "stderr": ""} +{"command": "sudo smbstatus --locks", "exit": 0, "stdout": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4209 1000 DENY_ALL 0x100080 RDONLY NONE /srv/agent . Sun Sep 6 06:03:06 2026\n4188 1000 DENY_ALL 0x100080 RDONLY NONE /srv/agent . Sun Sep 6 06:00:31 2026\n4188 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:14 2026\n4188 1000 DENY_WRITE 0x12019f RDWR LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:14 2026\n3677 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:22 2026\n3677 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:03:39 2026\n4209 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:03:18 2026\n4188 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:00:41 2026\n3677 1000 DENY_NONE 0x20087 RDWR LEASE(RWH) /srv/agent m6-collaboration/._synthetic.one Sun Sep 6 06:03:39 2026\n\n", "stderr": ""} +{"command": "sudo systemctl stop smbd && ! systemctl is-active --quiet smbd", "exit": 0, "stdout": "", "stderr": ""} +{"command": "sudo systemctl start smbd && systemctl is-active smbd", "exit": 0, "stdout": "active\n", "stderr": ""} +{"command": "sudo smbstatus --locks", "exit": 0, "stdout": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4403 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:50 2026\n4403 1000 DENY_WRITE 0x12019f RDWR LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:50 2026\n4382 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:56 2026\n4382 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:04:56 2026\n\n", "stderr": ""} +{"command": "sudo systemctl restart smbd && systemctl is-active smbd", "exit": 0, "stdout": "active\n", "stderr": ""} +{"command": "sudo smbstatus --locks", "exit": 0, "stdout": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:04:59 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:04:59 2026\n\n", "stderr": ""} +{"command": "sudo smbstatus --locks", "exit": 0, "stdout": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:10 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:04:59 2026\n\n", "stderr": ""} +{"command": "sudo smbstatus --locks", "exit": 0, "stdout": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:15 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:20 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:04:59 2026\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026\n4474 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026\n\n", "stderr": ""} +{"command": "sudo smbstatus --locks", "exit": 0, "stdout": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:15 2026\n4474 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:22 2026\n4474 1000 DENY_WRITE 0x12019f RDWR LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:22 2026\n4473 1000 DENY_NONE 0x81 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:20 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:20 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:04:59 2026\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026\n4474 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026\n\n", "stderr": ""} +{"command": "sudo smbstatus --locks", "exit": 0, "stdout": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:59 2026\n4474 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:59 2026\n4474 1000 DENY_WRITE 0x12019f RDWR LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:22 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:06:04 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:06:04 2026\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026\n4474 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026\n\n", "stderr": ""} +{"command": "sudo smbstatus --locks", "exit": 0, "stdout": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:59 2026\n4474 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:59 2026\n4474 1000 DENY_WRITE 0x12019f RDWR LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:22 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:06:14 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:06:04 2026\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026\n4474 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:06:08 2026\n\n", "stderr": ""} +{"command": "sudo smbstatus --locks", "exit": 0, "stdout": "\nLocked files:\nPid User(ID) DenyMode Access R/W Oplock SharePath Name Time\n--------------------------------------------------------------------------------------------------\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:08:51 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:08:59 2026\n4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:08:59 2026\n4670 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:07:59 2026\n4475 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026\n\n", "stderr": ""} diff --git a/corpus/m6/live-collaboration-15/teardown.json b/corpus/m6/live-collaboration-15/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..7418b1096ff2845c0de243d9fbd249794ed071ab --- /dev/null +++ b/corpus/m6/live-collaboration-15/teardown.json @@ -0,0 +1,3 @@ +{ + "linux_absent": true +} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/transport-disconnected/locks.txt b/corpus/m6/live-collaboration-15/transport-disconnected/locks.txt new file mode 100644 index 0000000000000000000000000000000000000000..b03560526ac309ae6a2d4e96eae215991bc646ac --- /dev/null +++ b/corpus/m6/live-collaboration-15/transport-disconnected/locks.txt @@ -0,0 +1,7 @@ + +Locked files: +Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time +-------------------------------------------------------------------------------------------------- +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:10 2026 +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:04:59 2026 + diff --git a/corpus/m6/live-collaboration-15/transport-disconnected/model/assets.json b/corpus/m6/live-collaboration-15/transport-disconnected/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..b1137d2c8f93b856619ffc841a598840985718cf --- /dev/null +++ b/corpus/m6/live-collaboration-15/transport-disconnected/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}},{"path":"assets/1.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/2.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}}] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/transport-disconnected/model/assets/0.bin b/corpus/m6/live-collaboration-15/transport-disconnected/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/live-collaboration-15/transport-disconnected/model/assets/0.bin differ diff --git a/corpus/m6/live-collaboration-15/transport-disconnected/model/assets/1.bin b/corpus/m6/live-collaboration-15/transport-disconnected/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/transport-disconnected/model/assets/1.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/transport-disconnected/model/assets/2.bin b/corpus/m6/live-collaboration-15/transport-disconnected/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/live-collaboration-15/transport-disconnected/model/assets/2.bin differ diff --git a/corpus/m6/live-collaboration-15/transport-disconnected/model/document.json b/corpus/m6/live-collaboration-15/transport-disconnected/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..9cfe88b058be5f866cbf528bb219e2403e9c027a --- /dev/null +++ b/corpus/m6/live-collaboration-15/transport-disconnected/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1"},"revisions":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]}}}}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{3322FC41-5152-002C-1A6F-6E54765F3328},1"},"revisions":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"roots":{"1":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10","2":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52","4":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12"},"nodes":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10":{"jcid":393271,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14":{"jcid":393227,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client A concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":2281708924,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141863,"modified":1473141863,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client A concurrent edit.","runs":[{"start":0,"end":25,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281709019,"value":"NoData"},{"id":2281708950,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32","preview":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36":{"jcid":393250,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37":{"jcid":393251,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{4A569927-F210-0C84-025F-62FA4E30B2ED},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{4A569927-F210-0C84-025F-62FA4E30B2ED},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-F79A3B95"},"extra":[[{"id":469769720,"value":{"Bytes":"4200390035000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141866,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B concurrent edit.","runs":[{"start":0,"end":25,"format":"{523F023B-8667-0712-0EBD-FF04058A53A5},20","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{523F023B-8667-0712-0EBD-FF04058A53A5},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141866,"modified":1473141866,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","latest_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":["{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[{"id":603993154,"value":{"Objects":["{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1"]}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{03D49648-056C-0F08-32C9-0424E8496E7D},10","{55644A5D-B639-0555-287F-86AC4C458A34},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141904,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client B concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},15"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":92.421814,"max_height":21.947718},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141904,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},24"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},15":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},16"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},16":{"jcid":393250,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},17"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141904,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[45.841827,38.449986],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},17":{"jcid":393251,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},18","{E594A3F5-9F29-07F9-28B0-17B912FA121D},25"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141904,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},18":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141904,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e9d5eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},24":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141902,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B online cell.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},25":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141904,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"0404a9eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},31":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141902,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}},"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/transport-disconnected/model/text.json b/corpus/m6/live-collaboration-15/transport-disconnected/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..754d44f193fa36930df4b4f2210275a389cc99f6 --- /dev/null +++ b/corpus/m6/live-collaboration-15/transport-disconnected/model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":[{"text":"Client A concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{4A569927-F210-0C84-025F-62FA4E30B2ED},1":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},19":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{523F023B-8667-0712-0EBD-FF04058A53A5},19":[{"text":"Client B concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{E594A3F5-9F29-07F9-28B0-17B912FA121D},24":[{"text":"Client B online cell.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{E594A3F5-9F29-07F9-28B0-17B912FA121D},31":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}]},"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/transport-disconnected/notebook/Open Notebook.onetoc2 b/corpus/m6/live-collaboration-15/transport-disconnected/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/live-collaboration-15/transport-disconnected/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/live-collaboration-15/transport-disconnected/notebook/synthetic.one b/corpus/m6/live-collaboration-15/transport-disconnected/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..cd570977c643d4e20fe4686e292e8e2177ba301c Binary files /dev/null and b/corpus/m6/live-collaboration-15/transport-disconnected/notebook/synthetic.one differ diff --git a/corpus/m6/live-collaboration-15/transport-reconnected/locks.txt b/corpus/m6/live-collaboration-15/transport-reconnected/locks.txt new file mode 100644 index 0000000000000000000000000000000000000000..a60846701a4cbf5f0746e750a2848e8857900b87 --- /dev/null +++ b/corpus/m6/live-collaboration-15/transport-reconnected/locks.txt @@ -0,0 +1,10 @@ + +Locked files: +Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time +-------------------------------------------------------------------------------------------------- +4475 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:15 2026 +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:05:20 2026 +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:04:59 2026 +4475 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026 +4474 1000 DENY_NONE 0x120089 RDONLY LEASE(RH) /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026 + diff --git a/corpus/m6/live-collaboration-15/transport-reconnected/model/assets.json b/corpus/m6/live-collaboration-15/transport-reconnected/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..b1137d2c8f93b856619ffc841a598840985718cf --- /dev/null +++ b/corpus/m6/live-collaboration-15/transport-reconnected/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}},{"path":"assets/1.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/2.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}}] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/transport-reconnected/model/assets/0.bin b/corpus/m6/live-collaboration-15/transport-reconnected/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/live-collaboration-15/transport-reconnected/model/assets/0.bin differ diff --git a/corpus/m6/live-collaboration-15/transport-reconnected/model/assets/1.bin b/corpus/m6/live-collaboration-15/transport-reconnected/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/transport-reconnected/model/assets/1.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/transport-reconnected/model/assets/2.bin b/corpus/m6/live-collaboration-15/transport-reconnected/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/live-collaboration-15/transport-reconnected/model/assets/2.bin differ diff --git a/corpus/m6/live-collaboration-15/transport-reconnected/model/document.json b/corpus/m6/live-collaboration-15/transport-reconnected/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..dc383e43ab96ee19be56ac2299bda15b9b5ad93c --- /dev/null +++ b/corpus/m6/live-collaboration-15/transport-reconnected/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1"},"revisions":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]}}}}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{3322FC41-5152-002C-1A6F-6E54765F3328},1"},"revisions":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"roots":{"1":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10","2":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52","4":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12"},"nodes":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10":{"jcid":393271,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14":{"jcid":393227,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client A concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":2281708924,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141863,"modified":1473141863,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client A concurrent edit.","runs":[{"start":0,"end":25,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281709019,"value":"NoData"},{"id":2281708950,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32","preview":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36":{"jcid":393250,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37":{"jcid":393251,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{E65D3644-B03E-0D81-3269-4A138398381C},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{E65D3644-B03E-0D81-3269-4A138398381C},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-F79A3B95"},"extra":[[{"id":469769720,"value":{"Bytes":"4200390035000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141866,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B concurrent edit.","runs":[{"start":0,"end":25,"format":"{523F023B-8667-0712-0EBD-FF04058A53A5},20","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{523F023B-8667-0712-0EBD-FF04058A53A5},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141866,"modified":1473141866,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{3C0846F2-DF66-0946-0D23-D27E72A28A48},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141900,"modified":1473141900,"original_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","latest_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":["{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[{"id":603993154,"value":{"Objects":["{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1"]}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{55644A5D-B639-0555-287F-86AC4C458A34},10","{03D49648-056C-0F08-32C9-0424E8496E7D},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client B concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},15"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":92.421814,"max_height":21.947718},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},24"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]},"{3C0846F2-DF66-0946-0D23-D27E72A28A48},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141900,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client A offline edit.","runs":[{"start":0,"end":22,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},15":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},16"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},16":{"jcid":393250,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},17"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[45.841827,38.449986],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},17":{"jcid":393251,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},18","{E594A3F5-9F29-07F9-28B0-17B912FA121D},25"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},18":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e9d5eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},24":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141902,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B online cell.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},25":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"0404a9eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},31":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141902,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}},"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/transport-reconnected/model/text.json b/corpus/m6/live-collaboration-15/transport-reconnected/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..914b03493b4cd35367aa8ce05123336ac51e11db --- /dev/null +++ b/corpus/m6/live-collaboration-15/transport-reconnected/model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":[{"text":"Client A concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{E65D3644-B03E-0D81-3269-4A138398381C},1":{"{523F023B-8667-0712-0EBD-FF04058A53A5},19":[{"text":"Client B concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{3C0846F2-DF66-0946-0D23-D27E72A28A48},18":[{"text":"Client A offline edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{E594A3F5-9F29-07F9-28B0-17B912FA121D},24":[{"text":"Client B online cell.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{E594A3F5-9F29-07F9-28B0-17B912FA121D},31":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}]},"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/transport-reconnected/notebook/Open Notebook.onetoc2 b/corpus/m6/live-collaboration-15/transport-reconnected/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/live-collaboration-15/transport-reconnected/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/live-collaboration-15/transport-reconnected/notebook/synthetic.one b/corpus/m6/live-collaboration-15/transport-reconnected/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..87bdf8482d16722d6697d76a699e8864b11d2cd2 Binary files /dev/null and b/corpus/m6/live-collaboration-15/transport-reconnected/notebook/synthetic.one differ diff --git a/corpus/m6/live-collaboration-15/unmount.json b/corpus/m6/live-collaboration-15/unmount.json new file mode 100644 index 0000000000000000000000000000000000000000..3c8f279f900a7263f660da1fe68b9c1d3f729cef --- /dev/null +++ b/corpus/m6/live-collaboration-15/unmount.json @@ -0,0 +1 @@ +{"exit": 0, "stderr": ""} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/vm-restarted/locks.txt b/corpus/m6/live-collaboration-15/vm-restarted/locks.txt new file mode 100644 index 0000000000000000000000000000000000000000..5cd27791646feac5d03d3f0bca4358104a60694e --- /dev/null +++ b/corpus/m6/live-collaboration-15/vm-restarted/locks.txt @@ -0,0 +1,10 @@ + +Locked files: +Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time +-------------------------------------------------------------------------------------------------- +4475 1000 DENY_NONE 0x120089 RDONLY LEASE(H) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:08:51 2026 +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/synthetic.one Sun Sep 6 06:08:59 2026 +4473 1000 DENY_NONE 0x20081 RDONLY LEASE(RH) /srv/agent m6-collaboration/Open Notebook.onetoc2 Sun Sep 6 06:08:59 2026 +4670 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:07:59 2026 +4475 1000 DENY_NONE 0x120089 RDONLY LEASE() /srv/agent m6-collaboration Sun Sep 6 06:05:19 2026 + diff --git a/corpus/m6/live-collaboration-15/vm-restarted/model/assets.json b/corpus/m6/live-collaboration-15/vm-restarted/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..b1137d2c8f93b856619ffc841a598840985718cf --- /dev/null +++ b/corpus/m6/live-collaboration-15/vm-restarted/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}},{"path":"assets/1.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/2.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}}] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/vm-restarted/model/assets/0.bin b/corpus/m6/live-collaboration-15/vm-restarted/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/live-collaboration-15/vm-restarted/model/assets/0.bin differ diff --git a/corpus/m6/live-collaboration-15/vm-restarted/model/assets/1.bin b/corpus/m6/live-collaboration-15/vm-restarted/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-15/vm-restarted/model/assets/1.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/vm-restarted/model/assets/2.bin b/corpus/m6/live-collaboration-15/vm-restarted/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/live-collaboration-15/vm-restarted/model/assets/2.bin differ diff --git a/corpus/m6/live-collaboration-15/vm-restarted/model/document.json b/corpus/m6/live-collaboration-15/vm-restarted/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..6ae8608b42481d1c3bda3f6adb436d524160e336 --- /dev/null +++ b/corpus/m6/live-collaboration-15/vm-restarted/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1"},"revisions":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]}}}}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{3322FC41-5152-002C-1A6F-6E54765F3328},1"},"revisions":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"roots":{"1":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10","2":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52","4":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12"},"nodes":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},10":{"jcid":393271,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},12":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},14":{"jcid":393227,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client A concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":2281708924,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},15":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},16":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141863,"modified":1473141863,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client A concurrent edit.","runs":[{"start":0,"end":25,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281709019,"value":"NoData"},{"id":2281708950,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},21":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":167.04495,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},22":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141822,"modified":1473141822,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141822,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native disjoint edit.","runs":[{"start":0,"end":21,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},19","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},25":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},26":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},27":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},28":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},29":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},30":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},31":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32","preview":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},32":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},33":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},34":{"jcid":393228,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},35":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},36":{"jcid":393250,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},37":{"jcid":393251,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38","{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},38":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},39":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},42":{"jcid":393252,"children":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141890,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},43":{"jcid":393229,"children":[],"content":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","latest_author":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},24","extra_set":null}],"paragraph_style":"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},41","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},45":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},46":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},47":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},49":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},50":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51"]}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},51":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},48"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},52":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{20D097D3-E132-074C-00BE-E24B1DB08942},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{20D097D3-E132-074C-00BE-E24B1DB08942},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-55EF988A"},"extra":[[{"id":469769720,"value":{"Bytes":"3800380041000000"}}]]},"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"ONE-M6-F79A3B95"},"extra":[[{"id":469769720,"value":{"Bytes":"4200390035000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141866,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B concurrent edit.","runs":[{"start":0,"end":25,"format":"{523F023B-8667-0712-0EBD-FF04058A53A5},20","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{523F023B-8667-0712-0EBD-FF04058A53A5},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{523F023B-8667-0712-0EBD-FF04058A53A5},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141866,"modified":1473141866,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":128.48047,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141921,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{1478AE7B-9555-0667-0590-22A323B21308},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141921,"modified":1473141921,"original_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","latest_author":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{1478AE7B-9555-0667-0590-22A323B21308},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141921,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Native lock recovery.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":["{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[{"id":603993154,"value":{"Objects":["{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1"]}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Client B concurrent edit.","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":2281708951,"value":"NoData"}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},10","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{03D49648-056C-0F08-32C9-0424E8496E7D},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141922,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Client B concurrent edit.","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},15"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":92.421814,"max_height":21.947718},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},24"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","latest_author":"{523F023B-8667-0712-0EBD-FF04058A53A5},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{B2F9E0E3-3A87-4F1B-8505-2633CDC0F444},1":{"jcid":131128,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"ConflictMetadata","title":"Client A concurrent edit.","level":1,"author":"snow"},"extra":[[{"id":469769264,"value":{"Bytes":"6d4c500d70a888499d70ce639414e652"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"b0c88ba0c53ddd01"}},{"id":469769631,"value":{"Bytes":"53000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},15":{"jcid":393229,"children":[],"content":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},16"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473141902,"modified":1473141902,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null,"collapse_state":null},"extra":[[]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},16":{"jcid":393250,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},17"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[45.76938,38.522434],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},17":{"jcid":393251,"children":["{E594A3F5-9F29-07F9-28B0-17B912FA121D},18","{E594A3F5-9F29-07F9-28B0-17B912FA121D},25"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},18":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e9d5eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},24":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141902,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Client B online cell.","runs":[{"start":0,"end":21,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},25":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141912,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"0404a9eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{E594A3F5-9F29-07F9-28B0-17B912FA121D},31":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473141902,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16","extra_set":null}],"paragraph_style":"{5E66D936-E9D9-03A5-3325-2FEBF61B6A6D},20","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/vm-restarted/model/text.json b/corpus/m6/live-collaboration-15/vm-restarted/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..860a0d557fbccc68d66d64378e0a71fb69bafc3e --- /dev/null +++ b/corpus/m6/live-collaboration-15/vm-restarted/model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{CC1CC439-FAEC-0BC0-397C-29DEA1750424},1":{}},"{905120D2-0C87-0DF5-3211-F19F17E4C1AC},1":{"{3322FC41-5152-002C-1A6F-6E54765F3328},1":{"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},18":[{"text":"Client A concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},23":[{"text":"Native disjoint edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},40":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{BD9A863A-AF17-019B-3B87-B342EA2F4F7F},44":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{},"{20D097D3-E132-074C-00BE-E24B1DB08942},1":{"{523F023B-8667-0712-0EBD-FF04058A53A5},19":[{"text":"Client B concurrent edit.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{1478AE7B-9555-0667-0590-22A323B21308},19":[{"text":"Native lock recovery.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{E594A3F5-9F29-07F9-28B0-17B912FA121D},24":[{"text":"Client B online cell.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{E594A3F5-9F29-07F9-28B0-17B912FA121D},31":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}]}}} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-15/vm-restarted/notebook/Open Notebook.onetoc2 b/corpus/m6/live-collaboration-15/vm-restarted/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/live-collaboration-15/vm-restarted/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/live-collaboration-15/vm-restarted/notebook/synthetic.one b/corpus/m6/live-collaboration-15/vm-restarted/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..72af11be630604f9d7fa66e81e7861f810203b20 Binary files /dev/null and b/corpus/m6/live-collaboration-15/vm-restarted/notebook/synthetic.one differ diff --git a/corpus/m6/live-collaboration-cold-15/agent.py b/corpus/m6/live-collaboration-cold-15/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/live-collaboration-cold-15/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/m6/live-collaboration-cold-15/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-cold-15/before-read/environment.json b/corpus/m6/live-collaboration-cold-15/before-read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..1915eb66c14829e43f6ada56347d0108be98f85b --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/before-read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-3D7D26BB", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/live-collaboration-cold-15/before-read/hierarchy.xml b/corpus/m6/live-collaboration-cold-15/before-read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..1a979ea9871cc56cdfab1c9bad31d81fcf477b20 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/before-read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-cold-15/before-read/page-000.pdf b/corpus/m6/live-collaboration-cold-15/before-read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8138b32f9690d899efd9abff8a3ba1308448ac83 Binary files /dev/null and b/corpus/m6/live-collaboration-cold-15/before-read/page-000.pdf differ diff --git a/corpus/m6/live-collaboration-cold-15/before-read/page-000.xml b/corpus/m6/live-collaboration-cold-15/before-read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..c38225b94aa55c8973938b0d262d0eabb8ad8991 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/before-read/page-000.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-cold-15/before-read/payloads.json b/corpus/m6/live-collaboration-cold-15/before-read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..eb61534b7416d2511f9cba371ca6b178390c35bc --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/before-read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{CE85720A-41F9-4EFF-A49E-2FA96A338AA8}{11}{B0}", + "kind": "InsertedFile", + "page": "{47CA764C-993B-4D7C-A207-EDF0E91F0C3D}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-cold-15/commands.jsonl b/corpus/m6/live-collaboration-cold-15/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..e7a21bf6795276c37e86d0b14d46723dd26062af --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/commands.jsonl @@ -0,0 +1,6 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-3D7D26BB -ExpectedPages 1 -Pdf -KeepOpen", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\read -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Rename-Item C:\\one-tests\\runs\\capture\\read before-read\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-3D7D26BB -UseCurrentCache -ExpectedPages -1 -Pdf", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/live-collaboration-cold-15/conflict-ui.json b/corpus/m6/live-collaboration-cold-15/conflict-ui.json new file mode 100644 index 0000000000000000000000000000000000000000..4d4f51ccc2842ec07ca4dd100e823ed1ba3c6bf1 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/conflict-ui.json @@ -0,0 +1,6 @@ +{ + "action": "Clicked the native unmerged-changes banner in a fresh cache.", + "observed_main": "Client B concurrent edit.", + "observed_conflict": "Client A concurrent edit.", + "native_status": "Conflicting changes are highlighted in red; read-only conflict page." +} \ No newline at end of file diff --git a/corpus/m6/live-collaboration-cold-15/conflict.png b/corpus/m6/live-collaboration-cold-15/conflict.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb1fdee1c804ecd809111567762f9758558d041 Binary files /dev/null and b/corpus/m6/live-collaboration-cold-15/conflict.png differ diff --git a/corpus/m6/live-collaboration-cold-15/finish b/corpus/m6/live-collaboration-cold-15/finish new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/corpus/m6/live-collaboration-cold-15/format-differences.json b/corpus/m6/live-collaboration-cold-15/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-cold-15/geometry-differences.json b/corpus/m6/live-collaboration-cold-15/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-cold-15/health.json b/corpus/m6/live-collaboration-cold-15/health.json new file mode 100644 index 0000000000000000000000000000000000000000..9424babe6bcda91b8de697a6c1c926d5e04788c2 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-3D7D26BB", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/live-collaboration-cold-15/machine.json b/corpus/m6/live-collaboration-cold-15/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..3841b122adbd7bc873a594d1cc115c20f1a32e73 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/machine.json @@ -0,0 +1 @@ +{"name": "m6-3d7d26bb", "hostname": "ONE-M6-3D7D26BB"} diff --git a/corpus/m6/live-collaboration-cold-15/notebook/Open Notebook.onetoc2 b/corpus/m6/live-collaboration-cold-15/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/live-collaboration-cold-15/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/live-collaboration-cold-15/notebook/synthetic.one b/corpus/m6/live-collaboration-cold-15/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..72af11be630604f9d7fa66e81e7861f810203b20 Binary files /dev/null and b/corpus/m6/live-collaboration-cold-15/notebook/synthetic.one differ diff --git a/corpus/m6/live-collaboration-cold-15/pdf-format-checks.json b/corpus/m6/live-collaboration-cold-15/pdf-format-checks.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/pdf-format-checks.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-cold-15/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/m6/live-collaboration-cold-15/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/live-collaboration-cold-15/read/environment.json b/corpus/m6/live-collaboration-cold-15/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..06b0c540b2244120cce5f8944940b4995a3635cf --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-3D7D26BB", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/live-collaboration-cold-15/read/hierarchy.xml b/corpus/m6/live-collaboration-cold-15/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..1a979ea9871cc56cdfab1c9bad31d81fcf477b20 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/live-collaboration-cold-15/read/page-000.pdf b/corpus/m6/live-collaboration-cold-15/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f0b64ded92852fff81041b600fed40f345d3b97c Binary files /dev/null and b/corpus/m6/live-collaboration-cold-15/read/page-000.pdf differ diff --git a/corpus/m6/live-collaboration-cold-15/read/page-000.xml b/corpus/m6/live-collaboration-cold-15/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b19b34689a955b1ed22a828f3f9bcd6ce77dfd4 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/read/page-000.xml @@ -0,0 +1,21 @@ + +AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/live-collaboration-cold-15/read/payloads.json b/corpus/m6/live-collaboration-cold-15/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..eb61534b7416d2511f9cba371ca6b178390c35bc --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{CE85720A-41F9-4EFF-A49E-2FA96A338AA8}{11}{B0}", + "kind": "InsertedFile", + "page": "{47CA764C-993B-4D7C-A207-EDF0E91F0C3D}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/m6/live-collaboration-cold-15/restart-agent.py b/corpus/m6/live-collaboration-cold-15/restart-agent.py new file mode 100644 index 0000000000000000000000000000000000000000..21a78ac87a0ac79b7906b7a3cdf7ec904cd57ebd --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/restart-agent.py @@ -0,0 +1,35 @@ +"""Run through the old agent's detached spawn endpoint in a disposable clone.""" +import os +import ctypes +from ctypes import wintypes +import subprocess +import sys +import time + +if len(sys.argv) != 2 or not sys.argv[1].startswith('ONE-M6-') or os.environ.get('COMPUTERNAME') != sys.argv[1]: + raise SystemExit('The disposable clone hostname does not match.') +parent = os.getppid() +kernel = ctypes.WinDLL('kernel32', use_last_error=True) +kernel.OpenProcess.argtypes = (wintypes.DWORD, wintypes.BOOL, wintypes.DWORD) +kernel.OpenProcess.restype = wintypes.HANDLE +kernel.TerminateProcess.argtypes = (wintypes.HANDLE, wintypes.UINT) +kernel.TerminateProcess.restype = wintypes.BOOL +kernel.WaitForSingleObject.argtypes = (wintypes.HANDLE, wintypes.DWORD) +kernel.WaitForSingleObject.restype = wintypes.DWORD +kernel.CloseHandle.argtypes = (wintypes.HANDLE,) +kernel.CloseHandle.restype = wintypes.BOOL +handle = kernel.OpenProcess(0x100001, False, parent) +if not handle: + raise ctypes.WinError(ctypes.get_last_error()) +time.sleep(0.5) +try: + if not kernel.TerminateProcess(handle, 0): + raise ctypes.WinError(ctypes.get_last_error()) + if kernel.WaitForSingleObject(handle, 5000) != 0: + raise RuntimeError('The old agent did not terminate.') +finally: + kernel.CloseHandle(handle) +with open(r'C:\one-tests\agent-restart.log', 'ab') as log: + subprocess.Popen([sys.executable, r'C:\win7-agent\agent.py'], stdin=subprocess.DEVNULL, + stdout=log, stderr=log, close_fds=True, + creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP) diff --git a/corpus/m6/live-collaboration-cold-15/run.json b/corpus/m6/live-collaboration-cold-15/run.json new file mode 100644 index 0000000000000000000000000000000000000000..cba0815133fe6e751531a02125a987fd74e0f36a --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m6/live-collaboration-15/vm-restarted/notebook", + "expected_pages": 1, + "author": null, + "author_timeout_seconds": 600, + "inspect": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/m6/live-collaboration-cold-15/scripts/cold.ps1 b/corpus/m6/live-collaboration-cold-15/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/live-collaboration-cold-15/scripts/read.ps1 b/corpus/m6/live-collaboration-cold-15/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/live-collaboration-cold-15/source.json b/corpus/m6/live-collaboration-cold-15/source.json new file mode 100644 index 0000000000000000000000000000000000000000..5fccfd1b434f932b75d5970afe6dcec9f199f9e3 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 4944, + "sha256": "36274ad5cc077c6b1ad51ee4c4b90d3b6798a45ce446cbfd7c9d7ac504776b28", + "mtime_ns": 1788674939460499909 + }, + { + "path": "synthetic.one", + "bytes": 51312, + "sha256": "4ded7eeabd8136e8b09809009bb699fac55fd95ab21b2f087461eac39eb11d22", + "mtime_ns": 1788674939456770698 + } +] diff --git a/corpus/m6/live-collaboration-cold-15/teardown.json b/corpus/m6/live-collaboration-cold-15/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/live-collaboration-cold-15/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-break-controls-02/ORACLE.md b/corpus/m6/native-break-controls-02/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..4aa48695591726c4b997298f9c34dbcd4c8fac71 --- /dev/null +++ b/corpus/m6/native-break-controls-02/ORACLE.md @@ -0,0 +1,7 @@ +# Native paragraph-break controls + +OneNote 2010 14.0.4763.1000 authored the 24 cases in `notebook/fixture.json` through the captured `scripts/author.ps1`; `read/` contains native XML and PDF exports. The clone was deleted (`teardown.json`). + +Twelve inputs appear both as styled plain text and as hyperlink labels. Literal line endings become stored carriage returns; a `
` followed by a newline also survives. Bare `
` elements without a following newline were discarded by this COM import. Native HTML export omits exactly one final carriage return while preserving preceding breaks. Hyperlink fields exclude the breaks. `comparison.json` records each stored/native observation. + +The Rust test asserts the stored text and associated link boundaries. The independent Python oracle checks that removing another break causes a failure. This is evidence for the observed COM import/export behavior, not permission to trim arbitrary whitespace. diff --git a/corpus/m6/native-break-controls-02/agent.py b/corpus/m6/native-break-controls-02/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-break-controls-02/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-break-controls-02/commands.jsonl b/corpus/m6/native-break-controls-02/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..de4bd22dab86e19c63565396fa1556b42050c0bc --- /dev/null +++ b/corpus/m6/native-break-controls-02/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-E1CF835F", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-E1CF835F -ExpectedPages 2 -UseCurrentCache -Pdf", "exit": 0, "stdout": "Read 1 sections and 2 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-break-controls-02/comparison.json b/corpus/m6/native-break-controls-02/comparison.json new file mode 100644 index 0000000000000000000000000000000000000000..3993ce49839e154ffef2f378205320aff665edf9 --- /dev/null +++ b/corpus/m6/native-break-controls-02/comparison.json @@ -0,0 +1,334 @@ +[ + { + "case": 0, + "stored": "A", + "native": "A", + "runs": [ + [ + "A", + false + ] + ] + }, + { + "case": 1, + "stored": "A\r", + "native": "A", + "runs": [ + [ + "A\r", + false + ] + ] + }, + { + "case": 2, + "stored": "A\r\r", + "native": "A\n", + "runs": [ + [ + "A\r\r", + false + ] + ] + }, + { + "case": 3, + "stored": "\rA", + "native": "\nA", + "runs": [ + [ + "\rA", + false + ] + ] + }, + { + "case": 4, + "stored": "\rA\r", + "native": "\nA", + "runs": [ + [ + "\rA\r", + false + ] + ] + }, + { + "case": 5, + "stored": "\r", + "native": "", + "runs": [ + [ + "\r", + false + ] + ] + }, + { + "case": 6, + "stored": "\r\r", + "native": "\n", + "runs": [ + [ + "\r\r", + false + ] + ] + }, + { + "case": 7, + "stored": "A\rB\r", + "native": "A\nB", + "runs": [ + [ + "A\rB\r", + false + ] + ] + }, + { + "case": 8, + "stored": "A\rB\r", + "native": "A\nB", + "runs": [ + [ + "A\rB\r", + false + ] + ] + }, + { + "case": 9, + "stored": "AB", + "native": "AB", + "runs": [ + [ + "AB", + false + ] + ] + }, + { + "case": 10, + "stored": "A\rB\r", + "native": "A\nB", + "runs": [ + [ + "A\rB\r", + false + ] + ] + }, + { + "case": 11, + "stored": "A\rB\r", + "native": "A\nB", + "runs": [ + [ + "A\rB\r", + false + ] + ] + }, + { + "case": 12, + "stored": "A", + "native": "A", + "runs": [ + [ + "A", + true + ] + ] + }, + { + "case": 13, + "stored": "A\r", + "native": "A", + "runs": [ + [ + "A", + true + ], + [ + "\r", + false + ] + ] + }, + { + "case": 14, + "stored": "A\r\r", + "native": "A\n", + "runs": [ + [ + "A", + true + ], + [ + "\r\r", + false + ] + ] + }, + { + "case": 15, + "stored": "\rA", + "native": "\nA", + "runs": [ + [ + "\r", + false + ], + [ + "A", + true + ] + ] + }, + { + "case": 16, + "stored": "\rA\r", + "native": "\nA", + "runs": [ + [ + "\r", + false + ], + [ + "A", + true + ], + [ + "\r", + false + ] + ] + }, + { + "case": 17, + "stored": "\r", + "native": "", + "runs": [ + [ + "\r", + false + ] + ] + }, + { + "case": 18, + "stored": "\r\r", + "native": "\n", + "runs": [ + [ + "\r\r", + false + ] + ] + }, + { + "case": 19, + "stored": "A\rB\r", + "native": "A\nB", + "runs": [ + [ + "A", + true + ], + [ + "\r", + false + ], + [ + "B", + true + ], + [ + "\r", + false + ] + ] + }, + { + "case": 20, + "stored": "A\rB\r", + "native": "A\nB", + "runs": [ + [ + "A", + true + ], + [ + "\r", + false + ], + [ + "B", + true + ], + [ + "\r", + false + ] + ] + }, + { + "case": 21, + "stored": "AB", + "native": "AB", + "runs": [ + [ + "AB", + true + ] + ] + }, + { + "case": 22, + "stored": "A\rB\r", + "native": "A\nB", + "runs": [ + [ + "A", + true + ], + [ + "\r", + false + ], + [ + "B", + true + ], + [ + "\r", + false + ] + ] + }, + { + "case": 23, + "stored": "A\rB\r", + "native": "A\nB", + "runs": [ + [ + "A", + true + ], + [ + "\r", + false + ], + [ + "B", + true + ], + [ + "\r", + false + ] + ] + } +] \ No newline at end of file diff --git a/corpus/m6/native-break-controls-02/format-differences.json b/corpus/m6/native-break-controls-02/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-break-controls-02/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-break-controls-02/geometry-differences.json b/corpus/m6/native-break-controls-02/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-break-controls-02/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-break-controls-02/health.json b/corpus/m6/native-break-controls-02/health.json new file mode 100644 index 0000000000000000000000000000000000000000..fceed8261d8388bf2dde8168c0102eb9073e694d --- /dev/null +++ b/corpus/m6/native-break-controls-02/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-E1CF835F", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-break-controls-02/inputs/page-000.xml b/corpus/m6/native-break-controls-02/inputs/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..bab44a6dd9f461ffeb6b78c81814c26be726c3f6 --- /dev/null +++ b/corpus/m6/native-break-controls-02/inputs/page-000.xml @@ -0,0 +1,35 @@ +Styled break controlsA]]>A +]]>A + +]]> +A]]> +A +]]> +]]> + +]]>A +B +]]>A
+B
+]]>
A

B]]>
A +B +]]>A +B +]]>A]]>A +]]>A + +]]> +A]]> +A +]]> +]]> + +]]>A +B +]]>A
+B
+
]]>
A

B
]]>
A +B +]]>A +B +]]>
\ No newline at end of file diff --git a/corpus/m6/native-break-controls-02/machine.json b/corpus/m6/native-break-controls-02/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..fd7f405a669e7c14fe04efbfa07b36baa1690e69 --- /dev/null +++ b/corpus/m6/native-break-controls-02/machine.json @@ -0,0 +1 @@ +{"name": "m6-e1cf835f", "hostname": "ONE-M6-E1CF835F"} diff --git a/corpus/m6/native-break-controls-02/notebook/Open Notebook.onetoc2 b/corpus/m6/native-break-controls-02/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..a1fe224c3a98449d8f4c74c1253c873fabffdea6 Binary files /dev/null and b/corpus/m6/native-break-controls-02/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-break-controls-02/notebook/fixture.json b/corpus/m6/native-break-controls-02/notebook/fixture.json new file mode 100644 index 0000000000000000000000000000000000000000..9bc85f84df7c8f282332dfc3c40f89d4f05aa0fd --- /dev/null +++ b/corpus/m6/native-break-controls-02/notebook/fixture.json @@ -0,0 +1 @@ +{"sections": ["synthetic.one"], "pages": [{"section": "synthetic.one", "xml": "Styled break controlsA]]>A\n]]>A\n\n]]>\nA]]>\nA\n]]>\n]]>\n\n]]>A\nB\n]]>A
\nB
\n]]>
A

B]]>
A\rB\r]]>A\r\nB\r\n]]>A]]>A\n]]>A\n\n]]>\nA]]>\nA\n]]>\n]]>\n\n]]>A\nB\n]]>A
\nB
\n
]]>
A

B
]]>
A\rB\r]]>A\r\nB\r\n]]>
"}], "cases": ["A", "A\n", "A\n\n", "\nA", "\nA\n", "\n", "\n\n", "A\nB\n", "A
\nB
\n", "A

B", "A\rB\r", "A\r\nB\r\n"]} \ No newline at end of file diff --git a/corpus/m6/native-break-controls-02/notebook/synthetic.one b/corpus/m6/native-break-controls-02/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..22e7eb717cca1c2d8bfeed12f3ebed1cb08a439e Binary files /dev/null and b/corpus/m6/native-break-controls-02/notebook/synthetic.one differ diff --git a/corpus/m6/native-break-controls-02/pdf-format-checks.json b/corpus/m6/native-break-controls-02/pdf-format-checks.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-break-controls-02/pdf-format-checks.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-break-controls-02/read/environment.json b/corpus/m6/native-break-controls-02/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..aaa583957cfdb081dd2884b808c21000a2203c76 --- /dev/null +++ b/corpus/m6/native-break-controls-02/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-E1CF835F", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-break-controls-02/read/hierarchy.xml b/corpus/m6/native-break-controls-02/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..4424b057da6fd59b998f75d468bd566ce9627c22 --- /dev/null +++ b/corpus/m6/native-break-controls-02/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-break-controls-02/read/page-000.pdf b/corpus/m6/native-break-controls-02/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d727737f46e6c0c2b4e9cf84009502400036380d Binary files /dev/null and b/corpus/m6/native-break-controls-02/read/page-000.pdf differ diff --git a/corpus/m6/native-break-controls-02/read/page-000.xml b/corpus/m6/native-break-controls-02/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..4304f9762dee3b570c1b0143763d016e90424802 --- /dev/null +++ b/corpus/m6/native-break-controls-02/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-break-controls-02/read/page-001.pdf b/corpus/m6/native-break-controls-02/read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f66d532e17dead3f44ae88ed275f64bc34a48c88 Binary files /dev/null and b/corpus/m6/native-break-controls-02/read/page-001.pdf differ diff --git a/corpus/m6/native-break-controls-02/read/page-001.xml b/corpus/m6/native-break-controls-02/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..202d61cf3af6bbd969a5ecfd0f6123763d4b7904 --- /dev/null +++ b/corpus/m6/native-break-controls-02/read/page-001.xml @@ -0,0 +1,52 @@ + +A]]>A]]>A
+]]>

+A]]>

+A]]>

+]]>
A
+B]]>
A
+B]]>
AB]]>A
+B]]>
A
+B]]>
A]]>A]]>A
+
]]>

+A]]>

+A]]>

+]]>
A
+
B]]>
A
+
B]]>
AB]]>A
+
B]]>
A
+
B]]>
diff --git a/corpus/m6/native-break-controls-02/read/payloads.json b/corpus/m6/native-break-controls-02/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/m6/native-break-controls-02/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/m6/native-break-controls-02/run.json b/corpus/m6/native-break-controls-02/run.json new file mode 100644 index 0000000000000000000000000000000000000000..4659490bb18a78ba5eb1645323bcb201db4f554b --- /dev/null +++ b/corpus/m6/native-break-controls-02/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m6/break-controls-input-02/notebook", + "expected_pages": 2, + "author": "tools/native/pages.ps1", + "author_timeout_seconds": 600, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "dfbf0e016aa4c8486ecea9f39768c633de05ac0db8214139052ca2e9c43bbd02", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "fc7199ff4e01a5d18dbc6d472130006ef6f195a8f944daa33eaf6de2ac896553" + } +} diff --git a/corpus/m6/native-break-controls-02/scripts/author.ps1 b/corpus/m6/native-break-controls-02/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..8e428618e3452caa35da88687293b520c273b6c6 --- /dev/null +++ b/corpus/m6/native-break-controls-02/scripts/author.ps1 @@ -0,0 +1,42 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$fixture = Get-Content (Join-Path $Root 'notebook\fixture.json') -Raw -Encoding UTF8 | ConvertFrom-Json +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sections = @{} + foreach ($path in $fixture.sections) { + $parts = $path.Split('/') + if (@($parts | Where-Object { $_ -in @('', '.', '..') -or $_.Contains('\') -or $_.Contains(':') }).Count) { throw 'Invalid fixture section path.' } + $parent = $notebookId + for ($index = 0; $index -lt $parts.Count; $index++) { + $id = '' + $app.OpenHierarchy($parts[$index], $parent, [ref]$id, $(if ($index -eq $parts.Count - 1) {3} else {2})) + $parent = $id + } + $sections[$path] = $id + } + $index = 0 + foreach ($item in $fixture.pages) { + $pageId = '' + $app.CreateNewPage($sections[$item.section], [ref]$pageId, 0) + [xml]$xml = $item.xml.Replace('__ASSETS__', [Security.SecurityElement]::Escape((Join-Path $Root 'notebook\fixture-data'))) + $xml.DocumentElement.SetAttribute('ID', $pageId) + [IO.File]::WriteAllText((Join-Path $inputs ('page-{0:d3}.xml' -f $index)), $xml.OuterXml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml.OuterXml, [DateTime]::MinValue, 1, $true) + $index++ + } + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/corpus/m6/native-break-controls-02/scripts/cold.ps1 b/corpus/m6/native-break-controls-02/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-break-controls-02/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-break-controls-02/scripts/read.ps1 b/corpus/m6/native-break-controls-02/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..ec9463bef5b3fc7be427a10f19c42c4338186945 --- /dev/null +++ b/corpus/m6/native-break-controls-02/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 3, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-break-controls-02/source.json b/corpus/m6/native-break-controls-02/source.json new file mode 100644 index 0000000000000000000000000000000000000000..377a81f73d7ede6c6f0ae92c63d9e450af18a104 --- /dev/null +++ b/corpus/m6/native-break-controls-02/source.json @@ -0,0 +1,20 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86", + "mtime_ns": 1788592288950419463 + }, + { + "path": "fixture.json", + "bytes": 4085, + "sha256": "1134db947e265760ce2b8878403b30a5b2331877deaf0d50dded514e27f21f06", + "mtime_ns": 1788663856776054389 + }, + { + "path": "synthetic.one", + "bytes": 3348, + "sha256": "b0662387c3fdc256d8dbe809e3b8f73b3586559696467fb1fff8f589095fa797", + "mtime_ns": 1788592288941514581 + } +] diff --git a/corpus/m6/native-break-controls-02/teardown.json b/corpus/m6/native-break-controls-02/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-break-controls-02/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-empty-link-01/ORACLE.md b/corpus/m6/native-empty-link-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..de85e18525360ca5c9945f2115f21ccf626f0402 --- /dev/null +++ b/corpus/m6/native-empty-link-01/ORACLE.md @@ -0,0 +1,5 @@ +# Empty hyperlink after a reduced native edit history + +This is attempt 37 of `evidence/m6/history-shrink-21`: an independently replayed seed-21 history reduced from 20 operations to insertion, hyperlink assignment, and replacement by empty text. `notebook/histories.json` contains the three operations; native XML retains an empty paragraph with its default quick style. Visible characters have neither hyperlink nor character formatting to compare. + +The frozen original comparator reported a hyperlink mismatch. Its saved comparison and all 37 teardown records remain in the shrink campaign. The corrected comparator passes this capture; `history-differences.json` is empty. The clone was deleted (`teardown.json`). diff --git a/corpus/m6/native-empty-link-01/agent.py b/corpus/m6/native-empty-link-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-empty-link-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-empty-link-01/commands.jsonl b/corpus/m6/native-empty-link-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..daa58a08a6053de39893b01b8a6be4b38ee4b902 --- /dev/null +++ b/corpus/m6/native-empty-link-01/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-A29B65F7", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-A29B65F7 -ExpectedPages 2 -UseCurrentCache", "exit": 0, "stdout": "Read 1 sections and 2 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-empty-link-01/health.json b/corpus/m6/native-empty-link-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..81689c65d8a72499a22b557b0c955629628d0990 --- /dev/null +++ b/corpus/m6/native-empty-link-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-A29B65F7", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-empty-link-01/history-differences.json b/corpus/m6/native-empty-link-01/history-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-empty-link-01/history-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-empty-link-01/inputs/000021-00.xml b/corpus/m6/native-empty-link-01/inputs/000021-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..401562792227c1a47ced95d8067034b4737c9414 --- /dev/null +++ b/corpus/m6/native-empty-link-01/inputs/000021-00.xml @@ -0,0 +1 @@ +History 000021Initial 0]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-empty-link-01/inputs/000021-01.xml b/corpus/m6/native-empty-link-01/inputs/000021-01.xml new file mode 100644 index 0000000000000000000000000000000000000000..40f1a80e673b4f3a43100ad9338e7bc8f28e31a2 --- /dev/null +++ b/corpus/m6/native-empty-link-01/inputs/000021-01.xml @@ -0,0 +1 @@ +History 000021Initial 0]]>literal <b> & "quotes"]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-empty-link-01/inputs/000021-02.xml b/corpus/m6/native-empty-link-01/inputs/000021-02.xml new file mode 100644 index 0000000000000000000000000000000000000000..bfece580d86d187474c45afaba9782ee597a66ce --- /dev/null +++ b/corpus/m6/native-empty-link-01/inputs/000021-02.xml @@ -0,0 +1 @@ +History 000021Initial 0]]>literal <b> & "quotes"]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-empty-link-01/inputs/000021-03.xml b/corpus/m6/native-empty-link-01/inputs/000021-03.xml new file mode 100644 index 0000000000000000000000000000000000000000..33ba09819d1fe1b1cdaa8323b5e897f45b15dfcd --- /dev/null +++ b/corpus/m6/native-empty-link-01/inputs/000021-03.xml @@ -0,0 +1 @@ +History 000021Initial 0]]>]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-empty-link-01/machine.json b/corpus/m6/native-empty-link-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..f07548095876889ad1fb2ef621e2b63543cbffff --- /dev/null +++ b/corpus/m6/native-empty-link-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-a29b65f7", "hostname": "ONE-M6-A29B65F7"} diff --git a/corpus/m6/native-empty-link-01/notebook/Open Notebook.onetoc2 b/corpus/m6/native-empty-link-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..7487cab92e1684ee59ff26219726d2fa9348852c Binary files /dev/null and b/corpus/m6/native-empty-link-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-empty-link-01/notebook/histories.json b/corpus/m6/native-empty-link-01/notebook/histories.json new file mode 100644 index 0000000000000000000000000000000000000000..cd21f4c45c3b8aadf21f07d5b953b59ae95fcd47 --- /dev/null +++ b/corpus/m6/native-empty-link-01/notebook/histories.json @@ -0,0 +1,103 @@ +[ + { + "seed": 21, + "title": "History 000021", + "initial": { + "paragraphs": [ + { + "id": "p0", + "text": "Initial 0", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p1", + "text": "Initial 1", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p2", + "text": "Initial 2", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p3", + "text": "Initial 3", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + } + ], + "table": [ + [ + "Cell 0,0", + "Cell 0,1" + ], + [ + "Cell 1,0", + "Cell 1,1" + ] + ], + "x": 72, + "y": 108 + }, + "operations": [ + { + "kind": "insert", + "index": 1, + "paragraph": { + "id": "new2", + "text": "literal & \"quotes\"", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + } + }, + { + "kind": "link", + "index": 1, + "value": "https://example.invalid/21/4?a=1&b=2" + }, + { + "kind": "text", + "index": 1, + "value": "" + } + ] + } +] \ No newline at end of file diff --git a/corpus/m6/native-empty-link-01/notebook/synthetic.one b/corpus/m6/native-empty-link-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..e6905222c6ef3643c3ea7a9c3e70dbbf06f2b026 Binary files /dev/null and b/corpus/m6/native-empty-link-01/notebook/synthetic.one differ diff --git a/corpus/m6/native-empty-link-01/operations.jsonl b/corpus/m6/native-empty-link-01/operations.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..f1a99fd302017cc92916997050574003523674e0 --- /dev/null +++ b/corpus/m6/native-empty-link-01/operations.jsonl @@ -0,0 +1,4 @@ +{"step":-1,"seed":21,"page":"{EE3F2786-ED24-4AEA-A83B-AD8BBD52F259}{1}{B0}","outline":"{9258C4D4-F535-4B59-9F13-4CB5482DD286}{39}{B0}"} +{"step":0,"seed":21,"page":"{EE3F2786-ED24-4AEA-A83B-AD8BBD52F259}{1}{B0}","outline":"{9258C4D4-F535-4B59-9F13-4CB5482DD286}{39}{B0}"} +{"step":1,"seed":21,"page":"{EE3F2786-ED24-4AEA-A83B-AD8BBD52F259}{1}{B0}","outline":"{9258C4D4-F535-4B59-9F13-4CB5482DD286}{39}{B0}"} +{"step":2,"seed":21,"page":"{EE3F2786-ED24-4AEA-A83B-AD8BBD52F259}{1}{B0}","outline":"{9258C4D4-F535-4B59-9F13-4CB5482DD286}{39}{B0}"} diff --git a/corpus/m6/native-empty-link-01/read/environment.json b/corpus/m6/native-empty-link-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..1591c298fc7282ea430a0347e616927a923f4f17 --- /dev/null +++ b/corpus/m6/native-empty-link-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-A29B65F7", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-empty-link-01/read/hierarchy.xml b/corpus/m6/native-empty-link-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..79a9d64e5780fc75d23fe7217254c7fbc353ed12 --- /dev/null +++ b/corpus/m6/native-empty-link-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-empty-link-01/read/page-000.xml b/corpus/m6/native-empty-link-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..300af8a704c87cafd3392d0c6faa2d3c747839d8 --- /dev/null +++ b/corpus/m6/native-empty-link-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-empty-link-01/read/page-001.xml b/corpus/m6/native-empty-link-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..a80f401b7c32dcb5e9959fe4ac37dd771fd40849 --- /dev/null +++ b/corpus/m6/native-empty-link-01/read/page-001.xml @@ -0,0 +1,6 @@ + +Initial 0]]>Initial 1]]>Initial 2]]>Initial 3]]> diff --git a/corpus/m6/native-empty-link-01/read/payloads.json b/corpus/m6/native-empty-link-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/m6/native-empty-link-01/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/m6/native-empty-link-01/run.json b/corpus/m6/native-empty-link-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..9151c5c2bee918eec01c10311bfb0ca8ef685086 --- /dev/null +++ b/corpus/m6/native-empty-link-01/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m6/history-shrink-21/attempt-037/input", + "expected_pages": 2, + "author": "/Users/clo/dev/one/tools/native/history.ps1", + "author_timeout_seconds": 600, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "397acf4be501afc3c5cd8d64e84f0cf2a828314fb98a1d394ccdf2fe95b870c8", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/m6/native-empty-link-01/scripts/author.ps1 b/corpus/m6/native-empty-link-01/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..cd461e15bee637b103b71825f377ee519998bf96 --- /dev/null +++ b/corpus/m6/native-empty-link-01/scripts/author.ps1 @@ -0,0 +1,83 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$histories = Get-Content (Join-Path $Root 'notebook\histories.json') -Raw -Encoding UTF8 | ConvertFrom-Json +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$namespace = 'http://schemas.microsoft.com/office/onenote/2010/onenote' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sectionId = '' + $app.OpenHierarchy('synthetic.one', $notebookId, [ref]$sectionId, 0) + foreach ($history in $histories) { + $pageId = '' + $app.CreateNewPage($sectionId, [ref]$pageId, 0) + $state = $history.initial + $paragraphs = New-Object Collections.ArrayList + foreach ($paragraph in $state.paragraphs) { [void]$paragraphs.Add($paragraph) } + $ids = @{} + $outlineId = '' + for ($step = -1; $step -lt $history.operations.Count; $step++) { + if ($step -ge 0) { + $op = $history.operations[$step] + switch ($op.kind) { + 'insert' { $paragraphs.Insert($op.index, $op.paragraph) } + 'delete' { $paragraphs.RemoveAt($op.index) } + 'move' { $paragraph = $paragraphs[$op.index]; $paragraphs.RemoveAt($op.index); $paragraphs.Insert($op.to, $paragraph) } + 'position' { $state.x = $op.x; $state.y = $op.y } + 'cell' { $state.table[$op.row][$op.column] = $op.text } + default { $property = $op.kind; $paragraphs[$op.index].$property = $op.value } + } + } + $xml = '' + $history.title + '' + foreach ($paragraph in $paragraphs) { + $xml += '' + [Security.SecurityElement]::Escape($paragraph.text) + '' + if ($paragraph.link) { $html = '' + $html + '' } + $xml += '' + } + $xml += '' + foreach ($row in $state.table) { + $xml += '' + foreach ($cell in $row) { $xml += '' } + $xml += '' + } + $xml += '' + [IO.File]::WriteAllText((Join-Path $inputs ('{0:d6}-{1:d2}.xml' -f $history.seed, ($step + 1))), $xml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $true) + $content = '' + $app.GetPageContent($pageId, [ref]$content, 3, 1) + [xml]$document = $content + $manager = New-Object Xml.XmlNamespaceManager($document.NameTable) + $manager.AddNamespace('one', $namespace) + $outline = $document.SelectSingleNode('/one:Page/one:Outline', $manager) + $outlineId = $outline.GetAttribute('objectID') + $objects = @($outline.SelectNodes('one:OEChildren/one:OE[one:T]', $manager)) + if ($objects.Count -ne $paragraphs.Count) { throw "Native paragraph count changed at seed $($history.seed), step $step." } + for ($index = 0; $index -lt $paragraphs.Count; $index++) { $ids[$paragraphs[$index].id] = $objects[$index].GetAttribute('objectID') } + $log = @{ seed = $history.seed; step = $step; page = $pageId; outline = $outlineId } | ConvertTo-Json -Compress + [IO.File]::AppendAllText((Join-Path $Root 'operations.jsonl'), $log + [Environment]::NewLine, [Text.Encoding]::UTF8) + } + } + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/corpus/m6/native-empty-link-01/scripts/cold.ps1 b/corpus/m6/native-empty-link-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-empty-link-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-empty-link-01/scripts/read.ps1 b/corpus/m6/native-empty-link-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/corpus/m6/native-empty-link-01/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-empty-link-01/source.json b/corpus/m6/native-empty-link-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..ed8578e63ee1c6c8532d5f5ded7e4ee7e98db30f --- /dev/null +++ b/corpus/m6/native-empty-link-01/source.json @@ -0,0 +1,20 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86", + "mtime_ns": 1788592288950419463 + }, + { + "path": "histories.json", + "bytes": 2205, + "sha256": "dc7284d1d419a529f16898ace54434486dedda3e7cd1cdc035e90d6c51a69a76", + "mtime_ns": 1788666437865233873 + }, + { + "path": "synthetic.one", + "bytes": 3348, + "sha256": "b0662387c3fdc256d8dbe809e3b8f73b3586559696467fb1fff8f589095fa797", + "mtime_ns": 1788592288941514581 + } +] diff --git a/corpus/m6/native-empty-link-01/teardown.json b/corpus/m6/native-empty-link-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-empty-link-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-expanded-control-ui-01/ORACLE.md b/corpus/m6/native-expanded-control-ui-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..c245e8e009776e9e5405122fbb883a2fecd0bb58 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/ORACLE.md @@ -0,0 +1,16 @@ +# Native paragraph expansion control + +The input is `../native-features-01/notebook`. A fresh OneNote 14.0.4763.1000 +clone opened it, and the paragraph handle was double-clicked as recorded in +`ui-operation.json`. `expanded.png` shows both descendants visible. + +The selected paragraph reports `collapsed="1"` in `before-read` XML and omits +that attribute in `read` XML. Both captures retain the child and grandchild. +The copied `Features.one` is byte-identical to the input. Native PDF publication +still hides the descendants in both captures, despite the expanded desktop view. +Thus transient native view state and the PDF rendering are distinct oracles. +`tools/test_document_oracle.py` locks in these observations. + +A preceding COM experiment accepted `collapsed="false"` in UpdatePageContent +without changing the returned collapse state. Its failure evidence remains in +`evidence/m6/native-expanded-control-03`; it is not an expansion control. diff --git a/corpus/m6/native-expanded-control-ui-01/agent.py b/corpus/m6/native-expanded-control-ui-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment b/corpus/m6/native-expanded-control-ui-01/before-read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment new file mode 100644 index 0000000000000000000000000000000000000000..a959c053358a06abc072d3492e7a86d2e712d804 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment b/corpus/m6/native-expanded-control-ui-01/before-read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment new file mode 100644 index 0000000000000000000000000000000000000000..96260477f0ca60b1605e2971d8cdc146b8b4e02b Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/environment.json b/corpus/m6/native-expanded-control-ui-01/before-read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..110d79441f8bce81043b2b4308b99cac79047c08 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-DB65123D", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/hierarchy.xml b/corpus/m6/native-expanded-control-ui-01/before-read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..db43475ddfa13cf6caac609147caf03513b289bc --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-000.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4b14b03f49fd44ad2ed8f42b96a193b24df8ece5 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-000.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-000.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..ce624362a41205c55eec9ec0e5648e82ef0d0a7e --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-001.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..df3b608937311273b80c10cfa9aabdeb2ad174ef Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-001.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-001.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..ab5e4b6e8f46300bfca7b0f57a4f7fa770c47b2c --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-001.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-002.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-002.pdf new file mode 100644 index 0000000000000000000000000000000000000000..26b9337eb9c987a0b4dbb8fdd4bc645d9b55f671 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-002.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-002.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..940ac08e22f678a8eac27469bc827847053661e4 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-002.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-003.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-003.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c6547ff5bed8cdd0d5e9bd071d6cf359e3e1aa4c Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-003.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-003.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..6d4239d66eae97ffb8caee754bd0ddd3bd148d87 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-003.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-004.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-004.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4506a79e378a1cec19479f0f41c1d306e2dee61a Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-004.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-004.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..3c9e3be854a3da40c32f79f75e83c9aa80e4a8f1 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-004.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-005.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-005.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b300c5361b3db7fbf5ef2baebb5f09d18ad1d8a7 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-005.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-005.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..96dfece92abc39ff1675d1e18a69260038273379 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-005.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-006.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-006.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a61fafab805b9287fcf1bcac6c3cff5fed977435 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-006.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-006.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..f733aa20532b1e9e037b0ad8ff26151e346384a0 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-006.xml @@ -0,0 +1,300 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAEImSURBVHheDbiBV2GL+v+/f9V1q+uk46TjpDFp +TBqDMUhoh3Zoh3Zoh3Zoh3YYgzE0Jo1J46TjpOOk61Yf32pZ1bKqZVXLqpZV/W2/8y8863nez/v1 +AgAAaAL+vxagiQQ0twIt7cC/yACpA/h3J9BKBdq6gPZu4D90gNwD/NQLdDABSh/Q2Q/8zAaoA8Av +g0AXF6DxgG4B8KsQoIuA3yRAjxRgyIBeBfACBJhK4KUa6IMAlgbo1wGvYICtB14bgQEE4JiAQQvw +BgW4VuCtHeBhAN8BCFzAOxwQuoH3XkBEAGIfIAkAQ0FAGgKGI4AsCshjgGIFGEkA4CowugYoU4Bq +HVBvAGMZANoExrcATQ7QbgO6HWCiAMC7wOQeoC8Bhn3AeAhMlQHkCJg+AUwVwHwKWM6BmSqAXgCz +V4C1BtiuAfstMFcHsDtg/gFwNADnI+B6BhYAoPn/a2puamluJjW3tDb/q72ZRG7+d0dza2dzG7W5 +vav5P93NZHrzTz3NHb3NFGZzZ1/zz/3NVHbzLwPNXYPNNG5zN6/5V0EzXdj8m6i5R9LMkDb3yppf +KJqZYPNLZXOfupkFNfdrml/pmtlw82t984CxmYM0D5qa31iauWjzW2szz97Mx5oFjuZ3rmYh3vze +3SzyNouJZomveSjQLA02D4eaZZFmebRZEWseWWkGE82jq83KtWZVqlm93jy20Qxlmsc3mzVbzdpc +s267eWKnGS40T+426/eaDaVm437z1GEzUm6ePmo2nTSbK82W0+aZ82a02jx70Wy9arbVmu3XzXO3 +zVi9ef6u2fHQ7Gw0ux6bF56bcQAgNTX9MxtSC4n0r1YSqZ30bzKptYPU1klqp5L+00Uid5N+opM6 +ekiUXlInk/RzH4naT/qFTeoaINEGSd1c0q88El1A+k1I6hGRGBJSr5T0QkZiKkgvQVKfksRSk/oh +0isNia0jvYZJA3oSx0gaREhvTCSuhfQWJfGsJL6dJMBI7xwkoYv0HieJ3CSxlyQhSEM+kjRAGg6S +ZCGSPEJSREkjMRK4QhpNkJSrJNUaSZ0ija2ToA3SeIak2SRpt0i6HGlimwTvkCYLJP0uybBHMpZI +U/sk5JA0XSaZjkjmE5KlQpo5JaHnpNkqyXpBsl2R7DXS3DUJuyXN10mOO5LzgeRqkBYeSfgzaREA +2pqb2lpa2v5FaiO1tv27va2V3NbW0dbe2fYfahu5q+2n7rYOehulp62zt+1nZhu1r+2X/rYudhtt +oK17sO1Xbhud1/aboK1H2MYQtfVK2l5I25iytpeKtj6wjaVs61e3vYLa2Jq217q2AbiNo28bNLa9 +Qdq4pra3ljYe2sa3tgnsbe+wNqGj7b2rTYS3id1tEm/bENEm9bUNB9pkwTZ5qE0RaRuJtoGxttGV +NmWiTbXapl5rG0u1Qett4xttmkybdrNNt9U2kWuDt9smd9r0hTbDbptxr22q1Ibst00ftpnKbeaj +NstJ20ylDT1tmz1vs1bbbBdt9qu2uVobdt02f9vmqLc579pcD20LjTb8sW3xuc0NAOSWJvK/Wsgk +EvnfreTWdnIbmdzeQf5PJ5lMJf/URe7oJlPo5M4e8s+9ZCqT/EsfuaufTGOTuwfIvw6S6Vzybzxy +j4DMEJJ7ReQXEjJTSn4pI/cpyCyQ3K8kv1KT2RD5tYY8oCNzYPKgnvzGSOYi5LcmMs9C5qNkgZX8 +zk4WYuT3DrLIRRbjZImbPOQlSwnysI8sC5DlQbIiRB6JkMEoeTRGVq6QVQmyepU8tkaGUuTxdbJm +g6zNkHWb5IktMpwjT26T9TtkQ4Fs3CVP7ZGREnl6n2w6JJvLZMsReeaEjFbIs6dk6znZViXbL8hz +V2SsRp6/Jjtuyc462XVHXngg4w3y4iPZ/Uz2AADlX00UUgvl3yRKayulrZ3STqb8p4NC7qT8RKV0 +dFEo3ZROOuXnHgq1l/ILk9LVR6H1U7rZlF8HKPRBym9cSg+PwhBQeoWUFyIKU0J5KaX0ySgsBaUf +pLxSUthqymuIMqChcHSUQZjyRk/hGilvEQrPROFbKAKU8s5KEdop7zGKyEERuygSnDLkpki9lGGC +IvNR5AGKIkgZCVHACGU0SlHGKKoVijpBGVulQGuU8RRFs07RblB0GcrEJgXeokzmKPptimGHYixQ +pnYpyB5lukQx7VPMhxRLmTJzREFPKLMVivWUYjun2KuUuQsKdkWZr1Ec1xTnLcVVpyzcUfAHymKD +4n6keJ4pXgCgkpqo/26htpKoba3U9nbqf/7ZnA7qT53UDiqV0kXt7Kb+TKdSe6i/9FK7mFRaH7W7 +n/orm0ofoP42SO3hUhk8aq+A+kJIZYqoLyXUPimVJaP2K6ivQCpbSX2tpg5AVI6GOqijvoGpXD31 +rZHKQ6h8E1Vgob5DqUIr9b2dKsKoYgdV4qIO4VSpmzrspcoIqtxHVQSoI0EqGKKORqjKKFUVo6pX +qGMJKrRKHV+jalJU7TpVt0GdyFDhTerkFlWfoxq2qcYd6lSBiuxSp/eophLVvE+1HFJnylT0iDp7 +QrVWqLZTqv2cOlelYhfU+Suqo0Z1XlNdt9SFOhW/oy4+UN0NqueR6n2mLgEA7d9NtNYWWhuJ1t5K ++087jUym/dRB6+ikUai0zi7az900Kp32Sw+tq5dGY9K6+2i/9tPobNpvA7SeQRqDS+vl0V4IaEwh +7aWI1iehsaS0fhntlYLGBmmvlbQBNY0D0QY1tDc6GhemvdXTeEYaH6EJTLR3FpoQpb230kR2mhij +SRy0IRdNitOG3TSZlyYnaAofbSRAA4O00RBNGaGpojR1jDa2QoMStPFVmmaNpk3RdOu0iQ0anKFN +btL0WzRDjmbcpk3t0JACbXqXZtqjmUs0yz5t5pCGlmmzRzTrCc1WodlPaXPnNKxKm7+gOa5ozhrN +dU1buKXhddriHc39QPM0aN5H2tIzjQAAemsTva2F3k6i/6eVTm6n/0Smd3TQ/7mrTir95y46tZv+ +C53e1UOn9dK7mfRf++j0fvpvbHrPAJ0xSO/l0l/w6EwB/aWQ3ieisyT0fin9lYzOVtBfg/QBJZ2j +pg9C9DcaOldHfwvTeXo630gXIPR3JrrQQn+P0kVWuthOl2D0IQdd6qIP43SZmy730hUEfcRHBwP0 +0SBdGaKrInR1lD4Wo0Mr9PEEXbNK167RdSn6xDod3qBPZuj6Tbphi27M0ae26cgOfbpAN+3SzXt0 +S4k+s09HD+mzZbr1iG47odsr9LlTOnZOn6/SHRd05xXdVaMvXNPxW/pine6+o3se6N4GfemRTjzT +lwGA0dbEaG9h/IfEILcyfmpndJAZlA5GZyfjZyqD2sX4pZvRRWfQehjdvYxfmQx6H+O3fkYPm8EY +YPQOMl5wGUwe46WA0SdksESMfgnjlZTBljFeKxgDIIOjZAyqGW8gBlfDeKtj8GAGX88QGBnvEIbQ +xHhvYYhQhtjKkNgZQxhD6mAMuxgynCF3MxRexgjBAH2M0QBDGWSoQgx1hDEWZUAxxvgKQ5NgaFcZ +ujXGRIoBrzMmNxj6DMOwyTBuMaZyDGSbMb3DMBUY5l2GZY8xU2Kg+4zZQ4a1zLAdMewnjLkKAztl +zJ8zHFWG84LhumIs1Bj4NWPxluGuMzx3DO8DY6nBIB4Zy88MHwAw25uY/2lhkknMn1qZHe1MCpnZ +2cH8uZNJpTJ/6WJ2dTNpdGZ3D/PXXiadyfytj9nTz2Swmb0DzBeDTCaX+ZLH7BMwWUJmv4j5SsJk +S5mvZcwBBZMDMgeVzDdqJhdivtUweTomH2YK9Mx3RqYQYb43MUUWphhlSqzMITtTijGHHUyZiynH +mQo3c8TLBAnmqI+pDDBVQaY6xByLMKEoczzG1KwwtQmmbpU5scaEU8zJdaZ+g2nIMI2bzKktJpJj +Tm8zTTtMc4Fp2WXO7DHREnN2n2k9ZNrKTPsRc+6EiVWY86dMxznTWWW6LpgLV0y8xly8ZrpvmZ46 +03vHXHpgEg3m8iPT98z0AwDrP00scgvrJxKro5VFaWd1klk/d7ConaxfqKyuLhatm9VNZ/3aw6L3 +sn5jsnr6WIx+Vi+b9WKAxRxkveSy+ngsloDVL2S9ErHYEtZrKWtAxuIoWIMg642SxVWz3kIsnobF +17EEMOudniU0st4jLJGJJbawJChryMqS2lnDGEvmYMldLAXOGnGzQC9rlGApfSxVgKUOssZCLCjC +Go+yNDGWdoWlS7AmVlnwGmsyxdKvswwbLGOGNbXJQrZY0zmWaZtl3mFZCqyZXRa6x5otsaz7LNsh +y15mzR2xsBPWfIXlOGU5z1muKmvhgoVfsRZrLPc1y3PL8tZZS3cs4oG13GD5Hln+Z1YAANjkJvZP +LewOEpvSyu5sZ/9MZlM72L90sruobFoXu7ub/Sv9n8hh/9bL7mGyGX3s3n72CzabOcB+Ocju47JZ +PHa/gP1KyGaL2K8l7AEpmyNjDyrYb0A2V8l+q2bzIDZfwxbo2O9gtlDPfm9kixC22MSWWNhDKFtq +ZQ/b2TKMLXewFS72CM4G3exRL1tJsFU+tjrAHguyoRB7PMLWRNnaGFu3wp5IsOFV9uQaW59iG9bZ +xg32VIaNbLKnt9imHNu8zbbssGcKbHSXPbvHtpbYtn22/ZA9V2ZjR+z5E7ajwnaesl3n7IUqG79g +L16x3TW255rtvWUv1dnEHXv5ge1rsP2P7MAz+wMAcH5q4nS0cCgkTmcr5+d2DpXM+aWD09XJoVE5 +3V2cX7s5dDrntx5OTy+HweT09nFe9HOYbM7LAU7fIIfF5fTzOK8EHLaQ81rEGZBwOFLOoIzzRsHh +gpy3Sg5PzeFDHIGG807HEcKc93qOyMgRIxyJiTNk4UhRzrCVI7Nz5BhH4eCMuDggzhl1c5Rejorg +qH2csQAHCnLGQxxNhKONcnQxzsQKB05wJlc5+jWOIcUxrnOmNjhIhjO9yTFtccw5jmWbM7PDQQuc +2V2OdY9jK3Hs+5y5Qw5W5swfcRwnHGeF4zrlLJxz8Cpn8YLjvuJ4ahzvNWfplkPUOct3HN8Dx9/g +BB45H545QQDgdjRxKS3cThL351YutZ37C5nb1cGldXK7qdxfu7j0bu5vdG5PD5fRy+1lcl/0cZn9 +3Jdsbt8AlzXI7edyX/G4bAH3tZA7IOJyJNxBKfeNjMtVcN+CXJ6Sy1dzBRD3nYYr1HHfw1yRnis2 +ciUId8jElVq4wyhXZuXK7VwFxh1xcEEXdxTnKt1clZerJrhjPi4U4I4HuZoQVxvh6qLciRgXXuFO +Jrj6Va5hjWtMcafWucgGdzrDNW1yzVtcS447s81Fd7izBa51l2vb49pL3Ll9LnbInS9zHUdc5wnX +VeEunHLxc+5ileu+4HquuN4ad+maS9xyl+tc3x3X/8ANNLgfHrnBZ+5HAOBTmvidLfyfSXxqK/+X +dn4XmU/r4Hd38n+l8uld/N+6+T10PqOH39vLf8HkM/v4L/v5fWw+a4DfP8h/xeWzefzXAv6AkM8R +8Qcl/DdSPlfGf6vg80A+X8kXqPnvIL5Qw3+v44tgvljPlxj5QwhfauIPW/gylC+38hV2/gjGBx38 +URdfifNVbr7ayx8j+JCPPx7ga4J8bYivi/Anonw4xp9c4esTfMMq37jGn0rxkXX+9AbflOGbN/mW +Lf5Mjo9u82d3+NYC37bLt+/x50p8bJ8/f8h3lPnOI77rhL9Q4eOn/MVzvrvK91zwvVf8pRqfuOYv +3/J9db7/jh944H9o8IOP/I/P/BAACDubhD+3CKkk4S+twq52IY0s7O4Q/toppFOFv3UJe7qFDLqw +t0f4olfIZApf9gn7/glktrB/QPhqUMjmCl/zhAMCIUcoHBQJ30iEXKnwrUzIUwj5oFCgFL5TC4WQ +8L1GKNIJxbBQohcOGYVSRDhsEsosQjkqVFiFI3YhiAlHHUKlS6jChWq3cMwrhAjhuE+oCQi1QaEu +JJyICOGocDIm1K8IDQmhcVU4tSZEUsLpdaFpQ2jOCC2bwpktIZoTzm4LrTtCW0Fo3xXO7QmxknB+ +X+g4FDrLQteRcOFEiFeEi6dC97nQUxV6L4RLV0KiJly+Fvpuhf66MHAn/PAgDDaEHx+FoWdhGADE +PzeJqS3iX0jirlYxrV3cTRb/2iGmd4p/o4p7usSMbnEvXfyiR8zsFb9kivv6xKx+cT9b/GpAzB4U +v+aKB3hijkA8KBS/EYm5EvFbqZgnE/MVYgEofqcUC9Xi95BYpBGLdWIJLB7Si6VG8TAilpnEcotY +gYpHrGLQLh7FxEqHWOUSq3HxmFsMecXjhFjjE2sDYl1QPBESwxHxZFSsj4kNK2JjQjy1KkbWxNMp +sWldbN4QWzLimU0xuiWezYmt22LbjtheEM/tirE98XxJ7NgXOw/FrrJ44UiMn4gXK2L3qdhzLvZW +xUsXYuJKvFwT+67F/ltxoC7+cCcOPog/NsShR3H4WRwBACm1SfpLi7SLJKW1Srvbpb+SpfQO6W+d +0h6qlNEl7e2WvqBLmT3Sl73SPqaU1Sft75e+Ykv/eVevB6UDXCmHJx0USN8IpVyR9K1EypNK+TKp +QCF9B0qFSul7tVQEScUaqUQnHYKlUr102CiVIVK5SaqwSEdQKWiVjtqlSkyqckjVLukYLoXc0nGv +VENItT6pLiCdCErhkHQyItVHpYaY1LginUpIkVXp9JrUlJKa16WWDelMRopuSme3pNac1LYtte9I +5wpSbFc6vyd1lKTOfanrULpQluJH0sUTqbsi9ZxKvefSpaqUuJAuX0l9Nan/Whq4lX6oS4N30o8P +0lBDGn6URp6lnwBA/kuTvKtFTiPJu1vlv7bL6WT5bx3ynk45gyrv7ZK/6JYz6fKXPfK+XjmLKe/v +k7/ql7PZ8tcD8oFBOYcrH+TJ3wjkXKH8rUjOk8j5UrlAJn+nkAtB+XulXKSWiyG5RCMf0smlsHxY +L5cZ5XJErjDJRyxyEJWPWuVKu1yFydUO+ZhLDuHycbdc45VrCbnOJ58IyOGgfDIk10fkhqjcGJNP +rciRhHx6VW5ak5tTcsu6fGZDjmbks5ty65bclpPbt+VzO3KsIJ/flTv25M6S3LUvXziU42X54pHc +fSL3VOTeU/nSuZyoypcv5L4rub8mD1zLP9zKg3X5xzt56EEebsgjj/JPz/IoAIBdTSCtBewmgb+2 +gvR28Dcy2NMBMjrBXir4ogtkdoMv6WBfD8jqBfuZ4Ks+kN0PvmaDAwMgZxAc5IJveCBXAL4VgjwR +yJeAAin4TgYKFeB7EBQpQbEalEDgkAaU6sBhGJTpQbkRVCDgiAkELeAoCiqtoMoOqjFwzAFCLnAc +BzVuUOsFdQQ44QPhADgZBPUh0BABjVFwKgYiK+B0AjStguY10JICZ9ZBdAOczYDWTdC2Bdpz4Nw2 +iO2A8wXQsQs690BXCVzYB/FDcLEMuo9AzwnorYBLpyBxDi5XQd8F6L8CAzXwwzUYvAU/1sHQHRh+ +ACMN8NMjGH0GPwOAitak6m5R/UpS0VtVv7WresgqRoeqt1P1gqpidqledqv66CpWj6q/V/WKqWL3 +qV73qwbYKs6AanBQ9Yar4vJUbwUqnlDFF6kEEtU7qUooU71XqESgSqxUSdSqIUgl1aiGdSoZrJLr +VQqjagRRgSbVqEWlRFUqq0ptV41hKsihGnepNLhK61bpvKoJQgX7VJMBlT6oMoRUxohqKqpCYqrp +FZUpoTKvqixrqpmUCl1XzW6orBmVbVNl31LN5VTYtmp+R+UoqJy7KteeaqGkwvdVi4cqd1nlOVJ5 +T1RLFRVxqlo+V/mqKv+FKnCl+lBTBa9VH29VoboqfKeKPKg+NVTRR9XnZ1UMAKDuJujXFohOgn5r +hXraIQYZ6u2AXnRCTCr0sgvq64ZYdKi/B3rVC7GZ0Os+aKAf4rChwQHozSDE5UJveRBP8M8nhwQi +6J0EEkqh9zJIpIDEICRRQkNqSApBwxpIpoPkMKTQQyNGCESgUROktEAqFFJboTE7BGHQuAPSuCAt +Dunc0IQXgglo0gfpA5AhCBlD0FQEQqLQdAwyrUDmBGRZhWbWIDQFza5D1g3IloHsm9DcFoTloPlt +yLEDOQuQaxda2IPwErS4D7kPIU8Z8h5BSycQUYGWTyHfOeSvQoEL6MMVFKxBH6+h0C0UrkORO+jT +AxRtQJ8fodgzFAcA7a9NWnqL9jeStqdVy2jX9pK1Lzq0zE7tS6q2r0vL6tb207WverTsXu1rpnag +T8vp1w6ytW8GtNxB7VuulsfT8gVagVD7TqQVSrTvpVqRTCtWaCWgdkiplaq1w5BWptHKdVoFrB3R +a0GjdhTRKk1alUWrRrVjVi1k145jWo1Dq3Vpdbh2wq2FvdpJQqv3aQ0BrTGonQppkYh2Oqo1xbTm +Fa0loZ1Z1aJr2tmU1rqutW1o7Rnt3KYW29LO57SOba1zR+sqaBd2tfiedrGkde9rPYdab1m7dKQl +TrTLFa3vVOs/1waq2g8X2uCV9mNNG7rWhm+1kbr20502+qD93NDGHrXxZ+0KAMD0Jvi3FriHBDNa +4d52+AUZZnbALzvhPirM6oL7u+FXdJjdA7/uhQeYMKcPHuyH37Bh7gD8dhDmcWE+DxYI4HdCWCiC +30tgkRQWy2CJAh4CYakSHlbDMgiWa2CFDh6BYVAPjxphJQKrTLDaAo+hMGSFx+2wBoO1Dljngidw +GHbDk15YT8AGH2wMwFNBGAnB0xHYFIXNMdiyAs8kYHQVnl2DrSnYtg7bN+C5DIxtwvNbsCMHO7dh +1w68UIDxXXhxD3aXYM8+7D2El8owcQQvn8C+Cuw/hQPn8IcqHLyAP17BoRocvoYjt/CnOhy9gz8/ +wLEGHH+EV57hLwBg+K3J0NNiYJAMva2GF+0GJtnwssPQ12lgUQ39XYZX3QY23fC6xzDQa+AwDYN9 +hjf9Bi7b8HbAwBs08LkGAc/wTmAQCg3vRQaRxCCWGiQyw5DCIAUNw0qDTG2QQwaFxjCiM4CwYVRv +UBoNKsSgNhnGLAYINYxbDRq7QYsZdA7DhMsA44ZJt0HvNRgIg9FnmAoYkKBhOmQwRQzmqMESM8ys +GNCEYXbVYF0z2FIG+7phbsOAZQzzmwbHlsGZM7i2DQs7BrxgWNw1uPcMnpLBu29YOjQQZcPykcF3 +YvBXDIFTw4dzQ7Bq+HhhCF0ZwjVD5Nrw6dYQrRs+3xliD4Z4w7DyaPjybEgAANLThDBakF4S8qIV +YbYjL8lIXwfC6kT6qcirLoTdjbymIwM9CKcXGWQib/oQbj/ylo3wBhD+ICLgIu94iFCAvBciIhEi +liASKTL0T89RIMMgIlMicjWigJARDQLqkFEYUeoRlRFRI8iYCYEsyDiKaKyI1o7oMGTCgcAuZBJH +9G7E4EWMBDLlQ5AAMh1ETCHEHEEsUWQmhqAryGwCsa4itjXEnkLm1hFsA5nPII5NxLmFuHLIwjaC +7yCLBcS9i3j2EG8JWdpHiENkuYz4jhD/CRKoIB9OkeA58rGKhC6Q8BUSqSGfrpHoLfK5jsTukPgD +stJAvjwiiWfkKwCYGU3m3hbzC5KZ2Wp+2W7uI5tZHeb+TvMrqpndZX7dbR6gmzk95sFe8xummdtn +fttv5rHN/AGzYND8jmsW8szvBWaR0CwWmSUS85DULJWZhxVmGWiWK80KtXkEMoMa86jOrITNKr1Z +bTSPIWbIZB63mDWoWWs16+zmCcwMO8yTLrMeNxvcZqPXPEWYEZ95OmA2Bc3mkNkSMc9EzWjMPLti +tibMtlWzfc08lzJj6+b5DbMjY3Zuml1b5oWcGd82L+6Y3QWzZ9fs3TMvlczEvnn50Owrm/1H5sCJ ++UPFHDw1fzw3h6rm8IU5cmX+VDNHr82fb82xujl+Z155MH9pmBOP5q/P5lUAQHub0BctKJOEvmxF ++9pRFhnt70BfdaJsKvq6Cx3oRjl0dLAHfdOLcpno2z6U14/y2ahgAH03iAq56HseKhKgYiEqEaFD +ElQqRYdlqEyB/tMCFUp0RI2CEDqqQZU6VAWjaj06ZkQhBB03oRoLqkVRnRWdsKMwhk46UL0LNeCo +0Y1OeVGEQKd9qCmAmoOoJYTORFA0is7GUOsKakug9lV0bg3FUuj8OurYQJ0Z1LWJLmyheA5d3Ebd +O6ingHp30aU9lCihy/uo7xD1l9HAEfrhBA1W0I+naOgcDVfRyAX66QqN1tDP12jsFo3X0ZU79MsD +mmigXx/R1Wc0CQC2F002ZovtJcnW12pjtdv6ybZXHTZ2p+011TbQZeN02wbptjc9Nm6v7S3Txuuz +8fttArbt3YBNOGh7z7WJeDaxwCYR2oZENqnENiy1yWQ2ucKmAG0jShuoto1CNqXGptLZ1LBtTG+D +jLZxxKYx2bQWmw61TVhtsN02idn0DpvBZTPitim3DfHapgmbyWczB2yWoG0mZEMjttmozRqz2VZs +9oRtbtWGrdnmUzbHus25YXNlbAubNnzLtpizubdtnh2bt2Bb2rURe7blks23b/Mf2gJl24cjW/DE +9rFiC53awue2SNX26cIWvbJ9rtli17b4rW2lbvtyZ0s82L42bKuPtuSzbQ0AMGYT9rIF6yNhrFas +vx17RcbYHdjrTmyAinG6sMFu7A0d4/Zgb3sxHhPj92GCfuwdGxMOYO8HMREXE/MwiQAbEmJSETYs +wWRSTC7DFApsBMRAJTaqxpQQptJgah02BmOQHhs3YhoE05ownQWbQDHYik3aMT2GGRyY0YVN4Rji +xqa9mInAzD7MEsBmghgawmYjmDWK2WKYfQWbS2DYKja/hjlSmHMdc21gCxkM38QWtzB3DvNsY94d +bKmAEbvY8h7mK2H+fSxwiH0oY8Ej7OMJFqpg4VMsco59qmLRC+zzFRarYfFrbOUW+1LHEnfY1wds +tYElH7G1Z+wbADhfNjn7WpwskrO/1fmq3ckmO193OAc6nRyqc7DL+abbyaU73/Y4eb1OPtMp6HO+ +63cK2c73A07RoFPMdUp4ziGBUyp0DoucMolTLnUqZM4RhRMEnaNKp1LtVEFOtcY5pnNCsHNc79QY +nVrEqTM5JyxOGHVOWp16u9OAOY0O55TLieDOabfT5HWaCafF55wJONGgczbktEactqjTHnPOrTix +hHN+1elYczpTTte6c2HDiWeci5tO95bTk3N6t51LO06i4Fzedfr2nP6SM7Dv/HDoDJadH4+coRNn +uOKMnDo/nTujVefnC2fsyhmvOVeunV9unYm68+udc/XBmWw41x6d356dKQDA+5pwVgveT8JfteLs +dvw1GR/owDmd+CAVf9OFc7vxt3Sc14Pze3EBE3/Xhwv78fdsXDSAiwdxCRcf4uFSAT4sxGUiXC7B +FVJ8RIaDCnwUxJVKXKXG1RA+pvmnIOPjMK7R41ojrkPwCRMOW/BJFNdbcYMdN2L4lANHXPg0jpvc +uNmLWwh8xoejAXw2iFtDuC2C26P4XAzHVvD5BO5YxZ1ruCuFL6zj+Aa+mMHdm7hnC/fm8KVtnNjB +lwu4bxf37+GBEv5hHw8e4h/LeOgID5/gkQr+6RSPnuOfq3jsAo9f4Ss1/Ms1nrjFv9bx1Ts8+YCv +NfBvj3jqGf8OAB5Wk6e/xfOK5GG3el63ewbIHk6HZ7DT84bq4XZ53nZ7eHQPv8cj6PW8Y3qEfZ73 +/R4R2yMe8EgGPUNcj5TnGRZ4ZEKPXORRSDwjUg8o84wqPErQo1J61GrPGOSBNJ5xnUcDe7R6j87o +mUA8sMkzafHoUY/B6jHaPVOYB3F4pl0eE+4xuz0Wr2eG8KA+z2zAYw16bCGPPeKZi3qwmGd+xeNI +eJyrHteaZyHlwdc9ixsed8bj2fR4tzxLOQ+x7Vne8fgKHv+uJ7Dn+VDyBPc9Hw89obInfOSJnHg+ +VTzRU8/nc0+s6olfeFauPF9qnsS15+utZ7XuSd551h483xqe1KPn+7NnHQCI/ibiVQvBJhGvW4mB +doJDJgY7iDedBJdKvO0ieN0En04Ieoh3vYSQSbzvI0T9hJhNSAaIoUFCyiWGeYRMQMiFhEJEjEgI +UEqMygilglCBhFpJjKkJCCLGNYRGR2hhQqcnJowEjBCTJkJvIQwoYbQSU3YCwYhpB2FyEWacsLiJ +GS+BEsSsj7AGCFuQsIeIuQiBRYn5GOFYIZwJwrVKLKwReIpYXCfcG4QnQ3g3iaUtgsgRy9uEb4fw +F4jALvFhjwiWiI/7ROiQCJeJyBHx6YSIVojPp0TsnIhXiZUL4ssVkagRX6+J1VsiWSfW7ohvD0Sq +QXx/JNafiTQA+F81+dkt/tck/0Crn9PuHyT733T4uZ3+t1Q/r8vP7/YL6P53PX5hr/890y/q84v7 +/RK2f2jALx30D3P9Mp5fLvArhP4RkR+U+EelfqXMr1L41aB/TOmH1P5xyK/R+LU6vw72T+j9sNE/ +ifj1Jr/B4jei/imrH7H7pzG/yeE3u/wW3D/j9qNe/yzht/r8toDfHvTPhfxYxD8f9TtifueK35Xw +L6z68TX/YsrvXvd7NvzejH9p009s+Zdzft+237/jDxT8H3b9wT3/x5I/tO8PH/ojZf+nI3/0xP+5 +4o+d+uPn/pWq/8uFP3Hl/1rzr177k7f+tbr/250/9eD/3vCvP/rTz/4NAAiym4KvW4IDpCCnNTjY +HnxDDnI7gm87gzxqkN8VFHQH39GDwp7g+96giBkU9wUl/cEhdlA6EBweDMq4QTkvqBAER4RBUBQc +lQSV0qBKFlQrgmNgEFIGx9VBDRTUaoI6XXACDsL64KQxqP8HH0xBoyU4hQYRa3DaHjRhQbMjaHEF +Z/Ag6g7OeoNWImjzBe2B4FwwiIWC85GgIxp0xoKuleBCIoivBhfXgu5U0LMe9G4ElzJBYjO4vBX0 +5YL+7WBgJ/ihEAzuBj/uBUOlYHg/GDkMfioHo0fBzyfBWCUYPw2unAe/VIOJi+DXq+BqLZi8Dq7d +Br/Vg6m74PeH4HojmH4MbjwHfwBA+HVTeKAlzCGFB1vDb9rDXHL4bUeY1xnmU8OCrvC77rCQHn7f +Exb1hsXMsKQvPNQflrLDwwNh2WBYzg0reOERQRgUhkdFYaUkrJKG1bLwmCIMgeFxZVijDmuhsE4T +ntCFYTg8qQ/rjWEDEjaawlOWMIKGp61hkz1sxsIWR3jGFUbx8Kw7bPWGbUTY7gvPBcJYMDwfCjsi +YWc07IqFF1bCeCK8uBp2r4U9qbB3Pby0ESYy4eXNsG8r7M+FA9vhDzvhYCH8cTcc2guHS+HIfvjT +YThaDn8+CsdOwvFKeOU0/OU8nKiGv16EV6/CyVp47Tr87Tacqoe/34XXH8LpRnjjMfzjOZwBgOhA +U5TTEh0kRd+0Rrnt0bfkKK8jyu+MCqjRd11RYXf0PT0q6omKe6MSZnSoLyrtjw6zo7KBqHwwquBG +R3hRUBAdFUaVoqhKElVLo2OyKKSIjoNRjTKqVUd1UHRCE4V10Uk4qtdHDcaoEYlOmaL/wNU0GjVZ +o2Z71IJFZxxR1BWdxaNWd9TmjdqJ6JwvigWi88GoIxR1RqKuaHQhFsVXoouJqHs16lmLelPRpfUo +sRFdzkR9m1H/VjSQi37YjgZ3oh8L0dBuNLwXjZSin/aj0cPo53I0dhSNn0RXKtEvp9HEefRrNbp6 +EU1eRddq0W/X0dRt9Hs9un4XTT9ENxrRH4/RzHP0dwCIc5rigy3xN6Q4tzX+tj3OI8f5HXFBZ/wd +NS7sir/vjovocXFPXNIbH2LGpX3x4f64jB2XD8QVg/ERbhzkxUcFcaUwrhLF1ZL4mDQOyeLjirgG +jGuVcZ06PgHFYU18UhfXw3GDPm40xqeQOGKKT1viJjRutsYt9vgMFkcd8VlX3IrHbe643RufI+KY +Lz4fiDuCcWco7orEF6JxPBZfXIm7E3HPaty7Fl9KxYn1+PJG3JeJ+zfjga34h1w8uB3/uBMPFeLh +3XhkL/6pFI/uxz8fxmPlePwovnIS/1KJJ07jX8/jq9V48iK+dhX/VounruPfb+Pr9Xj6Lr7xEP/R +iGce478/xzcBIDHYlHjTkuCSEm9bE7z2BJ+cEHQk3nUmhNTE+66EqDshpickPYmh3oSUmRjuS8j6 +E3J2QjGQGBlMgNzEKC+hFCRUwoRalBiTJCBpYlyW0CgSWjChUyYm1AkYSkxqEnpdwgAnjPrElDGB +IIlpU8JkSZjRhMWamLEnUCwx60hYXQkbnrC7E3PeBEYk5n0JRyDhDCZcocRCJIFHE4uxhHsl4Ukk +vKuJpbUEkUosryd8Gwl/JhHYTHzYSgRziY/bidBOIlxIRHYTn/YS0VLi834idpiIlxMrR4kvJ4lE +JfH1NLF6nkhWE2sXiW9XiVQt8f06sX6bSNcTG3eJHw+JTCPx+2Ni8zmRBYDkm6YktyX5lpTktSb5 +7UkBOfmuIynsTL6nJkVdSXF3UkJPDvUkpb3JYWZS1peU9ycV7OTIQBIcTI5yk0peUiVIqoXJMVES +kiTHpUmNLKlVJHVgckKZhNXJSSip1yQNuqQRTk7pk4gxOY0kTaak2ZK0oMkZaxK1J2expNWRtLmS +djw5505i3uQ8kXT4ks5A0hVMLoSSeCS5GE26Y0nPStKbSC6tJom15HIq6VtP+jeSgUzyw2YyuJX8 +mEuGtpPhnWSkkPy0m4zuJT+XkrH9ZPwwuVJOfjlKJk6SXyvJ1dNk8jy5Vk1+u0imrpLfa8n162T6 +NrlRT/64S2Yekr83kpuPyexzcgsAUtym1NuWFI+U4remBO2pd+SUsCP1vjMloqbEXSlJd2qInpL2 +pIZ7UzJmSt6XUvSnRtgpcCA1OphSclMqXkotSI0JU5AoNS5JaaQprSylU6QmwBSsTE2qU3ooZdCk +jLrUFJxC9KlpY8qEpMymlMWSmkFTqDU1a09ZsX+4M2V3pebwFOZOzXtTDiLl9KVcgdRCMIWHUouR +lDua8sRS3pXUUiJFrKaW11K+VMq/ngpspD5kUsHN1MetVCiXCm+nIjupT4VUdDf1eS8VK6Xi+6mV +w9SXcipxlPp6klqtpJKnqbXz1LdqKnWR+n6VWq+l0tepjdvUj3oqc5f6/SG12UhlH1Nbz6k/ACD9 +tinNa0nzSWlBa/pde1pITr/vSIs602JqWtKVHupOS+np4Z60rDctZ6YVfemR/jTITo8OpJWDaRU3 +realxwRpSJgeF6U1krRWmtbJ0hOKNAymJ5VpvTptgNJGTXpKl0bg9LQ+bTKmzUjaYkrPWNIomp61 +pq32tA1L2x3pOVcaw9Pz7rTDm3YSaZcvvRBI48H0YijtjqQ90bQ3ll5aSROJ9PJq2reW9qfSgfX0 +h410MJP+uJkObaXDuXRkO/1pJx0tpD/vpmN76XgpvbKf/nKYTpTTX4/SqyfpZCW9dpr+dp5OVdPf +L9LrV+l0Lb1xnf5xm87U07/fpTcf0tlGeusx/cdzOgcAGV5Tht+SEZAy71ozwvbMe3JG1JERd2Yk +1MxQV0banRmmZ2Q9GXlvRsHMjPRlwP7MKDujHMioBjNqbmaMl4EEmXFhRiPKaCUZnTQzIcvAiswk +mNErMwZ1xghlpjQZRJeZhjMmfcZszFiQzIwpg1oys2jGas3Y7Bk7lplzZDBXZh7PONwZpzfjIjIL +vgweyCwGM+5QxhPJeKOZpViGWMksJzK+1Yx/LRNIZT6sZ4IbmY+ZTGgzE97KRHKZT9uZ6E7mcyET +283E9zIrpcyX/UziMPO1nFk9yiRPMmuVzLfTTOo8872aWb/IpK8yG7XMj+tM5jbzez2zeZfJPmS2 +Gpk/HjO558yfAJDlN2UFLdl3pKywNfu+PSsiZ8UdWUlndoialXZlh7uzMnpW3pNV9GZHmFmwLzva +n1Wys6qBrHowO8bNQrzsuCCrEWa1oqxOkp2QZmFZdlKR1YNZgzJrVGenoCyiyU7rsiY4a9ZnLcbs +DJJFTdlZS9aKZm3WrN2encOymCM778o68KzTnXV5swtEFvdlFwNZdzDrCWW9kexSNEvEsssrWV8i +61/NBtayH1LZ4Hr240Y2lMmGN7ORreynXDa6nf28k40VsvHd7Mpe9kspm9jPfj3MrpazyaPs2kn2 +WyWbOs1+P8+uV7Ppi+zGVfZHLZu5zv5+m92sZ7N32a2H7B+NbO4x++dzdhsAcoKm3LuWnJCUe9+a +E7XnxOScpCM31JmTUnPDXTlZd05Ozyl6ciO9OZCZG+3LKftzKnZOPZAbG8xB3Nw4L6cR5LTCnE6U +m5DkYGluUpbTK3IGMGdU5qbUOQTKTWtyJl3ODOcs+tyMMYciuVlTzmrJ2dCc3Zqbs+cwLDfvyDlc +OSeec7lzC/9QOZFb9OXcgZwnmPOGckuRHBHNLcdyvpWcP5ELrOY+rOWCqdzH9VxoIxfO5CKbuU9b +uWgu93k7F9vJxQu5ld3cl71copT7up9bPcwly7m1o9y3k1yqkvt+mls/z6WruY2L3I+rXKaW+/06 +t3mby9ZzW3e5Px5yuUbuz8fc9nMuDwD5d015YUv+PSkvas2L2/MScn6oIy/tzA9T87KuvLw7r6Dn +R3ryYG9+lJlX9uVV/Xk1Oz82kIcG8+PcvIaX1wryOmF+QpSHJflJaV4vyxsUeSOYn1LmEXV+Gsqb +NHmzLm+B8zP6PGrMzyJ5qylvs+TtaH7Omsfs+Xks73Dkna68C88vuPO4N79I5N2+vCeQ9wbzS6E8 +EckvR/O+WN6/kg8k8h9W88G1/MdUPrSeD2/kI5n8p818dCv/OZePbefjO/mVQv7Lbj6xl/9ayq/u +55OH+bVy/ttRPnWS/17Jr5/m0+f5jWr+x0U+c5X/vZbfvM5nb/Nb9fwfd/ncQ/7PRn77MZ9/zu8A +QEHYVHjfUhCRCuLWgqS9MEQuSDsKw50FGbUg7yoougsj9ALYUxjtLSiZBVVfQd1fGGMXoIHC+GBB +wy1oeQWdoDAhLMCiwqSkoJcWDLKCUVGYAguIsjCtLpiggllTsOgKM3AB1RdmjQUrUrCZCnZLYQ4t +YNbCvL3gwApOR8HlKizgBdxdWPQW3EThH2fhDRSWggUiVFiOFHzRgj9WCKwUPiQKwdXCx7VCKFUI +rxciG4VPmUJ0s/B5qxDLFeLbhZWdwpdCIbFb+LpXWC0VkvuFtcPCt3IhdVT4flJYrxTSp4WN88KP +aiFzUfj9qrBZK2SvC1u3hT/qhdxd4c+HwnajkH8s7DwX/gKA4vumoqilKCYVJa3FofailFwc7ijK +OotyalHRVRzpLoL04mhPUdlbVDGL6r7iWH8RYhfHB4qawaKWW9TxihOCIiwsToqKeknRIC0aZcUp +RREBi9PKokldNENFi6Y4oyuicHFWX7QaizakaDcV5yxFDC3OW4sOe9GJFV2O4oKriOPFRXfR7S16 +iKLXV1wKFIlgcTlU9EWK/mgxECt+WCkGE8WPq8XQWjGcKkbWi582itFM8fNmMbZVjOeKK9vFLzvF +RKH4dbe4uldMlopr+8Vvh8VUufj9qLh+UkxXihunxR/nxUy1+PtFcfOqmK0Vt66Lf9wWc/Xin3fF +7YdivlHceSz+9VwsAEBJ1FQSt5QkpNJQa0naXhoml2QdJXlnSUEtjXSVwO7SKL2k7CmpektqZmms +rwT1l8bZJc1ASTtY0nFLE7wSLChNCkt6UckgKRmlpSlZCVGUpsGSSVkyq0sWqDSjKaG60ixcsupL +NmPJjpTmTCXMUppHSw5ryWkvubDSgqOEu0qLeMntLnm8JS9RWvKViEBpOVjyhUr+SCkQLX2IlYIr +pY+JUmi1FF4rRVKlT+ul6Ebpc6YU2yzFt0orudKX7VJip/S1UFrdLSX3Smul0rf9Uuqw9L1cWj8q +pU9KG5XSj9NS5rz0e7W0eVHKXpW2aqU/rku529Kf9dL2XSn/UNpplP56LBWeS38DwIG46UDScjBE +OpC2Hgy3H8jIB/KOA0XnwQj1AOw6GO0+UNIPVD0H6t6DMeYB1Hcw3n+gYR9oBw50gwcT3AOYdzAp +ONALDwyiA6PkYEp6gMgOphUHJvDArDywqA9moANUczCrO7DCBzb9gd14MIccYKaDecuBAz1wWg9c +9oMF7AB3HCy6Dtz4gcd94PUeLBEHhO9gOXDgCx74QweByMGH6EEwdvBx5SCUOAivHkTWDj6lDqLr +B583DmKZg/jmwcrWwZfcQWL74OvOwWrhILl7sLZ38K10kNo/+H54sF4+SB8dbJwc/KgcZE4Pfj8/ +2KweZC8Otq4O/qgd5K4P/rw92K4f5O8Odh4O/mocFB4P/n4+2AWAsqSpPNRSlpLKw61lWXtZTi4r +OsojnWWQWh7tKiu7yyp6Wd1THustQ8zyeF9Z01/Wssu6gfLEYBnmlid5Zb2gbBCWjaLylKSMSMvT +srJJUTaDZYuyPKMuo1B5VlO26so2uGzXl+eMZQwpz5vKDkvZiZZd1vKCvYxj5UVH2e0qe/Cy111e +8pYJorzsK/sCZX+wHAiVP0T+0Tnlj7FyaKUcTpQjq+VPa+Voqvx5vRzbKMcz5ZXN8petciJX/rpd +Xt0pJwvltd3yt71yqlT+vl9ePyyny+WNo/KPk3KmUv79tLx5Xs5Wy1sX5T+uyrla+c/r8vZtOV8v +79yV/3ooFxrlvx/Lu8/lIgAcDzUdS1uOh0nHstZjefuxgnw80nEMdh6PUo+VXceq7mM1/Xis5xjq +PR5nHmv6jrX9xzr28cTAMTx4PMk91vOODYJjo/B4SnSMSI6npccm2bFZcWwBj2eUx6j6eBY6tmqO +bbpjO3w8pz/GjMfzyLHDdOy0HLvQ4wXrMW4/XsSO3Y5jj+vYix8vuY8J7/EycezzHfsDx4Hg8YfQ +cTBy/DF6HIodh1eOI4njT6vH0bXjz6nj2PpxfON4JXP8ZfM4sXX8NXe8un2c3DleKxx/2z1O7R1/ +Lx2v7x+nD483ysc/jo4zJ8e/V443T4+z58db1eM/Lo5zV8d/1o63r4/zt8c79eO/7o4LD8d/N453 +H4+Lz8d7AFCRNlWGWyoyUkXeWlG0V0bIFbCjMtpZUVIrqq6KursyRq9APZXx3oqGWdH2VXT9lQl2 +BR6oTA5W9NyKgVcxCipTwgoiqkxLKiZpxSyrWBSVGbCCKiuz6ooVqtg0FbuuMgdXMH1l3lhxIBWn +qeKyVBbQCm6tLNorbqzicVS8rsoSXiHclWVvxUdU/L5KIFD5EKwEQ5WPkUooWgnHKpGVyqdEJbpa ++bxWiaUq8fXKykblS6aS2Kx83aqs5irJ7craTuVboZLarXzfq6yXKun9ysZh5Ue5kjmq/H5S2axU +sqeVrfPKH9VK7qLy51Vlu1bJX1d2bit/1SuFu8rfD5XdRqX4WNl7rvwXAM6Gm85kLWdy0pmi9Wyk +/Qwkn412nCk7z1TUM3XX2Vj3GUQ/G+850/SeaZlnur6zif4zmH02OXCmHzwzcM+MvLMpwRkiPJsW +nZkkZ2bpmUV2NqM4Q8GzWeWZVX1mg87smrM53RkGn83rzxzGMydy5jKdLVjOcPRs0Xrmtp95sDOv +42zJdUbgZ8vuM5/3zE+cBXxnHwJnweDZx9BZKHIWjp5FYmefVs6iibPPq2extbN46mxl/ezLxlki +c/Z182x16yyZO1vbPvu2c5YqnH3fPVvfO0uXzjb2z34cnmXKZ78fnW2enGUrZ1unZ3+cn+WqZ39e +nG1fneVrZzvXZ3/dnhXqZ3/fne0+nBUbZ3uPZ/99PisBQFXWVJW3VBWk6khrFWyvjpKryo6qqrOq +plbHuqpQd3WcXtX0VLW9VR2zOtFXhfurk+yqfqBqGKwaudUpXhURVKeFVZOoapZULdLqjKyKKqqz +YNWqrNrUVTtUndNUMV11Hq469FWnsepCqgumKm6pLqJVt7XqsVe9WHXJUSVc1WW86nNX/d5qgKh+ +8FWDgerHYDUUqoYj1Ui0+ilWja5UPyeqsX9k11p1JVX9sl5NbFS/Zqqrm9XkVnUtV/22XU3tVL8X +quu71fRedaNU/bFfzRxWfy9XN4+q2ZPqVqX6x2k1d179s1rdvqjmr6o7tepf19XCbfXvenX3rlp8 +qO41qv99rJaeq/8DgEt506Wi5XKEdAm2Xo62XyrJl6qOS3Xn5Rj1Euq6HO++1NAvtT2Xut7LCeYl +3Hc52X+pZ18aBi6Ng5dT3EuEdzktuDQJL82iS4vkckZ6icouZxWXVvDSpry0qy/noEtMczmvu3TA +l079pct4uYBc4qbLRculG730WC+99ssl7JJwXC67Ln34pd99GfBefiAug77Lj4HLUPAyHLqMRC4/ +RS+jscvPK5exxGV89XJl7fJL6jKxfvl143I1c5ncvFzbuvyWu0xtX37fuVwvXKZ3Lzf2Ln+ULjP7 +l78fXm6WL7NHl1snl39ULnOnl3+eX25XL/MXlztXl3/VLgvXl3/fXu7WL4t3l3sPl/9tXJYeL//3 +fLkPADVFU22kpQaSaqOtNWV7TUWuqTtqY501iFob76ppumtaek3XU5vorcHM2mRfTd9fM7BrxoHa +1GAN4dameTWToGYW1iyi2oykhkprs7KaVVGzgTW7sjanrmFQbV5Tc+hqTrjm0tcWjDUcqS2aam5L +zYPWvNbakr1GYLVlR83nqvnxWsBd++CtBYnaR18tFKiFg7VIqPYpUotGa59jtdhKLZ6orazWvqzV +/lGBX9drqxu1ZKa2tln7tlVL5Wrft2vrO7V0obaxW/uxV8uUar/v1zYPa9lybeuo9sdJLVep/Xla +2z6v5au1nYvaX1e1Qq3293Vt97ZWrNf27mr/faiVGrX/Pdb2n2sHAHAz0nQDttyMkm6UrTeq9hs1 ++Was4wbqvBmn3mi6brTdNzr6zUTPDdx7M8m80ffdGPpvjOybqYEbZPBmmntj4t2YBTcW4c2M6AaV +3MxKb6yyG5vixg7ezClvMPXNPHTj0Nw4dTcu+GZBf4MbbxaRG7fpxmO58aI3S9Ybwn6zjN34HDd+ +100Av/ngvgl6bz4SNyHfTThwEwnefArdRCM3n6M3sdhNfOVmJXHzZfUmsXbzNXWzun6T3LhZy9x8 +27xJbd18z92sb9+kd242Cjc/dm8yeze/l24292+yhzdb5Zs/jm5yJzd/Vm62T2/y5zc71Zu/Lm4K +Vzd/1252r2+Ktzd79Zv/3t2UHm7+17jZf7w5eL45BIA62FQfbakrSXVVa13dXh8j16GO+nhnXUOt +a7vquu76BL0O99Qne+t6Zt3QVzf216fYdWSgPj1YN3HrZl7dIqjPCOuoqD4rqVuldZusblfU58A6 +pqzPq+sOqO7U1F26+gJcx/X1RWPdjdQ9prrXUl9C64S1vmyv+7C631EPuOof8HrQXf/orYeIethX +jwTqn4L1aKj+OVKPRevxWH1lpf4lUU+s1r+u1VdT9eR6fW2j/i1TT23Wv2/V13P19HZ9Y6f+o1DP +7NZ/36tvlurZ/frWYf2Pcj13VP/zpL5dqedP6zvn9b+q9cJF/e+r+m6tXryu793W/1uvl+7q/3uo +7zfqB4/1w+f6/wHA/WjTvbLlXkW6V7fej7XfQ+T78Y57Tee9lnqv67qf6L6H6feTPff63nsD897Y +dz/Vf4+w76cH7k2D92buvYV3PyO4R4X3s6J7q+TeJr23y+7nFPcYeD+vvHeo753QvUtzv6C7x+H7 +Rf2923jvQe69pvslyz2B3i9b7332ez92H3Dcf3DdB/H7j+77kPc+TNxHfPefAvfR4P3n0H0sch+P +3q/E7r+s3CcS919X71fX7pOp+7X1+28b96nM/ffN+/Wt+3TufmP7/sfOfaZw//vu/ebefbZ0v7V/ +/8fhfa58/+fR/fbJfb5yv3N6/9f5faF6//fF/e7VfbF2v3d9/9/b+1L9/n939/sP9weN+8PH+/97 +vi8DQEPZ1FC1NNSkxlhrA2pvjJMbmo6GtrOhozYmuhpwd2OS3tD3NAy9DSOzMdXXQPob0+yGaaBh +HmxYuI0ZXgMVNGaFDauoYZM07NLGnKyBKRrzYMOhbDjVDRfUWNA0cF1jEW649Q2PseFFGkumBmFp +LKMNn7XhtzcCWOODoxF0NT7ijZC7EfY2IkTjk68RDTQ+BxuxUCMeaaxEG19ijcRK42uisbraSK41 +1lKNb+uN1Ebje6axvvmPJW1s5Bo/thuZncbvhcbmbiO719gqNf7Yb+QOG3+WG9tHjfxJY6fS+Ou0 +UThv/F1t7F40ileNvVrjv9eN0m3jf/XG/l3j4KFx2Gj832Oj/Nz4fwDwpGp6Urc8jZGeoNan8fYn +DflJ2/Gk63yaoD7BXU+T3U96+pOh58nY+zTFfEL6nqb7n0zsJ/PAk2XwaYb7hPKeZgVPVuGTTfRk +lzzNSZ8w2dO84skBPjmVTy710wL0hGueFnVPbvjJo3/yGp+WkCfC9LRsefKhT37rU8D+9AF7Cjqe +PrqeQvhT2P0U8T59Ip6ivqfPgadY8CkeelqJPH2JPiViT19XnlYTT8nVp7W1p2+pp9T60/eNp/XM +U3rzaWPr6UfuKbP99PvO02bhKbv7tLX39EfpKbf/9Ofh03b5KX/0tHPy9FflqXD69Pf50271qXjx +tHf19N/aU+n66X+3T/v1p4O7p8OHp/9rPJUfn/7f89PR/w8QCy14LJdV2gAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-007.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-007.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4173f1e30125738681a9691af9122463fbb638da Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-007.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-007.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..e7bf114425ddc73b46a95fd1d54044ac294d00b9 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-007.xml @@ -0,0 +1,21 @@ + +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABAAGADASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDwhYfa +plh9qsrD7VMsPtUqRFOqVVh9qmWH2qysPtUyw+1UpHbTqlZYfaplh9qsrD7VMsPtVqR206pVWGpl +h9qsrDUyw+1UpHbTqlZYalWH2q0sNSrD7VSkdtOqVlh9qmWH2qysPtUyw+1UpHdTqnHrD7VMsPtV +lYfaplh9q81SPyqnVKqw+1TLD7VZWH2qZYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adUqrDUyw+1 +WVhqZYfarUjtp1SssNSrD7VaWGpVh9qpSO2nVKyw+1TLD7VZWH2qZYfaqUjup1Tj1h9qmWH2qysP +tUyw+1eapH5VTqlVYfaplh9qsrD7VMsPtVKR206pWWH2qZYfarKw+1TLD7VSkdtOqVVhqZYfarKw +1MsPtVqR206pWWGpVh9qtLDUqw+1UpHbTqlZYfaplh9qsrD7VMsPtVKR206px6w+1TLD7VZWH2qZ +YfavNUj8rp1SqsPtUyw+1WVh9qmWH2qlI7adUrLD7VMsPtVlYfaplh9qpSO2nVKqw1MsPtVlYamW +H2q1I7adUrLDUqw+1WlhqVYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adU//Z + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-008.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-008.pdf new file mode 100644 index 0000000000000000000000000000000000000000..252f83f0c67e15b83bf8ff1555591de043435906 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-008.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-008.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..0deeed68e3044c560e61de388c478e49dbe98ff1 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-008.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-009.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-009.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2fa0a1802780dfb946bf0ef36e384b24a8f98169 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-009.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-009.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-009.xml new file mode 100644 index 0000000000000000000000000000000000000000..25c013d083db2204b7a396c493a6ea3f9eb16406 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-009.xml @@ -0,0 +1,46 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAMAAADS6oI8AAADAFBMVEW4t5mrt5O4qpWrqo6euo2S +uoeZs4ieqoiSqoK4nJCrnIq4kIyrkIaen4SSn36ZmH+ekH+SkHmGuoGGs395t3pounJos3CGqnx5 +qnVtqm9iqmqGnHd5nHGGkHN5kG1on2lomGdokGS4hIirhIK4d4Srd32eh3ySh3aZgHeed3eSd3G4 +a4Cra3m4YHyrYHaea3OSa22eYG+SYGmGh3CGgG55hGloh2FogF+Gd2t5d2Rtd15id1mGa2d5a2CG +YGN5YF1ta1pia1VoYFRWumlWs2dJt2I4ulo4s1hWqmRJql09qlcyqlImulEaukshs0wKukMKs0Em +qkwaqkYPqkAEqjtWnF9JnFlWkFtJkFU4n1E4mE84kEwmn0gan0IhmEMmkEMakD0KnzoKmDgKkDVW +h1hWgFZJhFE4h0k4gEdWd1NJd0w9d0Yyd0FWa09Ja0hWYEtJYEU9a0Iyaz04YDwmh0AahzohgDsK +hzIKgDAmdzsadzUPdy8EdyomazcaazEmYDMaYC0PaysEayYKYCW4VHirVHK4R3SrR22eV2ySV2aZ +UGeeR2eSR2G4O3CrO2m4MGyrMGaeO2OSO12eMF+SMFmGV2CGUF55VFloV1FoUE+GR1t5R1RtR05i +R0mGO1d5O1CGMFN5ME1tO0piO0VoMES4JGirJGK4GGSrGF6eJ1ySJ1aZIFeeGFeSGFG4DmGrDlq4 +A12rA1eeDlSSDk6eA1CSA0qGJE95JEmGGEt5GEVoJ0FoID9oGDyGDkh5DkGGA0R5Az5tDjtiDjZo +AzVWVEdJVEE4Vzk4UDdWR0NJRzw9RzYyRzFWOz9JOzhWMDtJMDU9OzIyOy04MCwmVzAaVyohUCsK +VyIKUCAmRysaRyUPRx8ERxomOycaOyEmMCMaMB0POxsEOxYKMBVWJDdJJDFWGDNJGC04Jyk4ICc4 +GCRWDjBJDilWAyxJAyY9DiMyDh44Ax0mJyAaJxohIBsmGBsaGBUKJxIKIBAKGA0mDhgaDhImAxQa +Aw4PDgwEDgcKAwZYdbPqAAAAAWJLR0QAiAUdSAAAAAxjbVBQSkNtcDA3MTIAAAADSABzvAAABjJJ +REFUWEedkImbTgUcha9ChZl2RUKR0TKTtGiRsZUSEpI0tKm0GoW0WSOjMmNpL82oFG1apJJltNDC +KKRNURRZytZqRr9zzl2+79779Ty+9w943+ccZ7fPLvGv+N1js9jk8r7HfDFPzCRvktfIDOGEA64/ +rYD8oUCFVyhPGuAHtqRYUJq0IHFAOFBh7C4Hu/4B//4NfgO/bwGbN4JNm34FC8D7pWD+XDBv3hww +8w3w5uvgtVfBjBmvAAf+CvrL6f+HfgXo30L/RurdAP2l9M+lfs4c+t+g/3X6X6U+JiB/egH54wJ/ +xQ74bUNkAR9a8F5kQeKAaOAvUr5T7CB20Aay5WexTkBPSt8Rb4uXyUvkBfK8cCqkNxL9O3ZIbyQH +1klvxATkDwVC/p3btcAPrE8RmJ0U0IAX4wJ/+mDBdoLAeg8E1q5da/f8BGZ7IDBr1iy75y0DeqIB +U6dOtXueM5wgsM1QYKvhB0wOaE8MmBzAbkyfPl2BadOmmd2A3Qv8QRBAAXoGfiHRwLskEkDB9OGA +5H5gm/Rbt8oeDcgeDtgAg/qUAQ7YliJQVoZ7lhjJgZIS/FNcHAkUFeGfwsJC50efH8T34guPMgE5 +eNajRBSLSWQiKSImB5GA608rIH8osMZbsDppgB9YmmLBlKQFiQPCgTXGj6vBD6vA99+Bz8EXS0HZ +YrBkyWfgGfDsFFDyNCgungwmTQATx4OicaCw8EHgwL+G/tX0r6JfAfqX0r+YejdA/xT6n6Z+8mT6 +J9A/nv5x1McE5E8vIH/KQGRAzAI+9Ex0QeKAUOBb8g34mnxFPiWfgI/FIvIUeRI8IR4nD5D7yX1i +NHECfzRAvxuQXwH63YD8MQH5owEN0II9DWiAuyAxsHJl8NCKFb5/4cLIAg547LHIAj00dmx8YCXh +QysEBywkuOhDY9GiDwD9ABc9YjwsqCcYMMoYPfpe4HwrvbHckH+ZIb0Bu0G9Ib0BexAoKCiQf8yY +MdCPGkW9BaD+kiCAAvQMfESigUeJH3gIWAAF04cDkvuB5dIvWyZ7NCB7EKBegQLqUwY4YHmKQH4+ +7ulnJAdycxP8iYGcHPyTnZ3tjPQZJoaK2zzyBeSgtUeuaCGakpNIDjE5iARcf1oB+UOBEd6C4UkD +/ED/FAtaJi1IHBAOjDBGDgfDhoCh94BbwW39Qf4toF+/m0Er0LolyD0btGjRHDRtAk46EeScALKz +jwcO/CPoH07/EPoVoL8//bdQ7wbob0n/2dQ3b05/E/pPpP8E6mMC8qcXkD9lIDIgZgEfahVdkDgg +FLib3AXuJHeQm8iN4AZxPTmLnAnOEKeT48ix5BjRkDiBPxqg3w3IrwD9bkD+mID80YAGaMGeBjTA +XZAYGDw4eGjQIN/ft29kAQc0axZZoIcaN44PDCZ8aJDggL4EF11rXCPoB7joVOMUQT3BgAZGw4ZH +A+du6Y2BhvwDDOkN2IPANdIbsAeBrKws+Rs1agR9gwbUWwDq2wkCKEDPwHXED/Qhpj6N+IGTgQVQ +MH04ILkfGCj9gAGyBwHp+/SRPQhQr0AW9SkDHDAwRaBHj/hA3boJ/sRAjRr4p3r16s7VPleIy8Vl +Hj3EJS5HedQVR4oDyQGkBjE5iARcf1oB+VMF3AG9Qwt6plhQP2mBBuwfF7jKB4XeBI2eHgh0797d +HroY1PdAoE6dOnbPEQb0RAOqVatm9+xnOEGgl6FAnuEHTA5oTwyYHMBuZGZmKpCRkWF2A3YvcCVB +AAXoGbiURAP1SCSAgunDAcn9QC/p8/JkjwZkDwdsgEF9ONDN83flgkigffuki2p7/lq1Ei/6v0A3 +48quoFcXkHcRuABc2h6cL84jtUG9WuBwcRjJ3Bdk7AP2FnsRB/5u9Helvwv9CtDvBuRXgH43IP9h +9O9LvxuQPxqQP72A/DGBzp2DAZ06+f527SILOKBmzcgCDahaNT7QmfChToID2hFcdI7RVtAPcNEh +xsGCeoIBlQx7h3ST3uhoyN/BkN6APQi0ld6APQhUqVJF/sqVK0NfqZL0jgP1hQQBFKBn4FziB9oQ +Ux9K/MBBwAIomD4ckNwPdJS+QwfZg4D0bdrIHgSoV6AK9SkDHNAxzQD9sYH/AHAD8Cry1R2MAAAA +AElFTkSuQmCC + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-010.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-010.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4fe72bbb93e74f75473f92ad41022b682477b871 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-010.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-010.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-010.xml new file mode 100644 index 0000000000000000000000000000000000000000..1d932ef209f2258d0a0ba6ce49e972bd25e84b66 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-010.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-011.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-011.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5111df52a0c230614797b3eea36dfb51011b12af Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-011.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-011.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-011.xml new file mode 100644 index 0000000000000000000000000000000000000000..a2f06494f8131af4e29d8ab9a6554b3e1cefeb35 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-011.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-012.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-012.pdf new file mode 100644 index 0000000000000000000000000000000000000000..430834f2c4a1a8c98aea745a36ae5792e0359d98 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-012.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-012.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-012.xml new file mode 100644 index 0000000000000000000000000000000000000000..dbfe72a83613aca1e2ac5a51c00ab318f9f7d6e4 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-012.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-013.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-013.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b58b7fa1b3a9e242f53d9b9aca4af462f6dcd087 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-013.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-013.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-013.xml new file mode 100644 index 0000000000000000000000000000000000000000..61656e905ebcf0c4460c571436855173bbd42030 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-013.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-014.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-014.pdf new file mode 100644 index 0000000000000000000000000000000000000000..20ac325e5ff8d2cca65d5060fbb1fd1b97676c3b Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-014.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-014.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-014.xml new file mode 100644 index 0000000000000000000000000000000000000000..3bec025a2d33cfef5725ffe7548687376c0e9861 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-014.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-015.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-015.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bbd9236d2e5ada4118a9cd4783f35a71e440f2f4 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-015.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-015.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-015.xml new file mode 100644 index 0000000000000000000000000000000000000000..85e0d1912438bb175a79823ffa9f7dfaa83e51d3 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-015.xml @@ -0,0 +1,4 @@ + +Inherited strike and spacing]]>مرحبا بالعالم]]> diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-016.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-016.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a08586df541299f7930ca669a3e183e711722c81 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-016.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-016.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-016.xml new file mode 100644 index 0000000000000000000000000000000000000000..ce40c2f46c91bd14dfcfe9ab6961850c4339b669 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-016.xml @@ -0,0 +1,9 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAO +xAAADsQBlSsOGwAAARlJREFUeF7t2VFHQ2EcBvD3PWetVqvVam1ERESMiIiIiL7/J5p9gD1dvF51 +8eNcn4uf53n2P1ZLKUOpnkMCtYx0kkAt00F8gkAtsxFQBJpPAEWgxRGgCLScAopAq2NAEWhzAigC +3c0ARaD7U0AR6OEMUAR6nAOKQE/ngCLQ8wWgCLRdAIpAL5eAItDrFaAI9LYEFIHerwFFoI8bQBHo +cwUoAn3dAopA32tAEehnAygKjPu/xjyHBAY0WQDQL+0BBKhtYSVIgiSo6w+xiqmYiqnYX34J2SAb +ZINskA1qa4EESZAEdW1B15e7g9xBbf2VIAmSICPtDmprgQRJkAR1bUHXl7uD3EFt/ZUgCZIgI+0O +amuBBEnQP07QDo1OW207QPoWAAAAAElFTkSuQmCC + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-017.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-017.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3d808099511995434c2a5f9e71181b93a678986c Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-017.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-017.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-017.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f90196309c2853c27093d5184f1dfebd8494f28 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-017.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-018.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-018.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ac7ecba500330c7475fe069b8fbcdff71d50c844 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-018.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-018.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-018.xml new file mode 100644 index 0000000000000000000000000000000000000000..db0552dc3532d3a354048d541ab24b2d4a56b72b --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-018.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-019.pdf b/corpus/m6/native-expanded-control-ui-01/before-read/page-019.pdf new file mode 100644 index 0000000000000000000000000000000000000000..842692ebfe454c1f0de78e529a9dbc59d2931d6e Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/before-read/page-019.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/page-019.xml b/corpus/m6/native-expanded-control-ui-01/before-read/page-019.xml new file mode 100644 index 0000000000000000000000000000000000000000..129e88ab63e3d3e9d73f0d082cbed94b378de64a --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/page-019.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/before-read/payloads.json b/corpus/m6/native-expanded-control-ui-01/before-read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..bc48d8c534348538cde9ae9b0e56ee4caa7c7800 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/before-read/payloads.json @@ -0,0 +1,18 @@ +[ + { + "sha256": "4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2", + "name": "Fictitious attachment.txt", + "object": "{2E7BA99D-CDED-080F-2255-D01592C0E5C8}{40}{B0}", + "kind": "InsertedFile", + "page": "{34619019-150E-06C2-3149-42A4E92723BF}{1}{B0}", + "bytes": 27 + }, + { + "sha256": "56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9", + "name": "silence.wav", + "object": "{2E7BA99D-CDED-080F-2255-D01592C0E5C8}{44}{B0}", + "kind": "MediaFile", + "page": "{34619019-150E-06C2-3149-42A4E92723BF}{1}{B0}", + "bytes": 16044 + } +] \ No newline at end of file diff --git a/corpus/m6/native-expanded-control-ui-01/commands.jsonl b/corpus/m6/native-expanded-control-ui-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..83ff3a5d4ad4e49171a36d1450329e0ab7ae7d1f --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/commands.jsonl @@ -0,0 +1,6 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-DB65123D -ExpectedPages 20 -Pdf -KeepOpen", "exit": 0, "stdout": "Read 5 sections and 20 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\read -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Rename-Item C:\\one-tests\\runs\\capture\\read before-read\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-DB65123D -UseCurrentCache -ExpectedPages -1 -Pdf", "exit": 0, "stdout": "Read 5 sections and 20 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-expanded-control-ui-01/expanded.png b/corpus/m6/native-expanded-control-ui-01/expanded.png new file mode 100644 index 0000000000000000000000000000000000000000..22cc19840cebff2539ec5e35d896171078e4a3b7 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/expanded.png differ diff --git a/corpus/m6/native-expanded-control-ui-01/finish b/corpus/m6/native-expanded-control-ui-01/finish new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/corpus/m6/native-expanded-control-ui-01/health.json b/corpus/m6/native-expanded-control-ui-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..eba36a9207aff61d0b0cd408404c87d627a0a049 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-DB65123D", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-expanded-control-ui-01/machine.json b/corpus/m6/native-expanded-control-ui-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..28b5a0981ce6eb076c0aab16fe284e64f7448670 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-db65123d", "hostname": "ONE-M6-DB65123D"} diff --git a/corpus/m6/native-expanded-control-ui-01/model/assets.json b/corpus/m6/native-expanded-control-ui-01/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..fcb4aa69180d2478e004cd36882b11df3d1c01b1 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[24,174,123,176,253,140,107,73,154,219,36,174,218,63,108,220]}},{"path":"assets/1.bin","reference":{"Internal":[45,22,52,10,96,95,120,74,149,114,208,117,239,252,150,199]}},{"path":"assets/2.bin","reference":{"Internal":[7,152,73,239,100,120,37,76,191,193,55,183,50,251,60,41]}},{"path":"assets/3.bin","reference":{"Internal":[101,133,22,201,93,63,38,68,133,74,149,28,188,8,102,75]}},{"path":"assets/4.bin","reference":{"Internal":[21,180,26,125,154,100,189,67,168,99,187,239,132,20,103,222]}},{"path":"assets/5.bin","reference":{"Internal":[30,98,194,39,135,62,72,68,129,88,26,156,63,209,139,117]}},{"path":"assets/6.bin","reference":{"Internal":[188,232,223,92,160,21,248,78,151,16,208,92,140,190,81,24]}},{"path":"assets/7.bin","reference":{"Internal":[27,128,25,241,248,247,172,71,169,35,81,88,235,90,43,244]}},{"path":"assets/8.bin","reference":{"Internal":[88,222,6,147,153,3,109,79,166,118,29,18,90,218,142,14]}}] \ No newline at end of file diff --git a/corpus/m6/native-expanded-control-ui-01/model/assets/0.bin b/corpus/m6/native-expanded-control-ui-01/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..24a9eea189c0284d6dc85c2929ad069218924208 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/model/assets/0.bin differ diff --git a/corpus/m6/native-expanded-control-ui-01/model/assets/1.bin b/corpus/m6/native-expanded-control-ui-01/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..c2d4cb0f5ca8f87d6ee3a740929637004f92ec63 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/model/assets/1.bin differ diff --git a/corpus/m6/native-expanded-control-ui-01/model/assets/2.bin b/corpus/m6/native-expanded-control-ui-01/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..185512b97148b00cd95c7571321a76ce80cc6205 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/model/assets/2.bin differ diff --git a/corpus/m6/native-expanded-control-ui-01/model/assets/3.bin b/corpus/m6/native-expanded-control-ui-01/model/assets/3.bin new file mode 100644 index 0000000000000000000000000000000000000000..5b0069028a8c88f3b11d6bd7f2a7588fa0fdfb8a Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/model/assets/3.bin differ diff --git a/corpus/m6/native-expanded-control-ui-01/model/assets/4.bin b/corpus/m6/native-expanded-control-ui-01/model/assets/4.bin new file mode 100644 index 0000000000000000000000000000000000000000..a959c053358a06abc072d3492e7a86d2e712d804 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/model/assets/4.bin differ diff --git a/corpus/m6/native-expanded-control-ui-01/model/assets/5.bin b/corpus/m6/native-expanded-control-ui-01/model/assets/5.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/model/assets/5.bin differ diff --git a/corpus/m6/native-expanded-control-ui-01/model/assets/6.bin b/corpus/m6/native-expanded-control-ui-01/model/assets/6.bin new file mode 100644 index 0000000000000000000000000000000000000000..96260477f0ca60b1605e2971d8cdc146b8b4e02b Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/model/assets/6.bin differ diff --git a/corpus/m6/native-expanded-control-ui-01/model/assets/7.bin b/corpus/m6/native-expanded-control-ui-01/model/assets/7.bin new file mode 100644 index 0000000000000000000000000000000000000000..69078f80c663d2c39ebf172941cb85b78731db13 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/model/assets/7.bin differ diff --git a/corpus/m6/native-expanded-control-ui-01/model/assets/8.bin b/corpus/m6/native-expanded-control-ui-01/model/assets/8.bin new file mode 100644 index 0000000000000000000000000000000000000000..cd2a1ff44360f3e5b281cff0a23e5f1da6a0262c Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/model/assets/8.bin differ diff --git a/corpus/m6/native-expanded-control-ui-01/model/document.json b/corpus/m6/native-expanded-control-ui-01/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..a38fb28add925c434f8e70a7217e606cea0c0947 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/model/document.json @@ -0,0 +1 @@ +{"file_id":[167,129,155,6,9,123,217,79,169,213,239,224,5,110,69,141],"root":"{5FBAB4A8-F2EB-4D9C-892F-64D03C6D5C0C},1","spaces":{"{978C6F00-771C-48A4-B209-85FC9330D376},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{C074D235-5F66-44F7-95FA-B83852FB27FE},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{533C39B0-FBAD-4895-9E24-AD9B23BC5F4B},1"},"revisions":{"{C074D235-5F66-44F7-95FA-B83852FB27FE},1":{"roots":{"1":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},10","2":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},11","4":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},26"},"nodes":{"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},10":{"jcid":393271,"children":[],"content":["{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image bmp","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"5063cc1a333b1c48bc4b683d66175a9e"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"e0a22304a73ddd01"}}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},12":{"jcid":393227,"children":["{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},39"],"content":[],"structure":["{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128743,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},13":{"jcid":393260,"children":["{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},14","{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},14":{"jcid":393228,"children":["{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128743,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},20":{"jcid":393228,"children":["{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},21","{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},21":{"jcid":393229,"children":[],"content":["{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128742,"modified":1473128742,"original_author":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},17","latest_author":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},27","extra_set":null}],"paragraph_style":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},24":{"jcid":393229,"children":[],"content":["{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128742,"modified":1473128742,"original_author":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},17","latest_author":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},27","extra_set":null}],"paragraph_style":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},33":{"jcid":393229,"children":[],"content":["{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128743,"modified":1473128743,"original_author":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},17","latest_author":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128743,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Image bmp","runs":[{"start":0,"end":9,"format":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},38","extra_set":null}],"paragraph_style":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},39":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":72.0,"y":108.0,"max_width":144.0,"max_height":48.000008},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},40","filename":null,"alt":"Pattern bmp","picture_width":72.0,"picture_height":48.0,"background":false,"printout":false,"link":"https://example.invalid/image/bmp"},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb010000003086c74d139ec244ae8bc4516d2b8c6500000000020000000000106600000001000020000000215810c54095838726eb0d20c966e325cb531c4607fe02e955d8e262c8826744000000000e80000000020000200000009aeb527b585045019a19202938afcde2b51cbd242427b13d7a056e450979211420000000f62cf8eb2d0dfc58dc216a51554db463b2f1a6e2a8b6f2379f0d0e55540e53414000000080ea8ab8e559431a2d2c9889f2cfbbc853fcfe706f67357c72b7adbc73bebd6c7b3a980b4817e93ca6d778b363d165b4d829e9a3908fd3268500274a84bc25b2"}},{"id":469769724,"value":{"Bytes":"736cd8fce2891a1c5d62ba23cfbd41f0adea5fb5"}},{"id":2281709006,"value":"NoData"},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":2281708733,"value":"NoData"},{"id":2281709036,"value":"NoData"}]]},"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},40":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[24,174,123,176,253,140,107,73,154,219,36,174,218,63,108,220]},"extension":".png"},"extra":[]}}},"{533C39B0-FBAD-4895-9E24-AD9B23BC5F4B},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}},"{3EBEBC0A-4EB8-4680-9CAE-6D126E4A0CC7},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{70F926CC-F9D0-40E9-BA9E-C61949F36760},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{4B7C7101-699A-4DBD-8B5D-703A463A0590},1"},"revisions":{"{4B7C7101-699A-4DBD-8B5D-703A463A0590},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{70F926CC-F9D0-40E9-BA9E-C61949F36760},1":{"roots":{"1":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},10","2":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},11","4":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},26"},"nodes":{"{E0831A25-B965-4E65-A2DD-FFD6A6045736},10":{"jcid":393271,"children":[],"content":["{E0831A25-B965-4E65-A2DD-FFD6A6045736},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image jpg","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"d0ef0c224100fa43963c22b59e48a339"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"f021c203a73ddd01"}}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},12":{"jcid":393227,"children":["{E0831A25-B965-4E65-A2DD-FFD6A6045736},39"],"content":[],"structure":["{E0831A25-B965-4E65-A2DD-FFD6A6045736},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},13":{"jcid":393260,"children":["{E0831A25-B965-4E65-A2DD-FFD6A6045736},14","{E0831A25-B965-4E65-A2DD-FFD6A6045736},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},14":{"jcid":393228,"children":["{E0831A25-B965-4E65-A2DD-FFD6A6045736},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},20":{"jcid":393228,"children":["{E0831A25-B965-4E65-A2DD-FFD6A6045736},21","{E0831A25-B965-4E65-A2DD-FFD6A6045736},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},21":{"jcid":393229,"children":[],"content":["{E0831A25-B965-4E65-A2DD-FFD6A6045736},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128742,"modified":1473128742,"original_author":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},17","latest_author":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},27","extra_set":null}],"paragraph_style":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},24":{"jcid":393229,"children":[],"content":["{E0831A25-B965-4E65-A2DD-FFD6A6045736},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128742,"modified":1473128742,"original_author":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},17","latest_author":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},27","extra_set":null}],"paragraph_style":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},33":{"jcid":393229,"children":[],"content":["{E0831A25-B965-4E65-A2DD-FFD6A6045736},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128742,"modified":1473128742,"original_author":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},17","latest_author":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Image jpg","runs":[{"start":0,"end":9,"format":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},38","extra_set":null}],"paragraph_style":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},39":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":72.0,"y":108.0,"max_width":144.0,"max_height":48.000008},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128750,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{E0831A25-B965-4E65-A2DD-FFD6A6045736},40","filename":null,"alt":"Pattern jpg","picture_width":72.0,"picture_height":48.0,"background":false,"printout":false,"link":"https://example.invalid/image/jpg"},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb010000003086c74d139ec244ae8bc4516d2b8c65000000000200000000001066000000010000200000008cad040ac7081398a67852bc58b46ebb04e40b6e0a3a39af0d3b7c895e5ce8d4000000000e80000000020000200000006864ef8cced4f32a5725b600c914a13f1347dfed5f11ce03fb703d707c47c45e2000000051be517e7e082d4b0bbfd42804d24d302f30a89d941590fb6bc160d93406e734400000006eaf0f70e5bd6a372231cdada5453162f7ddc1e11fe46426c615ba59a83b75b1f5d6f55de6e7d63db6bba3c2edfdac59014eb0fb4903e88f7ba0fa5508b3857a"}},{"id":469769724,"value":{"Bytes":"7321a3199192deeef11db08454766ad7d65b5526"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":2281708733,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769250,"value":{"Bytes":"0000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{E0831A25-B965-4E65-A2DD-FFD6A6045736},40":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[45,22,52,10,96,95,120,74,149,114,208,117,239,252,150,199]},"extension":".jpg"},"extra":[]}}}}},"{774B3F15-481D-4DAC-94A5-561D665799B1},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{41CB75DE-5BFA-4D09-8B75-968E378FC588},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{4A009430-74D8-49A2-BDD0-0FFEDC139370},1"},"revisions":{"{4A009430-74D8-49A2-BDD0-0FFEDC139370},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{41CB75DE-5BFA-4D09-8B75-968E378FC588},1":{"roots":{"1":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},10","2":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},11","4":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},26"},"nodes":{"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},10":{"jcid":393271,"children":[],"content":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Task controls","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"2c397b9ccaf0174f8e0de3924a07a9cc"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"70e06508a73ddd01"}}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},12":{"jcid":393227,"children":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},39"],"content":[],"structure":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128751,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},13":{"jcid":393260,"children":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},14","{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128750,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},14":{"jcid":393228,"children":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128751,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},20":{"jcid":393228,"children":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},21","{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128750,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},21":{"jcid":393229,"children":[],"content":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128750,"modified":1473128750,"original_author":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},17","latest_author":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128750,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},27","extra_set":null}],"paragraph_style":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},24":{"jcid":393229,"children":[],"content":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128750,"modified":1473128750,"original_author":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},17","latest_author":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128750,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},27","extra_set":null}],"paragraph_style":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},33":{"jcid":393229,"children":[],"content":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128750,"modified":1473128750,"original_author":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},17","latest_author":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128750,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Task controls","runs":[{"start":0,"end":13,"format":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},38","extra_set":null}],"paragraph_style":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},39":{"jcid":393228,"children":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},40"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":72.0,"y":108.0,"max_width":480.0,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128751,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},40":{"jcid":393229,"children":[],"content":["{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128750,"modified":1473128750,"original_author":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},17","latest_author":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128750,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[{"definition":null,"action_type":100,"status":6,"created":1262401445,"completed":0,"start":1262390400,"due":1262476800,"task_id":[227,64,175,69,84,29,60,70,144,211,196,84,242,247,26,46],"extra_set":1}],"kind":{"type":"RichText","text":"Disabled standalone task","runs":[{"start":0,"end":24,"format":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},27","extra_set":null}],"paragraph_style":"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}],[{"id":201340019,"value":{"Bytes":"00"}},{"id":268448868,"value":{"Bytes":"5900"}},{"id":335557735,"value":{"Bytes":"00000000"}}]]}}}}},"{F5F0101D-A59D-46D8-9C9C-8AC52957ECA4},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{BD4C28C2-15B2-46BC-B7D5-828916DFC55A},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{F3271F93-A232-41C7-93C8-2161BEC42628},1"},"revisions":{"{F3271F93-A232-41C7-93C8-2161BEC42628},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{BD4C28C2-15B2-46BC-B7D5-828916DFC55A},1":{"roots":{"1":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},10","2":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},11","4":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},26"},"nodes":{"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},10":{"jcid":393271,"children":[],"content":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image role background=false, printout=false","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"4aaca0cb7a7d20408ef1364bff9db55e"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"e0efa205a73ddd01"}}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},12":{"jcid":393227,"children":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},39","{C7275DDA-7E57-4706-BA71-E96C8AC93C16},41"],"content":[],"structure":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},13":{"jcid":393260,"children":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},14","{C7275DDA-7E57-4706-BA71-E96C8AC93C16},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},14":{"jcid":393228,"children":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},20":{"jcid":393228,"children":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},21","{C7275DDA-7E57-4706-BA71-E96C8AC93C16},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},21":{"jcid":393229,"children":[],"content":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128745,"modified":1473128745,"original_author":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},17","latest_author":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},27","extra_set":null}],"paragraph_style":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},24":{"jcid":393229,"children":[],"content":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128745,"modified":1473128745,"original_author":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},17","latest_author":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},27","extra_set":null}],"paragraph_style":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},33":{"jcid":393229,"children":[],"content":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128745,"modified":1473128745,"original_author":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},17","latest_author":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Image role background=false, printout=false","runs":[{"start":0,"end":43,"format":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},38","extra_set":null}],"paragraph_style":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},39":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":36.0,"y":36.0,"max_width":288.0,"max_height":192.0},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},40","filename":null,"alt":"Role pattern","picture_width":72.0,"picture_height":48.0,"background":false,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb010000003086c74d139ec244ae8bc4516d2b8c6500000000020000000000106600000001000020000000baf8284fd835aaa7a44600da70a7e55f4dfb2c7fdc00288a29da42b18e147c5b000000000e8000000002000020000000bb222a40cc0cf0800ddb0dc11a25641f7c0d495ac559a4108ca9d65d862d7f6320000000d42bae115c0bf1a62a2cd6969b5f0994d4f408c6e4da435947a8d2d319fc081940000000b7f71982404e202bbe0429d31edb96f6071810ccd264c8e8cf1974713aaf5f567215260cd91afee74d6a6e9bbb39b532cf701955b6bda0eff768f0149304a4b3"}},{"id":469769724,"value":{"Bytes":"4b2cb5e4e68a713f4c4074f83bc4a99f105611b9"}},{"id":335551993,"value":{"Bytes":"02000000"}},{"id":2281708733,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769250,"value":{"Bytes":"0000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},40":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[7,152,73,239,100,120,37,76,191,193,55,183,50,251,60,41]},"extension":".png"},"extra":[]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},41":{"jcid":393228,"children":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},42"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":72.0,"y":108.0,"max_width":480.0,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},42":{"jcid":393229,"children":[],"content":["{C7275DDA-7E57-4706-BA71-E96C8AC93C16},46"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128745,"modified":1473128745,"original_author":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},17","latest_author":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},46":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Foreground role control","runs":[{"start":0,"end":23,"format":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},27","extra_set":null}],"paragraph_style":"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}}}},"{22C1E532-FF8D-4EBC-BBAD-FDC771A608D7},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{0C387409-9538-42F1-BF47-A0499D7D5FA8},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{F7C7A401-F29E-4394-A2CE-3C3A4F48209B},1"},"revisions":{"{F7C7A401-F29E-4394-A2CE-3C3A4F48209B},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{0C387409-9538-42F1-BF47-A0499D7D5FA8},1":{"roots":{"1":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},10","2":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},11","4":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},26"},"nodes":{"{E47C60BE-AF76-43E8-8937-2F36F60E114C},10":{"jcid":393271,"children":[],"content":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image role background=true, printout=false","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"bfe60ae49fb6f04883d33ecd8efdef25"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"309ee505a73ddd01"}}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},12":{"jcid":393227,"children":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},39","{E47C60BE-AF76-43E8-8937-2F36F60E114C},41"],"content":[],"structure":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},13":{"jcid":393260,"children":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},14","{E47C60BE-AF76-43E8-8937-2F36F60E114C},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},14":{"jcid":393228,"children":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},20":{"jcid":393228,"children":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},21","{E47C60BE-AF76-43E8-8937-2F36F60E114C},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},21":{"jcid":393229,"children":[],"content":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128745,"modified":1473128745,"original_author":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},17","latest_author":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},27","extra_set":null}],"paragraph_style":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},24":{"jcid":393229,"children":[],"content":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128745,"modified":1473128745,"original_author":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},17","latest_author":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},27","extra_set":null}],"paragraph_style":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},33":{"jcid":393229,"children":[],"content":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},17","latest_author":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Image role background=true, printout=false","runs":[{"start":0,"end":42,"format":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},38","extra_set":null}],"paragraph_style":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},39":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":36.0,"y":36.0,"max_width":288.0,"max_height":192.0},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},40","filename":null,"alt":"Role pattern","picture_width":72.0,"picture_height":48.0,"background":true,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb010000003086c74d139ec244ae8bc4516d2b8c6500000000020000000000106600000001000020000000c6802eaed92442ce1c0d448823d950936073023e637b773db263acdc120afd5d000000000e8000000002000020000000cbb02e1756b482468d07e78fe4a2ad4e7fe727c70e95f5b735427170dce92242200000000cdf3203a81d523fa27ea42f1e3cd7b616dbdae35258a8d16712ff373ec8430c40000000e518d8413b987f05d5c55e0e6425687f65b950dc76d419d6f9800646e7980cad5d2b5151d3ef3026fda8d8812dcf87e04d9823215a13f70b9465bd28d3fc1b55"}},{"id":469769724,"value":{"Bytes":"4b2cb5e4e68a713f4c4074f83bc4a99f105611b9"}},{"id":335551993,"value":{"Bytes":"02000000"}},{"id":2281708733,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769250,"value":{"Bytes":"0000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},40":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[7,152,73,239,100,120,37,76,191,193,55,183,50,251,60,41]},"extension":".png"},"extra":[]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},41":{"jcid":393228,"children":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},42"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":72.0,"y":108.0,"max_width":480.0,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},42":{"jcid":393229,"children":[],"content":["{E47C60BE-AF76-43E8-8937-2F36F60E114C},46"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},17","latest_author":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{E47C60BE-AF76-43E8-8937-2F36F60E114C},46":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Foreground role control","runs":[{"start":0,"end":23,"format":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},27","extra_set":null}],"paragraph_style":"{E47C60BE-AF76-43E8-8937-2F36F60E114C},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}}}},"{F13B1165-32C6-4D63-B4C5-B8EFC2545211},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{BA226054-F35E-4372-B591-5B02B2E6CC11},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{CD35F978-C249-4837-9D54-000183B276F6},1"},"revisions":{"{BA226054-F35E-4372-B591-5B02B2E6CC11},1":{"roots":{"1":"{8A6E1954-54EC-4890-A363-2CD23263DB72},10","2":"{8A6E1954-54EC-4890-A363-2CD23263DB72},11","4":"{8A6E1954-54EC-4890-A363-2CD23263DB72},26"},"nodes":{"{8A6E1954-54EC-4890-A363-2CD23263DB72},10":{"jcid":393271,"children":[],"content":["{8A6E1954-54EC-4890-A363-2CD23263DB72},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image gif","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"df318a66c286084b9e283696297e82be"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"601d1405a73ddd01"}}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},12":{"jcid":393227,"children":["{8A6E1954-54EC-4890-A363-2CD23263DB72},39"],"content":[],"structure":["{8A6E1954-54EC-4890-A363-2CD23263DB72},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},13":{"jcid":393260,"children":["{8A6E1954-54EC-4890-A363-2CD23263DB72},14","{8A6E1954-54EC-4890-A363-2CD23263DB72},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128744,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},14":{"jcid":393228,"children":["{8A6E1954-54EC-4890-A363-2CD23263DB72},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},20":{"jcid":393228,"children":["{8A6E1954-54EC-4890-A363-2CD23263DB72},21","{8A6E1954-54EC-4890-A363-2CD23263DB72},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128744,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},21":{"jcid":393229,"children":[],"content":["{8A6E1954-54EC-4890-A363-2CD23263DB72},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128744,"modified":1473128744,"original_author":"{8A6E1954-54EC-4890-A363-2CD23263DB72},17","latest_author":"{8A6E1954-54EC-4890-A363-2CD23263DB72},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128744,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{8A6E1954-54EC-4890-A363-2CD23263DB72},27","extra_set":null}],"paragraph_style":"{8A6E1954-54EC-4890-A363-2CD23263DB72},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},24":{"jcid":393229,"children":[],"content":["{8A6E1954-54EC-4890-A363-2CD23263DB72},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128744,"modified":1473128744,"original_author":"{8A6E1954-54EC-4890-A363-2CD23263DB72},17","latest_author":"{8A6E1954-54EC-4890-A363-2CD23263DB72},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128744,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{8A6E1954-54EC-4890-A363-2CD23263DB72},27","extra_set":null}],"paragraph_style":"{8A6E1954-54EC-4890-A363-2CD23263DB72},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},33":{"jcid":393229,"children":[],"content":["{8A6E1954-54EC-4890-A363-2CD23263DB72},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128745,"modified":1473128745,"original_author":"{8A6E1954-54EC-4890-A363-2CD23263DB72},17","latest_author":"{8A6E1954-54EC-4890-A363-2CD23263DB72},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Image gif","runs":[{"start":0,"end":9,"format":"{8A6E1954-54EC-4890-A363-2CD23263DB72},38","extra_set":null}],"paragraph_style":"{8A6E1954-54EC-4890-A363-2CD23263DB72},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},39":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":72.0,"y":108.0,"max_width":144.0,"max_height":48.000008},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{8A6E1954-54EC-4890-A363-2CD23263DB72},40","filename":null,"alt":"Pattern gif","picture_width":72.0,"picture_height":48.0,"background":false,"printout":false,"link":"https://example.invalid/image/gif"},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb010000003086c74d139ec244ae8bc4516d2b8c6500000000020000000000106600000001000020000000d78fe554bff78311f3c3b0b7e8c7191c4950e5b7153d0566379ff161b10c9236000000000e8000000002000020000000a4fd4030aebdd9d27459583f6488fde7a36254814381665255a7a1aae8e79a23200000004665fd77dc14750758fbce4163a8cf8408d34a6fb4d4333b6c14101eebea87544000000052cabb5d83bbea8d1919e19109fe3ca63b0f9b371db0bd7b11a0af6b62d1535def93d99f6db47cc6f98bb2cad013db23f92e9b772eac9f56fb072304b1e2df86"}},{"id":469769724,"value":{"Bytes":"0b2bde82a2a075665a7679884e67b09d11874441"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":2281708733,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769250,"value":{"Bytes":"0000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{8A6E1954-54EC-4890-A363-2CD23263DB72},40":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[101,133,22,201,93,63,38,68,133,74,149,28,188,8,102,75]},"extension":".png"},"extra":[]}}},"{CD35F978-C249-4837-9D54-000183B276F6},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}},"{4F120766-6EA7-4E5A-B336-8B441584A4B0},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{A26A8B36-5C5A-4EF0-8A4A-F5875125FBC8},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{54CC6F65-B9D8-4A2D-BF14-F50D0AC5B37B},1"},"revisions":{"{A26A8B36-5C5A-4EF0-8A4A-F5875125FBC8},1":{"roots":{"1":"{55083EE2-B644-4097-A02A-19F56E6362C7},10","2":"{55083EE2-B644-4097-A02A-19F56E6362C7},11","4":"{55083EE2-B644-4097-A02A-19F56E6362C7},26"},"nodes":{"{55083EE2-B644-4097-A02A-19F56E6362C7},10":{"jcid":393271,"children":[],"content":["{55083EE2-B644-4097-A02A-19F56E6362C7},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Files and recording","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"5bf9f2a7bf7777439427d892fc03e7b1"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"60888e06a73ddd01"}}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},12":{"jcid":393227,"children":["{55083EE2-B644-4097-A02A-19F56E6362C7},39"],"content":[],"structure":["{55083EE2-B644-4097-A02A-19F56E6362C7},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}},{"id":469769379,"value":{"Bytes":"578e419a647fc54087d08a8f7c1e5422"}}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},13":{"jcid":393260,"children":["{55083EE2-B644-4097-A02A-19F56E6362C7},14","{55083EE2-B644-4097-A02A-19F56E6362C7},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},14":{"jcid":393228,"children":["{55083EE2-B644-4097-A02A-19F56E6362C7},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},20":{"jcid":393228,"children":["{55083EE2-B644-4097-A02A-19F56E6362C7},21","{55083EE2-B644-4097-A02A-19F56E6362C7},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},21":{"jcid":393229,"children":[],"content":["{55083EE2-B644-4097-A02A-19F56E6362C7},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","latest_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{55083EE2-B644-4097-A02A-19F56E6362C7},27","extra_set":null}],"paragraph_style":"{55083EE2-B644-4097-A02A-19F56E6362C7},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},24":{"jcid":393229,"children":[],"content":["{55083EE2-B644-4097-A02A-19F56E6362C7},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","latest_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{55083EE2-B644-4097-A02A-19F56E6362C7},27","extra_set":null}],"paragraph_style":"{55083EE2-B644-4097-A02A-19F56E6362C7},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},33":{"jcid":393229,"children":[],"content":["{55083EE2-B644-4097-A02A-19F56E6362C7},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128747,"modified":1473128747,"original_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","latest_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Files and recording","runs":[{"start":0,"end":19,"format":"{55083EE2-B644-4097-A02A-19F56E6362C7},38","extra_set":null}],"paragraph_style":"{55083EE2-B644-4097-A02A-19F56E6362C7},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},39":{"jcid":393228,"children":["{55083EE2-B644-4097-A02A-19F56E6362C7},40","{55083EE2-B644-4097-A02A-19F56E6362C7},44","{55083EE2-B644-4097-A02A-19F56E6362C7},48"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":72.0,"y":108.0,"max_width":480.0,"max_height":139.42772},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},40":{"jcid":393229,"children":[],"content":["{55083EE2-B644-4097-A02A-19F56E6362C7},41"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128747,"modified":1473128747,"original_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","latest_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},41":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{55083EE2-B644-4097-A02A-19F56E6362C7},42","preview":"{55083EE2-B644-4097-A02A-19F56E6362C7},43","filename":"Fictitious attachment.txt","source_path":"C:\\one-tests\\runs\\capture\\notebook\\fixture-data\\attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"46006900630074006900740069006f007500730020006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},42":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[21,180,26,125,154,100,189,67,168,99,187,239,132,20,103,222]},"extension":".txt"},"extra":[]},"{55083EE2-B644-4097-A02A-19F56E6362C7},43":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[30,98,194,39,135,62,72,68,129,88,26,156,63,209,139,117]},"extension":".png"},"extra":[]},"{55083EE2-B644-4097-A02A-19F56E6362C7},44":{"jcid":393229,"children":[],"content":["{55083EE2-B644-4097-A02A-19F56E6362C7},45"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128747,"modified":1473128747,"original_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","latest_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},45":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{55083EE2-B644-4097-A02A-19F56E6362C7},46","preview":"{55083EE2-B644-4097-A02A-19F56E6362C7},47","filename":"silence.wav","source_path":"C:\\one-tests\\runs\\capture\\notebook\\fixture-data\\silence.wav","recording_id":[87,142,65,154,100,127,197,64,135,208,138,143,124,30,84,34],"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"730069006c0065006e00630065002e007700610076000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},46":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[188,232,223,92,160,21,248,78,151,16,208,92,140,190,81,24]},"extension":".wav"},"extra":[]},"{55083EE2-B644-4097-A02A-19F56E6362C7},47":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[27,128,25,241,248,247,172,71,169,35,81,88,235,90,43,244]},"extension":".png"},"extra":[]},"{55083EE2-B644-4097-A02A-19F56E6362C7},48":{"jcid":393229,"children":[],"content":["{55083EE2-B644-4097-A02A-19F56E6362C7},52"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128747,"modified":1473128747,"original_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","latest_author":"{55083EE2-B644-4097-A02A-19F56E6362C7},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55083EE2-B644-4097-A02A-19F56E6362C7},52":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[[87,142,65,154,100,127,197,64,135,208,138,143,124,30,84,34]],"media_time_ms":500,"tags":[],"kind":{"type":"RichText","text":"Recording annotation","runs":[{"start":0,"end":20,"format":"{55083EE2-B644-4097-A02A-19F56E6362C7},27","extra_set":null}],"paragraph_style":"{55083EE2-B644-4097-A02A-19F56E6362C7},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}},"{54CC6F65-B9D8-4A2D-BF14-F50D0AC5B37B},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}},"{E715358B-EBCB-4DB5-AB69-94C066A898DC},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CE82D8C2-54BF-48FB-9931-3CF1C4C49D6A},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{065F701A-0718-4CD5-9984-DF8F477C196C},1"},"revisions":{"{065F701A-0718-4CD5-9984-DF8F477C196C},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{CE82D8C2-54BF-48FB-9931-3CF1C4C49D6A},1":{"roots":{"1":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},10","2":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},11","4":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},26"},"nodes":{"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},10":{"jcid":393271,"children":[],"content":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image role background=true, printout=true","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"aaec0a4cf8ee1647b71d99037847bc12"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"e0ec5e06a73ddd01"}}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},12":{"jcid":393227,"children":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},39","{08DA89CE-DB98-47B8-8A71-8DB27509F71B},41"],"content":[],"structure":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},13":{"jcid":393260,"children":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},14","{08DA89CE-DB98-47B8-8A71-8DB27509F71B},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},14":{"jcid":393228,"children":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},20":{"jcid":393228,"children":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},21","{08DA89CE-DB98-47B8-8A71-8DB27509F71B},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},21":{"jcid":393229,"children":[],"content":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},17","latest_author":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},27","extra_set":null}],"paragraph_style":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},24":{"jcid":393229,"children":[],"content":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},17","latest_author":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},27","extra_set":null}],"paragraph_style":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},33":{"jcid":393229,"children":[],"content":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},17","latest_author":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Image role background=true, printout=true","runs":[{"start":0,"end":41,"format":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},38","extra_set":null}],"paragraph_style":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},39":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":36.0,"y":36.0,"max_width":286.56,"max_height":190.56001},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},40","filename":null,"alt":"Role pattern","picture_width":72.0,"picture_height":48.0,"background":true,"printout":true,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb010000003086c74d139ec244ae8bc4516d2b8c6500000000020000000000106600000001000020000000c517d993784d0b8510bcd845c1d484105d433ce557ff80b324a65a1094d2171c000000000e80000000020000200000003f76861b32eaaf2abd9d3904f0ecedde447d949ff366ea4b1f445a2970fee50820000000c7a01b667117fece3542cad1b2cc14bc413470995d80a5bedfa73a7e0b9758ef40000000287045e86af32e6e4df18335769dc1730e6be457dad18a9e1701b7461d6e2b2809f40d07cab39863f04b3f9cd5817c7957b613e15b8e7b0bab43820f481a474f"}},{"id":469769724,"value":{"Bytes":"4b2cb5e4e68a713f4c4074f83bc4a99f105611b9"}},{"id":335551993,"value":{"Bytes":"02000000"}},{"id":2281708733,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769250,"value":{"Bytes":"0000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},40":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[7,152,73,239,100,120,37,76,191,193,55,183,50,251,60,41]},"extension":".png"},"extra":[]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},41":{"jcid":393228,"children":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},42"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":72.0,"y":108.0,"max_width":480.0,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},42":{"jcid":393229,"children":[],"content":["{08DA89CE-DB98-47B8-8A71-8DB27509F71B},46"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},17","latest_author":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},46":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Foreground role control","runs":[{"start":0,"end":23,"format":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},27","extra_set":null}],"paragraph_style":"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}}}},"{ABA3D98F-BECC-464C-A8CB-B8FB52C392E2},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{8EC9CE4B-8F17-43E2-A1DE-7A1BB39701BC},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{765EC190-2698-4D0D-9BE4-176915F0525E},1"},"revisions":{"{8EC9CE4B-8F17-43E2-A1DE-7A1BB39701BC},1":{"roots":{"1":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},10","2":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},11","4":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},26"},"nodes":{"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},10":{"jcid":393271,"children":[],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Paragraph controls","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"d8f7afe4d929a342ab66d603d5015ebb"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"a0283507a73ddd01"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},12":{"jcid":393227,"children":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},39"],"content":[],"structure":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},13":{"jcid":393260,"children":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},14","{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},14":{"jcid":393228,"children":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},20":{"jcid":393228,"children":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},21","{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},21":{"jcid":393229,"children":[],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128748,"modified":1473128748,"original_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","latest_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},27","extra_set":null}],"paragraph_style":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},24":{"jcid":393229,"children":[],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128748,"modified":1473128748,"original_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","latest_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},27","extra_set":null}],"paragraph_style":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},33":{"jcid":393229,"children":[],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128748,"modified":1473128748,"original_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","latest_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Paragraph controls","runs":[{"start":0,"end":18,"format":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},38","extra_set":null}],"paragraph_style":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},39":{"jcid":393228,"children":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},40","{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},47","{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},52","{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},58","{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},73"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":72.0,"y":108.0,"max_width":480.0,"max_height":87.66204},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},40":{"jcid":393229,"children":[],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128748,"modified":1473128748,"original_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","latest_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Inherited strike and spacing","runs":[{"start":0,"end":28,"format":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},27","extra_set":null}],"paragraph_style":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},46","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},46":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":true,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":14.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":9.0,"space_after":4.5,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"Fixture style"},"extra":[[]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},47":{"jcid":393229,"children":[],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},51"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128748,"modified":1473128748,"original_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","latest_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},51":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":1,"rtl":null,"space_before":12.0,"space_after":6.0,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Centered paragraph","runs":[{"start":0,"end":18,"format":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},27","extra_set":null}],"paragraph_style":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"02000000"}},{"id":335551620,"value":{"Bytes":"02000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},52":{"jcid":393229,"children":[],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},56"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128748,"modified":1473128748,"original_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","latest_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708596,"value":"NoData"}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},56":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":2,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"مرحبا بالعالم","runs":[{"start":0,"end":13,"format":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},57","extra_set":null}],"paragraph_style":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0104"}},{"id":335551550,"value":{"Bytes":"03000000"}},{"id":335551620,"value":{"Bytes":"03000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},57":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Arial","font_size":null,"color":null,"highlight":null,"language":1025,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":2281714858,"value":"NoData"},{"id":201334017,"value":{"Bytes":"b2"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},58":{"jcid":393229,"children":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},63"],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},62"],"structure":[],"spaces":[],"child_level":2,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128748,"modified":1473128748,"original_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","latest_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":201333777,"value":{"Bytes":"01"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},62":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Collapsed parent","runs":[{"start":0,"end":16,"format":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},27","extra_set":null}],"paragraph_style":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},63":{"jcid":393229,"children":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},68"],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},67"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128748,"modified":1473128748,"original_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","latest_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},67":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Hidden child remains stored","runs":[{"start":0,"end":27,"format":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},27","extra_set":null}],"paragraph_style":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},68":{"jcid":393229,"children":[],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},72"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128748,"modified":1473128748,"original_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","latest_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},72":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Grandchild","runs":[{"start":0,"end":10,"format":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},27","extra_set":null}],"paragraph_style":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},73":{"jcid":393229,"children":[],"content":["{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},77"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128748,"modified":1473128748,"original_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","latest_author":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},77":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128748,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"AB        C","runs":[{"start":0,"end":11,"format":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},27","extra_set":null}],"paragraph_style":"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}},"{765EC190-2698-4D0D-9BE4-176915F0525E},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}},"{8F74EF9A-31BF-445D-84C0-93A60D5C1BA7},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CD7B9DD7-3E2B-4718-A3C0-F5B0F3438380},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{937D4936-B04B-4DEC-BA33-575B74F07469},1"},"revisions":{"{937D4936-B04B-4DEC-BA33-575B74F07469},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}},"{CD7B9DD7-3E2B-4718-A3C0-F5B0F3438380},1":{"roots":{"1":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},10","2":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},11","4":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},26"},"nodes":{"{CA4801D9-2718-46A8-B58F-BD356DEA0174},10":{"jcid":393271,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Numbering controls","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"efd0711e63e0854880e7d07b3635ceae"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"00c4d407a73ddd01"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},12":{"jcid":393227,"children":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},39"],"content":[],"structure":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128750,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},13":{"jcid":393260,"children":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},14","{CA4801D9-2718-46A8-B58F-BD356DEA0174},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},14":{"jcid":393228,"children":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128750,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},20":{"jcid":393228,"children":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},21","{CA4801D9-2718-46A8-B58F-BD356DEA0174},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},21":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},24":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},33":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Numbering controls","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},38","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},39":{"jcid":393228,"children":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},40","{CA4801D9-2718-46A8-B58F-BD356DEA0174},46","{CA4801D9-2718-46A8-B58F-BD356DEA0174},52","{CA4801D9-2718-46A8-B58F-BD356DEA0174},58","{CA4801D9-2718-46A8-B58F-BD356DEA0174},64","{CA4801D9-2718-46A8-B58F-BD356DEA0174},70","{CA4801D9-2718-46A8-B58F-BD356DEA0174},76","{CA4801D9-2718-46A8-B58F-BD356DEA0174},82","{CA4801D9-2718-46A8-B58F-BD356DEA0174},88","{CA4801D9-2718-46A8-B58F-BD356DEA0174},94"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":72.0,"y":108.0,"max_width":480.0,"max_height":137.07007},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128750,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},40":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},44"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},45"],"paragraph_style":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},44":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Sequence 0, item 0","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},45":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0000","restart":3,"bullet":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},46":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},50"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},51"],"paragraph_style":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},50":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Sequence 0, item 1","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},51":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0000","restart":null,"bullet":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},52":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},56"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},57"],"paragraph_style":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},56":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Sequence 1, item 0","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},57":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0001","restart":3,"bullet":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},58":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},62"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},63"],"paragraph_style":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},62":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Sequence 1, item 1","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},63":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0001","restart":null,"bullet":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},64":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},68"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},69"],"paragraph_style":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},68":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Sequence 2, item 0","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},69":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0002","restart":3,"bullet":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},70":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},74"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},75"],"paragraph_style":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},74":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Sequence 2, item 1","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},75":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0002","restart":null,"bullet":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},76":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},80"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},81"],"paragraph_style":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},80":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Sequence 3, item 0","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},81":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0003","restart":3,"bullet":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},82":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},86"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},87"],"paragraph_style":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},86":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Sequence 3, item 1","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},87":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0003","restart":null,"bullet":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},88":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},92"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},93"],"paragraph_style":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},92":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Sequence 4, item 0","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},93":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0004","restart":3,"bullet":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},94":{"jcid":393229,"children":[],"content":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},98"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128749,"modified":1473128749,"original_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","latest_author":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":["{CA4801D9-2718-46A8-B58F-BD356DEA0174},99"],"paragraph_style":null},"extra":[[]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},98":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Sequence 4, item 1","runs":[{"start":0,"end":18,"format":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},27","extra_set":null}],"paragraph_style":"{CA4801D9-2718-46A8-B58F-BD356DEA0174},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{CA4801D9-2718-46A8-B58F-BD356DEA0174},99":{"jcid":393234,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":4278190080,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128749,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"List","font":null,"format":"�\u0004","restart":null,"bullet":null},"extra":[[]]}}}}},"{38F51AA4-F561-4263-8DFE-69F99A053AC5},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{06BD3755-EF72-4542-890A-E865C245F2C3},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{1E3F8BE5-DA93-4736-B999-5A89E1A42BEE},1"},"revisions":{"{06BD3755-EF72-4542-890A-E865C245F2C3},1":{"roots":{"1":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},10","2":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},11","4":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},26"},"nodes":{"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},10":{"jcid":393271,"children":[],"content":["{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image tiff","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"1f393c98c8fc1c479e07a2c84eab6bd8"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"10a97404a73ddd01"}}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},12":{"jcid":393227,"children":["{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},39"],"content":[],"structure":["{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128744,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},13":{"jcid":393260,"children":["{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},14","{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128743,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},14":{"jcid":393228,"children":["{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128744,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},20":{"jcid":393228,"children":["{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},21","{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128743,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},21":{"jcid":393229,"children":[],"content":["{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128743,"modified":1473128743,"original_author":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},17","latest_author":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128743,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},27","extra_set":null}],"paragraph_style":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},24":{"jcid":393229,"children":[],"content":["{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128743,"modified":1473128743,"original_author":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},17","latest_author":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128743,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},27","extra_set":null}],"paragraph_style":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},33":{"jcid":393229,"children":[],"content":["{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128744,"modified":1473128744,"original_author":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},17","latest_author":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128744,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Image tiff","runs":[{"start":0,"end":10,"format":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},38","extra_set":null}],"paragraph_style":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},39":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":72.0,"y":108.0,"max_width":144.0,"max_height":48.000008},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128745,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},40","filename":null,"alt":"Pattern tiff","picture_width":72.0,"picture_height":48.0,"background":false,"printout":false,"link":"https://example.invalid/image/tiff"},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb010000003086c74d139ec244ae8bc4516d2b8c6500000000020000000000106600000001000020000000dada78c373873a02763f088cc1e155172beeab45e72d3fccca4427de4b3580bc000000000e8000000002000020000000d58a66b17d60764d623f9d3e7121b81342e8fb8eb9b5acc8ad55183cef04196520000000e16dad985f36be2c7c75ab0fda98f0169ac94895dc07342f170424e17789bf2e400000009b7390f6b3861a4523a0b677bf5750963facd0e36811e6a62737d4e93c4aceb1e1e563a52d0132c7100017f47405763ec901516f34855422c3dd679952402fea"}},{"id":469769724,"value":{"Bytes":"884f1206378302aee2be9dccf4343669c5fa5c34"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":2281708733,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769250,"value":{"Bytes":"0000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},40":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[88,222,6,147,153,3,109,79,166,118,29,18,90,218,142,14]},"extension":".tif"},"extra":[]}}},"{1E3F8BE5-DA93-4736-B999-5A89E1A42BEE},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}},"{5FBAB4A8-F2EB-4D9C-892F-64D03C6D5C0C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{D2AE8403-7FD3-4698-9F79-2CF7CE62DA07},1"},"revisions":{"{D2AE8403-7FD3-4698-9F79-2CF7CE62DA07},1":{"roots":{"1":"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},10","2":"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},11"},"nodes":{"{00692503-C98D-0C52-0CB9-2A6BAB823D3F},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image role background=true, printout=false","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"bfe60ae49fb6f04883d33ecd8efdef25"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"309ee505a73ddd01"}}]]},"{55E3FF24-7E1D-0F42-23B1-81B1BC73AC59},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Task controls","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"2c397b9ccaf0174f8e0de3924a07a9cc"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"70e06508a73ddd01"}}]]},"{D758D02C-939D-0436-2B88-5D69F373D94C},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image role background=false, printout=false","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"4aaca0cb7a7d20408ef1364bff9db55e"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"e0efa205a73ddd01"}}]]},"{B524AF31-411C-0A4A-051D-52504914E69E},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image bmp","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"5063cc1a333b1c48bc4b683d66175a9e"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"e0a22304a73ddd01"}}]]},"{1C167C3B-78B8-046E-2BBA-BABEB46E392F},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image jpg","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"d0ef0c224100fa43963c22b59e48a339"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"f021c203a73ddd01"}}]]},"{D393D154-04C6-0F8D-03D1-6F43187067F9},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image gif","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"df318a66c286084b9e283696297e82be"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"601d1405a73ddd01"}}]]},"{6DBAC757-58A7-0CB4-0422-5CE8CFA09158},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Files and recording","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"5bf9f2a7bf7777439427d892fc03e7b1"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"60888e06a73ddd01"}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},10":{"jcid":393223,"children":["{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},12","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},13","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},14","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},15","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},16","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},17","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},18","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},19","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},20","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},21","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},22","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},23","{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},24"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"d2e32f46a8d9444ebf84d4dbe59aa72e"}},{"id":402660453,"value":{"Bytes":"50201f02a73ddd01"}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":11451025},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},12":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{5C7182D4-71B3-4966-9633-B35041C4081C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"0eb588c4eff5094892fba535cd437edb"}},{"id":402660453,"value":{"Bytes":"e0a8ab02a73ddd01"}},{"id":603993154,"value":{"Objects":["{7ED942E5-47B3-0B88-2127-64FC9BE03DF4},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},13":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{3EBEBC0A-4EB8-4680-9CAE-6D126E4A0CC7},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"b31d0155dd8b8e4e88b28f62c287257e"}},{"id":402660453,"value":{"Bytes":"f021c203a73ddd01"}},{"id":603993154,"value":{"Objects":["{1C167C3B-78B8-046E-2BBA-BABEB46E392F},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},14":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{978C6F00-771C-48A4-B209-85FC9330D376},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"725aff9281ad4d45883241d8b169f212"}},{"id":402660453,"value":{"Bytes":"8002ed03a73ddd01"}},{"id":603993154,"value":{"Objects":["{B524AF31-411C-0A4A-051D-52504914E69E},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},15":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{38F51AA4-F561-4263-8DFE-69F99A053AC5},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"31ff287e2fb8634fbb516cf646ebd220"}},{"id":402660453,"value":{"Bytes":"10a97404a73ddd01"}},{"id":603993154,"value":{"Objects":["{1A5DDA95-C361-008D-3AEA-BE5540210F2D},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},16":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{F13B1165-32C6-4D63-B4C5-B8EFC2545211},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"55df8c37699cdd4cbe4f0e9ad1cb5686"}},{"id":402660453,"value":{"Bytes":"601d1405a73ddd01"}},{"id":603993154,"value":{"Objects":["{D393D154-04C6-0F8D-03D1-6F43187067F9},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},17":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{F5F0101D-A59D-46D8-9C9C-8AC52957ECA4},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"dd1e38d9be7f7b4a833d6e399f49c259"}},{"id":402660453,"value":{"Bytes":"e07ea005a73ddd01"}},{"id":603993154,"value":{"Objects":["{D758D02C-939D-0436-2B88-5D69F373D94C},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},18":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{22C1E532-FF8D-4EBC-BBAD-FDC771A608D7},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"7bbaee63c803364eb7a6ed17b2658fb9"}},{"id":402660453,"value":{"Bytes":"309ee505a73ddd01"}},{"id":603993154,"value":{"Objects":["{00692503-C98D-0C52-0CB9-2A6BAB823D3F},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},19":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{B53E61BD-9917-42C7-BE9D-26C8EC895DE3},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"19112299eacc6f4ca244c389a8cfb228"}},{"id":402660453,"value":{"Bytes":"a0f41906a73ddd01"}},{"id":603993154,"value":{"Objects":["{9796A18C-AF17-0029-0989-F16436AD680B},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},20":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{E715358B-EBCB-4DB5-AB69-94C066A898DC},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"9448a2d1e4eade4d85d4686d878c0214"}},{"id":402660453,"value":{"Bytes":"e0ec5e06a73ddd01"}},{"id":603993154,"value":{"Objects":["{C5BDF5BA-DDCB-0F5B-1C7D-436CBC8CAD34},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},21":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{4F120766-6EA7-4E5A-B336-8B441584A4B0},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"ff168942cb3eee4dbade34d8a8849ae6"}},{"id":402660453,"value":{"Bytes":"60888e06a73ddd01"}},{"id":603993154,"value":{"Objects":["{6DBAC757-58A7-0CB4-0422-5CE8CFA09158},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},22":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{ABA3D98F-BECC-464C-A8CB-B8FB52C392E2},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"b368d1ab3caf1c4fb97638c4bbb13174"}},{"id":402660453,"value":{"Bytes":"20fe0707a73ddd01"}},{"id":603993154,"value":{"Objects":["{890B19BE-88CC-04A2-1FDF-6F5788E7A70A},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},23":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{8F74EF9A-31BF-445D-84C0-93A60D5C1BA7},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"1ccd0215a164394da144df1fca750f21"}},{"id":402660453,"value":{"Bytes":"00c4d407a73ddd01"}},{"id":603993154,"value":{"Objects":["{ADDC2FAB-07BF-06B3-33D4-440AD7782E4F},1"]}}]]},"{665B4D59-0C0D-4B44-850E-9FCA50F44ACD},24":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{774B3F15-481D-4DAC-94A5-561D665799B1},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"c21045c7b83acc49b90979a29e3ebf62"}},{"id":402660453,"value":{"Bytes":"70e06508a73ddd01"}},{"id":603993154,"value":{"Objects":["{55E3FF24-7E1D-0F42-23B1-81B1BC73AC59},1"]}}]]},"{9796A18C-AF17-0029-0989-F16436AD680B},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image role background=false, printout=true","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"4fd875b7fbc3cd4b8adb9b948bd810c4"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"a0f41906a73ddd01"}}]]},"{1A5DDA95-C361-008D-3AEA-BE5540210F2D},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image tiff","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"1f393c98c8fc1c479e07a2c84eab6bd8"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"10a97404a73ddd01"}}]]},"{ADDC2FAB-07BF-06B3-33D4-440AD7782E4F},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Numbering controls","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"efd0711e63e0854880e7d07b3635ceae"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"00c4d407a73ddd01"}}]]},"{C5BDF5BA-DDCB-0F5B-1C7D-436CBC8CAD34},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image role background=true, printout=true","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"aaec0a4cf8ee1647b71d99037847bc12"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"e0ec5e06a73ddd01"}}]]},"{890B19BE-88CC-04A2-1FDF-6F5788E7A70A},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Paragraph controls","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"d8f7afe4d929a342ab66d603d5015ebb"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"a0283507a73ddd01"}}]]},"{7ED942E5-47B3-0B88-2127-64FC9BE03DF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image png","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"f1ad1c438f60494daab03a4959f7cac4"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"e0a8ab02a73ddd01"}}]]}}}}},"{B53E61BD-9917-42C7-BE9D-26C8EC895DE3},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{5703C904-730F-455C-BAA8-B6F1D2FB0660},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{12A46566-5353-4007-A00C-2281EEF3BADA},1"},"revisions":{"{5703C904-730F-455C-BAA8-B6F1D2FB0660},1":{"roots":{"1":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},10","2":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},11","4":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},26"},"nodes":{"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},10":{"jcid":393271,"children":[],"content":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image role background=false, printout=true","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"4fd875b7fbc3cd4b8adb9b948bd810c4"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"a0f41906a73ddd01"}}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},12":{"jcid":393227,"children":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},39","{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},41"],"content":[],"structure":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},13":{"jcid":393260,"children":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},14","{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},14":{"jcid":393228,"children":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},20":{"jcid":393228,"children":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},21","{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},21":{"jcid":393229,"children":[],"content":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},17","latest_author":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},27","extra_set":null}],"paragraph_style":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},24":{"jcid":393229,"children":[],"content":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},17","latest_author":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},27","extra_set":null}],"paragraph_style":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},33":{"jcid":393229,"children":[],"content":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},17","latest_author":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Image role background=false, printout=true","runs":[{"start":0,"end":42,"format":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},38","extra_set":null}],"paragraph_style":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},39":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":36.0,"y":36.0,"max_width":286.56,"max_height":190.56001},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128747,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},40","filename":null,"alt":"Role pattern","picture_width":72.0,"picture_height":48.0,"background":false,"printout":true,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb010000003086c74d139ec244ae8bc4516d2b8c65000000000200000000001066000000010000200000003af5e6042584bbb6d7b2432401acaa4bbf31e2da3e97299ab196e317ea5126f4000000000e800000000200002000000033b6d73fc7620128e759782df06f5393cc0307f33f4a9d0c28245c0ff954b2d720000000a64151834adfdd0963fbc6eb3084c73ecd6f136487f906a265babf9e5919dcf040000000248fd8159557870b2284870d18e8634e352c8d87992506cca9b194e63a436ce5b00127192c93b8d2739f18885c6458ae6a861d343132e11573e3eb55bcb056b9"}},{"id":469769724,"value":{"Bytes":"4b2cb5e4e68a713f4c4074f83bc4a99f105611b9"}},{"id":335551993,"value":{"Bytes":"02000000"}},{"id":2281708733,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769250,"value":{"Bytes":"0000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},40":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[7,152,73,239,100,120,37,76,191,193,55,183,50,251,60,41]},"extension":".png"},"extra":[]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},41":{"jcid":393228,"children":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},42"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":72.0,"y":108.0,"max_width":480.0,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},42":{"jcid":393229,"children":[],"content":["{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},46"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128746,"modified":1473128746,"original_author":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},17","latest_author":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},46":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128746,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Foreground role control","runs":[{"start":0,"end":23,"format":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},27","extra_set":null}],"paragraph_style":"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}},"{12A46566-5353-4007-A00C-2281EEF3BADA},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}},"{5C7182D4-71B3-4966-9633-B35041C4081C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{10D93D65-4605-482C-BA47-26C6F7EDB73D},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{37F604FE-8D16-4032-A5AC-F70AEE7BD3AA},1"},"revisions":{"{10D93D65-4605-482C-BA47-26C6F7EDB73D},1":{"roots":{"1":"{232F27D5-8903-4D80-B56E-6F9929BAA111},10","2":"{232F27D5-8903-4D80-B56E-6F9929BAA111},11","4":"{232F27D5-8903-4D80-B56E-6F9929BAA111},26"},"nodes":{"{232F27D5-8903-4D80-B56E-6F9929BAA111},10":{"jcid":393271,"children":[],"content":["{232F27D5-8903-4D80-B56E-6F9929BAA111},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Image png","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"f1ad1c438f60494daab03a4959f7cac4"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"e0a8ab02a73ddd01"}}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},12":{"jcid":393227,"children":["{232F27D5-8903-4D80-B56E-6F9929BAA111},39"],"content":[],"structure":["{232F27D5-8903-4D80-B56E-6F9929BAA111},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":null,"level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},13":{"jcid":393260,"children":["{232F27D5-8903-4D80-B56E-6F9929BAA111},14","{232F27D5-8903-4D80-B56E-6F9929BAA111},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128740,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},14":{"jcid":393228,"children":["{232F27D5-8903-4D80-B56E-6F9929BAA111},33"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},20":{"jcid":393228,"children":["{232F27D5-8903-4D80-B56E-6F9929BAA111},21","{232F27D5-8903-4D80-B56E-6F9929BAA111},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128740,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},21":{"jcid":393229,"children":[],"content":["{232F27D5-8903-4D80-B56E-6F9929BAA111},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128740,"modified":1473128740,"original_author":"{232F27D5-8903-4D80-B56E-6F9929BAA111},17","latest_author":"{232F27D5-8903-4D80-B56E-6F9929BAA111},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128740,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{232F27D5-8903-4D80-B56E-6F9929BAA111},27","extra_set":null}],"paragraph_style":"{232F27D5-8903-4D80-B56E-6F9929BAA111},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},24":{"jcid":393229,"children":[],"content":["{232F27D5-8903-4D80-B56E-6F9929BAA111},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128740,"modified":1473128740,"original_author":"{232F27D5-8903-4D80-B56E-6F9929BAA111},17","latest_author":"{232F27D5-8903-4D80-B56E-6F9929BAA111},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128740,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"7:25 PM","runs":[{"start":0,"end":7,"format":"{232F27D5-8903-4D80-B56E-6F9929BAA111},27","extra_set":null}],"paragraph_style":"{232F27D5-8903-4D80-B56E-6F9929BAA111},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":null},"extra":[[]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},33":{"jcid":393229,"children":[],"content":["{232F27D5-8903-4D80-B56E-6F9929BAA111},37"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473128742,"modified":1473128742,"original_author":"{232F27D5-8903-4D80-B56E-6F9929BAA111},17","latest_author":"{232F27D5-8903-4D80-B56E-6F9929BAA111},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},37":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Image png","runs":[{"start":0,"end":9,"format":"{232F27D5-8903-4D80-B56E-6F9929BAA111},38","extra_set":null}],"paragraph_style":"{232F27D5-8903-4D80-B56E-6F9929BAA111},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":2281708724,"value":"NoData"}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},38":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":null,"font_size":17.0,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},39":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":72.0,"y":108.0,"max_width":144.0,"max_height":48.000008},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473128742,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{232F27D5-8903-4D80-B56E-6F9929BAA111},40","filename":null,"alt":"Pattern png","picture_width":72.0,"picture_height":48.0,"background":false,"printout":false,"link":"https://example.invalid/image/png"},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb010000003086c74d139ec244ae8bc4516d2b8c6500000000020000000000106600000001000020000000f5fbf8658a45bede4756b4f1f553f51ba1bedb3a7faaab7a13958ff597b5b06c000000000e8000000002000020000000a2aaef0f5bc57890f7a598f2bae4d2335f1207531bf8bd2cc32d0d488e1975bb2000000056a1a3b1ee3b272497ef3cb53b8fc61808e557a21a1fea7cf478cedcb7a084b74000000039740dbcaafd9b50569d90388f7878700e0419a5fb0e969c73fe23f83a7daba5c4760fbfc34edc91f1100a29f56c5bdc80043fc28005dc8a9a6913cabda4bc1b"}},{"id":469769724,"value":{"Bytes":"4b2cb5e4e68a713f4c4074f83bc4a99f105611b9"}},{"id":2281709006,"value":"NoData"},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":2281708733,"value":"NoData"},{"id":2281709036,"value":"NoData"}]]},"{232F27D5-8903-4D80-B56E-6F9929BAA111},40":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[7,152,73,239,100,120,37,76,191,193,55,183,50,251,60,41]},"extension":".png"},"extra":[]}}},"{37F604FE-8D16-4032-A5AC-F70AEE7BD3AA},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"math":null,"embedded_object":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/native-expanded-control-ui-01/model/text.json b/corpus/m6/native-expanded-control-ui-01/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..56931bff634828cf9233fb28d3944c33a860e51f --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/model/text.json @@ -0,0 +1 @@ +{"{978C6F00-771C-48A4-B209-85FC9330D376},1":{"{C074D235-5F66-44F7-95FA-B83852FB27FE},1":{"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C6C82BAE-DE18-4FF3-A9A8-96EA7DA85C27},37":[{"text":"Image bmp","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{533C39B0-FBAD-4895-9E24-AD9B23BC5F4B},1":{}},"{3EBEBC0A-4EB8-4680-9CAE-6D126E4A0CC7},1":{"{4B7C7101-699A-4DBD-8B5D-703A463A0590},1":{},"{70F926CC-F9D0-40E9-BA9E-C61949F36760},1":{"{E0831A25-B965-4E65-A2DD-FFD6A6045736},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{E0831A25-B965-4E65-A2DD-FFD6A6045736},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{E0831A25-B965-4E65-A2DD-FFD6A6045736},37":[{"text":"Image jpg","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{774B3F15-481D-4DAC-94A5-561D665799B1},1":{"{4A009430-74D8-49A2-BDD0-0FFEDC139370},1":{},"{41CB75DE-5BFA-4D09-8B75-968E378FC588},1":{"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},37":[{"text":"Task controls","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{25BDF88B-26C4-4598-B0DB-09AED4C73EA5},44":[{"text":"Disabled standalone task","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{F5F0101D-A59D-46D8-9C9C-8AC52957ECA4},1":{"{F3271F93-A232-41C7-93C8-2161BEC42628},1":{},"{BD4C28C2-15B2-46BC-B7D5-828916DFC55A},1":{"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},37":[{"text":"Image role background=false, printout=false","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C7275DDA-7E57-4706-BA71-E96C8AC93C16},46":[{"text":"Foreground role control","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{22C1E532-FF8D-4EBC-BBAD-FDC771A608D7},1":{"{F7C7A401-F29E-4394-A2CE-3C3A4F48209B},1":{},"{0C387409-9538-42F1-BF47-A0499D7D5FA8},1":{"{E47C60BE-AF76-43E8-8937-2F36F60E114C},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{E47C60BE-AF76-43E8-8937-2F36F60E114C},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{E47C60BE-AF76-43E8-8937-2F36F60E114C},37":[{"text":"Image role background=true, printout=false","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{E47C60BE-AF76-43E8-8937-2F36F60E114C},46":[{"text":"Foreground role control","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{F13B1165-32C6-4D63-B4C5-B8EFC2545211},1":{"{BA226054-F35E-4372-B591-5B02B2E6CC11},1":{"{8A6E1954-54EC-4890-A363-2CD23263DB72},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{8A6E1954-54EC-4890-A363-2CD23263DB72},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{8A6E1954-54EC-4890-A363-2CD23263DB72},37":[{"text":"Image gif","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{CD35F978-C249-4837-9D54-000183B276F6},1":{}},"{4F120766-6EA7-4E5A-B336-8B441584A4B0},1":{"{A26A8B36-5C5A-4EF0-8A4A-F5875125FBC8},1":{"{55083EE2-B644-4097-A02A-19F56E6362C7},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{55083EE2-B644-4097-A02A-19F56E6362C7},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{55083EE2-B644-4097-A02A-19F56E6362C7},37":[{"text":"Files and recording","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{55083EE2-B644-4097-A02A-19F56E6362C7},52":[{"text":"Recording annotation","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{54CC6F65-B9D8-4A2D-BF14-F50D0AC5B37B},1":{}},"{E715358B-EBCB-4DB5-AB69-94C066A898DC},1":{"{065F701A-0718-4CD5-9984-DF8F477C196C},1":{},"{CE82D8C2-54BF-48FB-9931-3CF1C4C49D6A},1":{"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},37":[{"text":"Image role background=true, printout=true","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{08DA89CE-DB98-47B8-8A71-8DB27509F71B},46":[{"text":"Foreground role control","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{ABA3D98F-BECC-464C-A8CB-B8FB52C392E2},1":{"{8EC9CE4B-8F17-43E2-A1DE-7A1BB39701BC},1":{"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},37":[{"text":"Paragraph controls","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},44":[{"text":"Inherited strike and spacing","format":{"bold":false,"italic":false,"underline":false,"strike":true,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":14.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":9.0,"space_after":4.5,"line_spacing":null},"link":null}],"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},51":[{"text":"Centered paragraph","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":1,"rtl":null,"space_before":12.0,"space_after":6.0,"line_spacing":0.0},"link":null}],"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},56":[{"text":"مرحبا بالعالم","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Arial","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1025,"alignment":2,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},62":[{"text":"Collapsed parent","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},67":[{"text":"Hidden child remains stored","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},72":[{"text":"Grandchild","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{EE75F7DA-F99A-4532-8C76-63AB9B8CEC69},77":[{"text":"AB        C","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{765EC190-2698-4D0D-9BE4-176915F0525E},1":{}},"{8F74EF9A-31BF-445D-84C0-93A60D5C1BA7},1":{"{937D4936-B04B-4DEC-BA33-575B74F07469},1":{},"{CD7B9DD7-3E2B-4718-A3C0-F5B0F3438380},1":{"{CA4801D9-2718-46A8-B58F-BD356DEA0174},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},37":[{"text":"Numbering controls","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},44":[{"text":"Sequence 0, item 0","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},50":[{"text":"Sequence 0, item 1","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},56":[{"text":"Sequence 1, item 0","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},62":[{"text":"Sequence 1, item 1","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},68":[{"text":"Sequence 2, item 0","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},74":[{"text":"Sequence 2, item 1","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},80":[{"text":"Sequence 3, item 0","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},86":[{"text":"Sequence 3, item 1","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},92":[{"text":"Sequence 4, item 0","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{CA4801D9-2718-46A8-B58F-BD356DEA0174},98":[{"text":"Sequence 4, item 1","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]}},"{38F51AA4-F561-4263-8DFE-69F99A053AC5},1":{"{06BD3755-EF72-4542-890A-E865C245F2C3},1":{"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{7B75ECDB-DA25-4E7C-B7A0-65CA43DA9C00},37":[{"text":"Image tiff","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{1E3F8BE5-DA93-4736-B999-5A89E1A42BEE},1":{}},"{5FBAB4A8-F2EB-4D9C-892F-64D03C6D5C0C},1":{"{D2AE8403-7FD3-4698-9F79-2CF7CE62DA07},1":{}},"{B53E61BD-9917-42C7-BE9D-26C8EC895DE3},1":{"{5703C904-730F-455C-BAA8-B6F1D2FB0660},1":{"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},37":[{"text":"Image role background=false, printout=true","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{D05ED09F-AC19-4A7B-9D2B-7B5381E0E499},46":[{"text":"Foreground role control","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{12A46566-5353-4007-A00C-2281EEF3BADA},1":{}},"{5C7182D4-71B3-4966-9633-B35041C4081C},1":{"{10D93D65-4605-482C-BA47-26C6F7EDB73D},1":{"{232F27D5-8903-4D80-B56E-6F9929BAA111},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{232F27D5-8903-4D80-B56E-6F9929BAA111},25":[{"text":"7:25 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{232F27D5-8903-4D80-B56E-6F9929BAA111},37":[{"text":"Image png","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"math":false,"embedded_object":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{37F604FE-8D16-4032-A5AC-F70AEE7BD3AA},1":{}}} \ No newline at end of file diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/Empty.one b/corpus/m6/native-expanded-control-ui-01/notebook/Empty.one new file mode 100644 index 0000000000000000000000000000000000000000..a4b1251f3d66bcd7c58bb49839082be7f8d348a5 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/Empty.one differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/Features.one b/corpus/m6/native-expanded-control-ui-01/notebook/Features.one new file mode 100644 index 0000000000000000000000000000000000000000..9ff7c3c8a71557d322f80b1336c7484c20fe25ef Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/Features.one differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/Group A/Duplicate.one b/corpus/m6/native-expanded-control-ui-01/notebook/Group A/Duplicate.one new file mode 100644 index 0000000000000000000000000000000000000000..6687d7a552e7054af2dcb9e6adcd41dd158210db Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/Group A/Duplicate.one differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/Group A/Open Notebook.onetoc2 b/corpus/m6/native-expanded-control-ui-01/notebook/Group A/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..e3eb690e5b29e3c79ef46ead9727827143802024 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/Group A/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/Group B/Nested/Duplicate.one b/corpus/m6/native-expanded-control-ui-01/notebook/Group B/Nested/Duplicate.one new file mode 100644 index 0000000000000000000000000000000000000000..8fe7d5960c7df1b1a50bbd97fff7374dba2b64bb Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/Group B/Nested/Duplicate.one differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/Group B/Nested/Open Notebook.onetoc2 b/corpus/m6/native-expanded-control-ui-01/notebook/Group B/Nested/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..f29696488a6dffa27deb01e77fa60d41987d41d9 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/Group B/Nested/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/Group B/Open Notebook.onetoc2 b/corpus/m6/native-expanded-control-ui-01/notebook/Group B/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..bbb2ebe0fafacfee8a7e7e7f798012ea9eb6171b Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/Group B/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/Open Notebook.onetoc2 b/corpus/m6/native-expanded-control-ui-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..55b1d2a96ef4e952bbeb0628401b622064e4c6b0 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/Open Notebook.onetoc2 b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..308d2b40b6fb4e53a4c27657fcef9b62ee1e00b5 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/attachment.txt b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/attachment.txt new file mode 100644 index 0000000000000000000000000000000000000000..a959c053358a06abc072d3492e7a86d2e712d804 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/attachment.txt differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.bmp b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eab3975a924ce23658c2cd72ca3725b2d3ce3449 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.bmp differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.gif b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b0069028a8c88f3b11d6bd7f2a7588fa0fdfb8a Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.gif differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.jpg b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2d4cb0f5ca8f87d6ee3a740929637004f92ec63 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.jpg differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.png b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..185512b97148b00cd95c7571321a76ce80cc6205 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.png differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.tiff b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.tiff new file mode 100644 index 0000000000000000000000000000000000000000..cd2a1ff44360f3e5b281cff0a23e5f1da6a0262c Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/pattern.tiff differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/silence.wav b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/silence.wav new file mode 100644 index 0000000000000000000000000000000000000000..96260477f0ca60b1605e2971d8cdc146b8b4e02b Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/fixture-data/silence.wav differ diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/fixture.json b/corpus/m6/native-expanded-control-ui-01/notebook/fixture.json new file mode 100644 index 0000000000000000000000000000000000000000..8958eecf4411591c28ed38f148ad5f7ead182cab --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/notebook/fixture.json @@ -0,0 +1,86 @@ +{ + "sections": [ + "Features.one", + "Group A/Duplicate.one", + "Group B/Nested/Duplicate.one", + "Empty.one" + ], + "pages": [ + { + "section": "Features.one", + "xml": "Image png" + }, + { + "section": "Features.one", + "xml": "Image jpg" + }, + { + "section": "Features.one", + "xml": "Image bmp" + }, + { + "section": "Features.one", + "xml": "Image tiff" + }, + { + "section": "Features.one", + "xml": "Image gif" + }, + { + "section": "Features.one", + "xml": "Image role background=false, printout=falseForeground role control" + }, + { + "section": "Features.one", + "xml": "Image role background=true, printout=falseForeground role control" + }, + { + "section": "Features.one", + "xml": "Image role background=false, printout=trueForeground role control" + }, + { + "section": "Features.one", + "xml": "Image role background=true, printout=trueForeground role control" + }, + { + "section": "Features.one", + "xml": "Files and recordingRecording annotation" + }, + { + "section": "Features.one", + "xml": "Paragraph controlsInherited strike and spacingCentered paragraphمرحبا بالعالمCollapsed parentHidden child remains storedGrandchild
B        C]]>
" + }, + { + "section": "Features.one", + "xml": "Numbering controlsSequence 0, item 0Sequence 0, item 1Sequence 1, item 0Sequence 1, item 1Sequence 2, item 0Sequence 2, item 1Sequence 3, item 0Sequence 3, item 1Sequence 4, item 0Sequence 4, item 1" + }, + { + "section": "Features.one", + "xml": "Task controlsDisabled standalone task" + }, + { + "section": "Group A/Duplicate.one", + "xml": "Repeated titleGroup path Group A/Duplicate.one, level 1" + }, + { + "section": "Group A/Duplicate.one", + "xml": "Repeated titleGroup path Group A/Duplicate.one, level 2" + }, + { + "section": "Group A/Duplicate.one", + "xml": "Repeated titleGroup path Group A/Duplicate.one, level 3" + }, + { + "section": "Group B/Nested/Duplicate.one", + "xml": "Repeated titleGroup path Group B/Nested/Duplicate.one, level 1" + }, + { + "section": "Group B/Nested/Duplicate.one", + "xml": "Repeated titleGroup path Group B/Nested/Duplicate.one, level 2" + }, + { + "section": "Group B/Nested/Duplicate.one", + "xml": "Repeated titleGroup path Group B/Nested/Duplicate.one, level 3" + } + ] +} \ No newline at end of file diff --git a/corpus/m6/native-expanded-control-ui-01/notebook/synthetic.one b/corpus/m6/native-expanded-control-ui-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..b7614a47dce6dcb02ff9a02e06ea94e75a7ad3b1 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/notebook/synthetic.one differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment b/corpus/m6/native-expanded-control-ui-01/read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment new file mode 100644 index 0000000000000000000000000000000000000000..a959c053358a06abc072d3492e7a86d2e712d804 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment b/corpus/m6/native-expanded-control-ui-01/read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment new file mode 100644 index 0000000000000000000000000000000000000000..96260477f0ca60b1605e2971d8cdc146b8b4e02b Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/environment.json b/corpus/m6/native-expanded-control-ui-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..c5639d068138e18a06aea24d38e119f0440b5e2f --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-DB65123D", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-expanded-control-ui-01/read/hierarchy.xml b/corpus/m6/native-expanded-control-ui-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..db43475ddfa13cf6caac609147caf03513b289bc --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-000.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a7d832df2da70fe3b287c085d1e4a7f11be17777 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-000.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-000.xml b/corpus/m6/native-expanded-control-ui-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..b2deb71faff5130a73c043b7ffa0d76df3b6658b --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-001.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..02ed6b6bc5c0580bd9cd39aeb8091d3836338267 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-001.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-001.xml b/corpus/m6/native-expanded-control-ui-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..3db673f0a83d6f1e9e9d71ccc8a8ab01720b4342 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-001.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-002.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-002.pdf new file mode 100644 index 0000000000000000000000000000000000000000..da0f14035c7cda10e92b9f3c108e58ceaa8fcfc4 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-002.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-002.xml b/corpus/m6/native-expanded-control-ui-01/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..b49908c644b0c911e859aa58df8847565d0de425 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-002.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-003.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-003.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f07443e525092d9968dfce533e2c692c4b0dd3c9 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-003.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-003.xml b/corpus/m6/native-expanded-control-ui-01/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..f198e8a489c228e156bdc05e79fc7463807f2f59 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-003.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-004.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-004.pdf new file mode 100644 index 0000000000000000000000000000000000000000..25cd78c8abc3db1be45fdd10492b9ea5dc9487cb Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-004.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-004.xml b/corpus/m6/native-expanded-control-ui-01/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..555a0bce3585b11f169ec24a08a74cf80f5a7cf9 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-004.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-005.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-005.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a8d38d0848719132689eafbd61e903fb14dc89df Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-005.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-005.xml b/corpus/m6/native-expanded-control-ui-01/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..fff5b6cf0dbe0dae9ad1fc19ba6a07ea0b06e775 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-005.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-006.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-006.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d49d4f8652c13a54a7d3e7130bef180179a0b476 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-006.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-006.xml b/corpus/m6/native-expanded-control-ui-01/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..2c7bcd2aba06e87454e5a0391b838c6ee6e39f52 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-006.xml @@ -0,0 +1,300 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAEImSURBVHheDbiBV2GL+v+/f9V1q+uk46TjpDFp +TBqDMUhoh3Zoh3Zoh3Zoh3YYgzE0Jo1J46TjpOOk61Yf32pZ1bKqZVXLqpZV/W2/8y8863nez/v1 +AgAAaAL+vxagiQQ0twIt7cC/yACpA/h3J9BKBdq6gPZu4D90gNwD/NQLdDABSh/Q2Q/8zAaoA8Av +g0AXF6DxgG4B8KsQoIuA3yRAjxRgyIBeBfACBJhK4KUa6IMAlgbo1wGvYICtB14bgQEE4JiAQQvw +BgW4VuCtHeBhAN8BCFzAOxwQuoH3XkBEAGIfIAkAQ0FAGgKGI4AsCshjgGIFGEkA4CowugYoU4Bq +HVBvAGMZANoExrcATQ7QbgO6HWCiAMC7wOQeoC8Bhn3AeAhMlQHkCJg+AUwVwHwKWM6BmSqAXgCz +V4C1BtiuAfstMFcHsDtg/gFwNADnI+B6BhYAoPn/a2puamluJjW3tDb/q72ZRG7+d0dza2dzG7W5 +vav5P93NZHrzTz3NHb3NFGZzZ1/zz/3NVHbzLwPNXYPNNG5zN6/5V0EzXdj8m6i5R9LMkDb3yppf +KJqZYPNLZXOfupkFNfdrml/pmtlw82t984CxmYM0D5qa31iauWjzW2szz97Mx5oFjuZ3rmYh3vze +3SzyNouJZomveSjQLA02D4eaZZFmebRZEWseWWkGE82jq83KtWZVqlm93jy20Qxlmsc3mzVbzdpc +s267eWKnGS40T+426/eaDaVm437z1GEzUm6ePmo2nTSbK82W0+aZ82a02jx70Wy9arbVmu3XzXO3 +zVi9ef6u2fHQ7Gw0ux6bF56bcQAgNTX9MxtSC4n0r1YSqZ30bzKptYPU1klqp5L+00Uid5N+opM6 +ekiUXlInk/RzH4naT/qFTeoaINEGSd1c0q88El1A+k1I6hGRGBJSr5T0QkZiKkgvQVKfksRSk/oh +0isNia0jvYZJA3oSx0gaREhvTCSuhfQWJfGsJL6dJMBI7xwkoYv0HieJ3CSxlyQhSEM+kjRAGg6S +ZCGSPEJSREkjMRK4QhpNkJSrJNUaSZ0ija2ToA3SeIak2SRpt0i6HGlimwTvkCYLJP0uybBHMpZI +U/sk5JA0XSaZjkjmE5KlQpo5JaHnpNkqyXpBsl2R7DXS3DUJuyXN10mOO5LzgeRqkBYeSfgzaREA +2pqb2lpa2v5FaiO1tv27va2V3NbW0dbe2fYfahu5q+2n7rYOehulp62zt+1nZhu1r+2X/rYudhtt +oK17sO1Xbhud1/aboK1H2MYQtfVK2l5I25iytpeKtj6wjaVs61e3vYLa2Jq217q2AbiNo28bNLa9 +Qdq4pra3ljYe2sa3tgnsbe+wNqGj7b2rTYS3id1tEm/bENEm9bUNB9pkwTZ5qE0RaRuJtoGxttGV +NmWiTbXapl5rG0u1Qett4xttmkybdrNNt9U2kWuDt9smd9r0hTbDbptxr22q1Ibst00ftpnKbeaj +NstJ20ylDT1tmz1vs1bbbBdt9qu2uVobdt02f9vmqLc579pcD20LjTb8sW3xuc0NAOSWJvK/Wsgk +EvnfreTWdnIbmdzeQf5PJ5lMJf/URe7oJlPo5M4e8s+9ZCqT/EsfuaufTGOTuwfIvw6S6Vzybzxy +j4DMEJJ7ReQXEjJTSn4pI/cpyCyQ3K8kv1KT2RD5tYY8oCNzYPKgnvzGSOYi5LcmMs9C5qNkgZX8 +zk4WYuT3DrLIRRbjZImbPOQlSwnysI8sC5DlQbIiRB6JkMEoeTRGVq6QVQmyepU8tkaGUuTxdbJm +g6zNkHWb5IktMpwjT26T9TtkQ4Fs3CVP7ZGREnl6n2w6JJvLZMsReeaEjFbIs6dk6znZViXbL8hz +V2SsRp6/Jjtuyc462XVHXngg4w3y4iPZ/Uz2AADlX00UUgvl3yRKayulrZ3STqb8p4NC7qT8RKV0 +dFEo3ZROOuXnHgq1l/ILk9LVR6H1U7rZlF8HKPRBym9cSg+PwhBQeoWUFyIKU0J5KaX0ySgsBaUf +pLxSUthqymuIMqChcHSUQZjyRk/hGilvEQrPROFbKAKU8s5KEdop7zGKyEERuygSnDLkpki9lGGC +IvNR5AGKIkgZCVHACGU0SlHGKKoVijpBGVulQGuU8RRFs07RblB0GcrEJgXeokzmKPptimGHYixQ +pnYpyB5lukQx7VPMhxRLmTJzREFPKLMVivWUYjun2KuUuQsKdkWZr1Ec1xTnLcVVpyzcUfAHymKD +4n6keJ4pXgCgkpqo/26htpKoba3U9nbqf/7ZnA7qT53UDiqV0kXt7Kb+TKdSe6i/9FK7mFRaH7W7 +n/orm0ofoP42SO3hUhk8aq+A+kJIZYqoLyXUPimVJaP2K6ivQCpbSX2tpg5AVI6GOqijvoGpXD31 +rZHKQ6h8E1Vgob5DqUIr9b2dKsKoYgdV4qIO4VSpmzrspcoIqtxHVQSoI0EqGKKORqjKKFUVo6pX +qGMJKrRKHV+jalJU7TpVt0GdyFDhTerkFlWfoxq2qcYd6lSBiuxSp/eophLVvE+1HFJnylT0iDp7 +QrVWqLZTqv2cOlelYhfU+Suqo0Z1XlNdt9SFOhW/oy4+UN0NqueR6n2mLgEA7d9NtNYWWhuJ1t5K ++087jUym/dRB6+ikUai0zi7az900Kp32Sw+tq5dGY9K6+2i/9tPobNpvA7SeQRqDS+vl0V4IaEwh +7aWI1iehsaS0fhntlYLGBmmvlbQBNY0D0QY1tDc6GhemvdXTeEYaH6EJTLR3FpoQpb230kR2mhij +SRy0IRdNitOG3TSZlyYnaAofbSRAA4O00RBNGaGpojR1jDa2QoMStPFVmmaNpk3RdOu0iQ0anKFN +btL0WzRDjmbcpk3t0JACbXqXZtqjmUs0yz5t5pCGlmmzRzTrCc1WodlPaXPnNKxKm7+gOa5ozhrN +dU1buKXhddriHc39QPM0aN5H2tIzjQAAemsTva2F3k6i/6eVTm6n/0Smd3TQ/7mrTir95y46tZv+ +C53e1UOn9dK7mfRf++j0fvpvbHrPAJ0xSO/l0l/w6EwB/aWQ3ieisyT0fin9lYzOVtBfg/QBJZ2j +pg9C9DcaOldHfwvTeXo630gXIPR3JrrQQn+P0kVWuthOl2D0IQdd6qIP43SZmy730hUEfcRHBwP0 +0SBdGaKrInR1lD4Wo0Mr9PEEXbNK167RdSn6xDod3qBPZuj6Tbphi27M0ae26cgOfbpAN+3SzXt0 +S4k+s09HD+mzZbr1iG47odsr9LlTOnZOn6/SHRd05xXdVaMvXNPxW/pine6+o3se6N4GfemRTjzT +lwGA0dbEaG9h/IfEILcyfmpndJAZlA5GZyfjZyqD2sX4pZvRRWfQehjdvYxfmQx6H+O3fkYPm8EY +YPQOMl5wGUwe46WA0SdksESMfgnjlZTBljFeKxgDIIOjZAyqGW8gBlfDeKtj8GAGX88QGBnvEIbQ +xHhvYYhQhtjKkNgZQxhD6mAMuxgynCF3MxRexgjBAH2M0QBDGWSoQgx1hDEWZUAxxvgKQ5NgaFcZ +ujXGRIoBrzMmNxj6DMOwyTBuMaZyDGSbMb3DMBUY5l2GZY8xU2Kg+4zZQ4a1zLAdMewnjLkKAztl +zJ8zHFWG84LhumIs1Bj4NWPxluGuMzx3DO8DY6nBIB4Zy88MHwAw25uY/2lhkknMn1qZHe1MCpnZ +2cH8uZNJpTJ/6WJ2dTNpdGZ3D/PXXiadyfytj9nTz2Swmb0DzBeDTCaX+ZLH7BMwWUJmv4j5SsJk +S5mvZcwBBZMDMgeVzDdqJhdivtUweTomH2YK9Mx3RqYQYb43MUUWphhlSqzMITtTijGHHUyZiynH +mQo3c8TLBAnmqI+pDDBVQaY6xByLMKEoczzG1KwwtQmmbpU5scaEU8zJdaZ+g2nIMI2bzKktJpJj +Tm8zTTtMc4Fp2WXO7DHREnN2n2k9ZNrKTPsRc+6EiVWY86dMxznTWWW6LpgLV0y8xly8ZrpvmZ46 +03vHXHpgEg3m8iPT98z0AwDrP00scgvrJxKro5VFaWd1klk/d7ConaxfqKyuLhatm9VNZ/3aw6L3 +sn5jsnr6WIx+Vi+b9WKAxRxkveSy+ngsloDVL2S9ErHYEtZrKWtAxuIoWIMg642SxVWz3kIsnobF +17EEMOudniU0st4jLJGJJbawJChryMqS2lnDGEvmYMldLAXOGnGzQC9rlGApfSxVgKUOssZCLCjC +Go+yNDGWdoWlS7AmVlnwGmsyxdKvswwbLGOGNbXJQrZY0zmWaZtl3mFZCqyZXRa6x5otsaz7LNsh +y15mzR2xsBPWfIXlOGU5z1muKmvhgoVfsRZrLPc1y3PL8tZZS3cs4oG13GD5Hln+Z1YAANjkJvZP +LewOEpvSyu5sZ/9MZlM72L90sruobFoXu7ub/Sv9n8hh/9bL7mGyGX3s3n72CzabOcB+Ocju47JZ +PHa/gP1KyGaL2K8l7AEpmyNjDyrYb0A2V8l+q2bzIDZfwxbo2O9gtlDPfm9kixC22MSWWNhDKFtq +ZQ/b2TKMLXewFS72CM4G3exRL1tJsFU+tjrAHguyoRB7PMLWRNnaGFu3wp5IsOFV9uQaW59iG9bZ +xg32VIaNbLKnt9imHNu8zbbssGcKbHSXPbvHtpbYtn22/ZA9V2ZjR+z5E7ajwnaesl3n7IUqG79g +L16x3TW255rtvWUv1dnEHXv5ge1rsP2P7MAz+wMAcH5q4nS0cCgkTmcr5+d2DpXM+aWD09XJoVE5 +3V2cX7s5dDrntx5OTy+HweT09nFe9HOYbM7LAU7fIIfF5fTzOK8EHLaQ81rEGZBwOFLOoIzzRsHh +gpy3Sg5PzeFDHIGG807HEcKc93qOyMgRIxyJiTNk4UhRzrCVI7Nz5BhH4eCMuDggzhl1c5Rejorg +qH2csQAHCnLGQxxNhKONcnQxzsQKB05wJlc5+jWOIcUxrnOmNjhIhjO9yTFtccw5jmWbM7PDQQuc +2V2OdY9jK3Hs+5y5Qw5W5swfcRwnHGeF4zrlLJxz8Cpn8YLjvuJ4ahzvNWfplkPUOct3HN8Dx9/g +BB45H545QQDgdjRxKS3cThL351YutZ37C5nb1cGldXK7qdxfu7j0bu5vdG5PD5fRy+1lcl/0cZn9 +3Jdsbt8AlzXI7edyX/G4bAH3tZA7IOJyJNxBKfeNjMtVcN+CXJ6Sy1dzBRD3nYYr1HHfw1yRnis2 +ciUId8jElVq4wyhXZuXK7VwFxh1xcEEXdxTnKt1clZerJrhjPi4U4I4HuZoQVxvh6qLciRgXXuFO +Jrj6Va5hjWtMcafWucgGdzrDNW1yzVtcS447s81Fd7izBa51l2vb49pL3Ll9LnbInS9zHUdc5wnX +VeEunHLxc+5ileu+4HquuN4ad+maS9xyl+tc3x3X/8ANNLgfHrnBZ+5HAOBTmvidLfyfSXxqK/+X +dn4XmU/r4Hd38n+l8uld/N+6+T10PqOH39vLf8HkM/v4L/v5fWw+a4DfP8h/xeWzefzXAv6AkM8R +8Qcl/DdSPlfGf6vg80A+X8kXqPnvIL5Qw3+v44tgvljPlxj5QwhfauIPW/gylC+38hV2/gjGBx38 +URdfifNVbr7ayx8j+JCPPx7ga4J8bYivi/Anonw4xp9c4esTfMMq37jGn0rxkXX+9AbflOGbN/mW +Lf5Mjo9u82d3+NYC37bLt+/x50p8bJ8/f8h3lPnOI77rhL9Q4eOn/MVzvrvK91zwvVf8pRqfuOYv +3/J9db7/jh944H9o8IOP/I/P/BAACDubhD+3CKkk4S+twq52IY0s7O4Q/toppFOFv3UJe7qFDLqw +t0f4olfIZApf9gn7/glktrB/QPhqUMjmCl/zhAMCIUcoHBQJ30iEXKnwrUzIUwj5oFCgFL5TC4WQ +8L1GKNIJxbBQohcOGYVSRDhsEsosQjkqVFiFI3YhiAlHHUKlS6jChWq3cMwrhAjhuE+oCQi1QaEu +JJyICOGocDIm1K8IDQmhcVU4tSZEUsLpdaFpQ2jOCC2bwpktIZoTzm4LrTtCW0Fo3xXO7QmxknB+ +X+g4FDrLQteRcOFEiFeEi6dC97nQUxV6L4RLV0KiJly+Fvpuhf66MHAn/PAgDDaEHx+FoWdhGADE +PzeJqS3iX0jirlYxrV3cTRb/2iGmd4p/o4p7usSMbnEvXfyiR8zsFb9kivv6xKx+cT9b/GpAzB4U +v+aKB3hijkA8KBS/EYm5EvFbqZgnE/MVYgEofqcUC9Xi95BYpBGLdWIJLB7Si6VG8TAilpnEcotY +gYpHrGLQLh7FxEqHWOUSq3HxmFsMecXjhFjjE2sDYl1QPBESwxHxZFSsj4kNK2JjQjy1KkbWxNMp +sWldbN4QWzLimU0xuiWezYmt22LbjtheEM/tirE98XxJ7NgXOw/FrrJ44UiMn4gXK2L3qdhzLvZW +xUsXYuJKvFwT+67F/ltxoC7+cCcOPog/NsShR3H4WRwBACm1SfpLi7SLJKW1Srvbpb+SpfQO6W+d +0h6qlNEl7e2WvqBLmT3Sl73SPqaU1Sft75e+Ykv/eVevB6UDXCmHJx0USN8IpVyR9K1EypNK+TKp +QCF9B0qFSul7tVQEScUaqUQnHYKlUr102CiVIVK5SaqwSEdQKWiVjtqlSkyqckjVLukYLoXc0nGv +VENItT6pLiCdCErhkHQyItVHpYaY1LginUpIkVXp9JrUlJKa16WWDelMRopuSme3pNac1LYtte9I +5wpSbFc6vyd1lKTOfanrULpQluJH0sUTqbsi9ZxKvefSpaqUuJAuX0l9Nan/Whq4lX6oS4N30o8P +0lBDGn6URp6lnwBA/kuTvKtFTiPJu1vlv7bL6WT5bx3ynk45gyrv7ZK/6JYz6fKXPfK+XjmLKe/v +k7/ql7PZ8tcD8oFBOYcrH+TJ3wjkXKH8rUjOk8j5UrlAJn+nkAtB+XulXKSWiyG5RCMf0smlsHxY +L5cZ5XJErjDJRyxyEJWPWuVKu1yFydUO+ZhLDuHycbdc45VrCbnOJ58IyOGgfDIk10fkhqjcGJNP +rciRhHx6VW5ak5tTcsu6fGZDjmbks5ty65bclpPbt+VzO3KsIJ/flTv25M6S3LUvXziU42X54pHc +fSL3VOTeU/nSuZyoypcv5L4rub8mD1zLP9zKg3X5xzt56EEebsgjj/JPz/IoAIBdTSCtBewmgb+2 +gvR28Dcy2NMBMjrBXir4ogtkdoMv6WBfD8jqBfuZ4Ks+kN0PvmaDAwMgZxAc5IJveCBXAL4VgjwR +yJeAAin4TgYKFeB7EBQpQbEalEDgkAaU6sBhGJTpQbkRVCDgiAkELeAoCiqtoMoOqjFwzAFCLnAc +BzVuUOsFdQQ44QPhADgZBPUh0BABjVFwKgYiK+B0AjStguY10JICZ9ZBdAOczYDWTdC2Bdpz4Nw2 +iO2A8wXQsQs690BXCVzYB/FDcLEMuo9AzwnorYBLpyBxDi5XQd8F6L8CAzXwwzUYvAU/1sHQHRh+ +ACMN8NMjGH0GPwOAitak6m5R/UpS0VtVv7WresgqRoeqt1P1gqpidqledqv66CpWj6q/V/WKqWL3 +qV73qwbYKs6AanBQ9Yar4vJUbwUqnlDFF6kEEtU7qUooU71XqESgSqxUSdSqIUgl1aiGdSoZrJLr +VQqjagRRgSbVqEWlRFUqq0ptV41hKsihGnepNLhK61bpvKoJQgX7VJMBlT6oMoRUxohqKqpCYqrp +FZUpoTKvqixrqpmUCl1XzW6orBmVbVNl31LN5VTYtmp+R+UoqJy7KteeaqGkwvdVi4cqd1nlOVJ5 +T1RLFRVxqlo+V/mqKv+FKnCl+lBTBa9VH29VoboqfKeKPKg+NVTRR9XnZ1UMAKDuJujXFohOgn5r +hXraIQYZ6u2AXnRCTCr0sgvq64ZYdKi/B3rVC7GZ0Os+aKAf4rChwQHozSDE5UJveRBP8M8nhwQi +6J0EEkqh9zJIpIDEICRRQkNqSApBwxpIpoPkMKTQQyNGCESgUROktEAqFFJboTE7BGHQuAPSuCAt +Dunc0IQXgglo0gfpA5AhCBlD0FQEQqLQdAwyrUDmBGRZhWbWIDQFza5D1g3IloHsm9DcFoTloPlt +yLEDOQuQaxda2IPwErS4D7kPIU8Z8h5BSycQUYGWTyHfOeSvQoEL6MMVFKxBH6+h0C0UrkORO+jT +AxRtQJ8fodgzFAcA7a9NWnqL9jeStqdVy2jX9pK1Lzq0zE7tS6q2r0vL6tb207WverTsXu1rpnag +T8vp1w6ytW8GtNxB7VuulsfT8gVagVD7TqQVSrTvpVqRTCtWaCWgdkiplaq1w5BWptHKdVoFrB3R +a0GjdhTRKk1alUWrRrVjVi1k145jWo1Dq3Vpdbh2wq2FvdpJQqv3aQ0BrTGonQppkYh2Oqo1xbTm +Fa0loZ1Z1aJr2tmU1rqutW1o7Rnt3KYW29LO57SOba1zR+sqaBd2tfiedrGkde9rPYdab1m7dKQl +TrTLFa3vVOs/1waq2g8X2uCV9mNNG7rWhm+1kbr20502+qD93NDGHrXxZ+0KAMD0Jvi3FriHBDNa +4d52+AUZZnbALzvhPirM6oL7u+FXdJjdA7/uhQeYMKcPHuyH37Bh7gD8dhDmcWE+DxYI4HdCWCiC +30tgkRQWy2CJAh4CYakSHlbDMgiWa2CFDh6BYVAPjxphJQKrTLDaAo+hMGSFx+2wBoO1Dljngidw +GHbDk15YT8AGH2wMwFNBGAnB0xHYFIXNMdiyAs8kYHQVnl2DrSnYtg7bN+C5DIxtwvNbsCMHO7dh +1w68UIDxXXhxD3aXYM8+7D2El8owcQQvn8C+Cuw/hQPn8IcqHLyAP17BoRocvoYjt/CnOhy9gz8/ +wLEGHH+EV57hLwBg+K3J0NNiYJAMva2GF+0GJtnwssPQ12lgUQ39XYZX3QY23fC6xzDQa+AwDYN9 +hjf9Bi7b8HbAwBs08LkGAc/wTmAQCg3vRQaRxCCWGiQyw5DCIAUNw0qDTG2QQwaFxjCiM4CwYVRv +UBoNKsSgNhnGLAYINYxbDRq7QYsZdA7DhMsA44ZJt0HvNRgIg9FnmAoYkKBhOmQwRQzmqMESM8ys +GNCEYXbVYF0z2FIG+7phbsOAZQzzmwbHlsGZM7i2DQs7BrxgWNw1uPcMnpLBu29YOjQQZcPykcF3 +YvBXDIFTw4dzQ7Bq+HhhCF0ZwjVD5Nrw6dYQrRs+3xliD4Z4w7DyaPjybEgAANLThDBakF4S8qIV +YbYjL8lIXwfC6kT6qcirLoTdjbymIwM9CKcXGWQib/oQbj/ylo3wBhD+ICLgIu94iFCAvBciIhEi +liASKTL0T89RIMMgIlMicjWigJARDQLqkFEYUeoRlRFRI8iYCYEsyDiKaKyI1o7oMGTCgcAuZBJH +9G7E4EWMBDLlQ5AAMh1ETCHEHEEsUWQmhqAryGwCsa4itjXEnkLm1hFsA5nPII5NxLmFuHLIwjaC +7yCLBcS9i3j2EG8JWdpHiENkuYz4jhD/CRKoIB9OkeA58rGKhC6Q8BUSqSGfrpHoLfK5jsTukPgD +stJAvjwiiWfkKwCYGU3m3hbzC5KZ2Wp+2W7uI5tZHeb+TvMrqpndZX7dbR6gmzk95sFe8xummdtn +fttv5rHN/AGzYND8jmsW8szvBWaR0CwWmSUS85DULJWZhxVmGWiWK80KtXkEMoMa86jOrITNKr1Z +bTSPIWbIZB63mDWoWWs16+zmCcwMO8yTLrMeNxvcZqPXPEWYEZ95OmA2Bc3mkNkSMc9EzWjMPLti +tibMtlWzfc08lzJj6+b5DbMjY3Zuml1b5oWcGd82L+6Y3QWzZ9fs3TMvlczEvnn50Owrm/1H5sCJ ++UPFHDw1fzw3h6rm8IU5cmX+VDNHr82fb82xujl+Z155MH9pmBOP5q/P5lUAQHub0BctKJOEvmxF ++9pRFhnt70BfdaJsKvq6Cx3oRjl0dLAHfdOLcpno2z6U14/y2ahgAH03iAq56HseKhKgYiEqEaFD +ElQqRYdlqEyB/tMCFUp0RI2CEDqqQZU6VAWjaj06ZkQhBB03oRoLqkVRnRWdsKMwhk46UL0LNeCo +0Y1OeVGEQKd9qCmAmoOoJYTORFA0is7GUOsKakug9lV0bg3FUuj8OurYQJ0Z1LWJLmyheA5d3Ebd +O6ingHp30aU9lCihy/uo7xD1l9HAEfrhBA1W0I+naOgcDVfRyAX66QqN1tDP12jsFo3X0ZU79MsD +mmigXx/R1Wc0CQC2F002ZovtJcnW12pjtdv6ybZXHTZ2p+011TbQZeN02wbptjc9Nm6v7S3Txuuz +8fttArbt3YBNOGh7z7WJeDaxwCYR2oZENqnENiy1yWQ2ucKmAG0jShuoto1CNqXGptLZ1LBtTG+D +jLZxxKYx2bQWmw61TVhtsN02idn0DpvBZTPitim3DfHapgmbyWczB2yWoG0mZEMjttmozRqz2VZs +9oRtbtWGrdnmUzbHus25YXNlbAubNnzLtpizubdtnh2bt2Bb2rURe7blks23b/Mf2gJl24cjW/DE +9rFiC53awue2SNX26cIWvbJ9rtli17b4rW2lbvtyZ0s82L42bKuPtuSzbQ0AMGYT9rIF6yNhrFas +vx17RcbYHdjrTmyAinG6sMFu7A0d4/Zgb3sxHhPj92GCfuwdGxMOYO8HMREXE/MwiQAbEmJSETYs +wWRSTC7DFApsBMRAJTaqxpQQptJgah02BmOQHhs3YhoE05ownQWbQDHYik3aMT2GGRyY0YVN4Rji +xqa9mInAzD7MEsBmghgawmYjmDWK2WKYfQWbS2DYKja/hjlSmHMdc21gCxkM38QWtzB3DvNsY94d +bKmAEbvY8h7mK2H+fSxwiH0oY8Ej7OMJFqpg4VMsco59qmLRC+zzFRarYfFrbOUW+1LHEnfY1wds +tYElH7G1Z+wbADhfNjn7WpwskrO/1fmq3ckmO193OAc6nRyqc7DL+abbyaU73/Y4eb1OPtMp6HO+ +63cK2c73A07RoFPMdUp4ziGBUyp0DoucMolTLnUqZM4RhRMEnaNKp1LtVEFOtcY5pnNCsHNc79QY +nVrEqTM5JyxOGHVOWp16u9OAOY0O55TLieDOabfT5HWaCafF55wJONGgczbktEactqjTHnPOrTix +hHN+1elYczpTTte6c2HDiWeci5tO95bTk3N6t51LO06i4Fzedfr2nP6SM7Dv/HDoDJadH4+coRNn +uOKMnDo/nTujVefnC2fsyhmvOVeunV9unYm68+udc/XBmWw41x6d356dKQDA+5pwVgveT8JfteLs +dvw1GR/owDmd+CAVf9OFc7vxt3Sc14Pze3EBE3/Xhwv78fdsXDSAiwdxCRcf4uFSAT4sxGUiXC7B +FVJ8RIaDCnwUxJVKXKXG1RA+pvmnIOPjMK7R41ojrkPwCRMOW/BJFNdbcYMdN2L4lANHXPg0jpvc +uNmLWwh8xoejAXw2iFtDuC2C26P4XAzHVvD5BO5YxZ1ruCuFL6zj+Aa+mMHdm7hnC/fm8KVtnNjB +lwu4bxf37+GBEv5hHw8e4h/LeOgID5/gkQr+6RSPnuOfq3jsAo9f4Ss1/Ms1nrjFv9bx1Ts8+YCv +NfBvj3jqGf8OAB5Wk6e/xfOK5GG3el63ewbIHk6HZ7DT84bq4XZ53nZ7eHQPv8cj6PW8Y3qEfZ73 +/R4R2yMe8EgGPUNcj5TnGRZ4ZEKPXORRSDwjUg8o84wqPErQo1J61GrPGOSBNJ5xnUcDe7R6j87o +mUA8sMkzafHoUY/B6jHaPVOYB3F4pl0eE+4xuz0Wr2eG8KA+z2zAYw16bCGPPeKZi3qwmGd+xeNI +eJyrHteaZyHlwdc9ixsed8bj2fR4tzxLOQ+x7Vne8fgKHv+uJ7Dn+VDyBPc9Hw89obInfOSJnHg+ +VTzRU8/nc0+s6olfeFauPF9qnsS15+utZ7XuSd551h483xqe1KPn+7NnHQCI/ibiVQvBJhGvW4mB +doJDJgY7iDedBJdKvO0ieN0En04Ieoh3vYSQSbzvI0T9hJhNSAaIoUFCyiWGeYRMQMiFhEJEjEgI +UEqMygilglCBhFpJjKkJCCLGNYRGR2hhQqcnJowEjBCTJkJvIQwoYbQSU3YCwYhpB2FyEWacsLiJ +GS+BEsSsj7AGCFuQsIeIuQiBRYn5GOFYIZwJwrVKLKwReIpYXCfcG4QnQ3g3iaUtgsgRy9uEb4fw +F4jALvFhjwiWiI/7ROiQCJeJyBHx6YSIVojPp0TsnIhXiZUL4ssVkagRX6+J1VsiWSfW7ohvD0Sq +QXx/JNafiTQA+F81+dkt/tck/0Crn9PuHyT733T4uZ3+t1Q/r8vP7/YL6P53PX5hr/890y/q84v7 +/RK2f2jALx30D3P9Mp5fLvArhP4RkR+U+EelfqXMr1L41aB/TOmH1P5xyK/R+LU6vw72T+j9sNE/ +ifj1Jr/B4jei/imrH7H7pzG/yeE3u/wW3D/j9qNe/yzht/r8toDfHvTPhfxYxD8f9TtifueK35Xw +L6z68TX/YsrvXvd7NvzejH9p009s+Zdzft+237/jDxT8H3b9wT3/x5I/tO8PH/ojZf+nI3/0xP+5 +4o+d+uPn/pWq/8uFP3Hl/1rzr177k7f+tbr/250/9eD/3vCvP/rTz/4NAAiym4KvW4IDpCCnNTjY +HnxDDnI7gm87gzxqkN8VFHQH39GDwp7g+96giBkU9wUl/cEhdlA6EBweDMq4QTkvqBAER4RBUBQc +lQSV0qBKFlQrgmNgEFIGx9VBDRTUaoI6XXACDsL64KQxqP8HH0xBoyU4hQYRa3DaHjRhQbMjaHEF +Z/Ag6g7OeoNWImjzBe2B4FwwiIWC85GgIxp0xoKuleBCIoivBhfXgu5U0LMe9G4ElzJBYjO4vBX0 +5YL+7WBgJ/ihEAzuBj/uBUOlYHg/GDkMfioHo0fBzyfBWCUYPw2unAe/VIOJi+DXq+BqLZi8Dq7d +Br/Vg6m74PeH4HojmH4MbjwHfwBA+HVTeKAlzCGFB1vDb9rDXHL4bUeY1xnmU8OCrvC77rCQHn7f +Exb1hsXMsKQvPNQflrLDwwNh2WBYzg0reOERQRgUhkdFYaUkrJKG1bLwmCIMgeFxZVijDmuhsE4T +ntCFYTg8qQ/rjWEDEjaawlOWMIKGp61hkz1sxsIWR3jGFUbx8Kw7bPWGbUTY7gvPBcJYMDwfCjsi +YWc07IqFF1bCeCK8uBp2r4U9qbB3Pby0ESYy4eXNsG8r7M+FA9vhDzvhYCH8cTcc2guHS+HIfvjT +YThaDn8+CsdOwvFKeOU0/OU8nKiGv16EV6/CyVp47Tr87Tacqoe/34XXH8LpRnjjMfzjOZwBgOhA +U5TTEh0kRd+0Rrnt0bfkKK8jyu+MCqjRd11RYXf0PT0q6omKe6MSZnSoLyrtjw6zo7KBqHwwquBG +R3hRUBAdFUaVoqhKElVLo2OyKKSIjoNRjTKqVUd1UHRCE4V10Uk4qtdHDcaoEYlOmaL/wNU0GjVZ +o2Z71IJFZxxR1BWdxaNWd9TmjdqJ6JwvigWi88GoIxR1RqKuaHQhFsVXoouJqHs16lmLelPRpfUo +sRFdzkR9m1H/VjSQi37YjgZ3oh8L0dBuNLwXjZSin/aj0cPo53I0dhSNn0RXKtEvp9HEefRrNbp6 +EU1eRddq0W/X0dRt9Hs9un4XTT9ENxrRH4/RzHP0dwCIc5rigy3xN6Q4tzX+tj3OI8f5HXFBZ/wd +NS7sir/vjovocXFPXNIbH2LGpX3x4f64jB2XD8QVg/ERbhzkxUcFcaUwrhLF1ZL4mDQOyeLjirgG +jGuVcZ06PgHFYU18UhfXw3GDPm40xqeQOGKKT1viJjRutsYt9vgMFkcd8VlX3IrHbe643RufI+KY +Lz4fiDuCcWco7orEF6JxPBZfXIm7E3HPaty7Fl9KxYn1+PJG3JeJ+zfjga34h1w8uB3/uBMPFeLh +3XhkL/6pFI/uxz8fxmPlePwovnIS/1KJJ07jX8/jq9V48iK+dhX/VounruPfb+Pr9Xj6Lr7xEP/R +iGce478/xzcBIDHYlHjTkuCSEm9bE7z2BJ+cEHQk3nUmhNTE+66EqDshpickPYmh3oSUmRjuS8j6 +E3J2QjGQGBlMgNzEKC+hFCRUwoRalBiTJCBpYlyW0CgSWjChUyYm1AkYSkxqEnpdwgAnjPrElDGB +IIlpU8JkSZjRhMWamLEnUCwx60hYXQkbnrC7E3PeBEYk5n0JRyDhDCZcocRCJIFHE4uxhHsl4Ukk +vKuJpbUEkUosryd8Gwl/JhHYTHzYSgRziY/bidBOIlxIRHYTn/YS0VLi834idpiIlxMrR4kvJ4lE +JfH1NLF6nkhWE2sXiW9XiVQt8f06sX6bSNcTG3eJHw+JTCPx+2Ni8zmRBYDkm6YktyX5lpTktSb5 +7UkBOfmuIynsTL6nJkVdSXF3UkJPDvUkpb3JYWZS1peU9ycV7OTIQBIcTI5yk0peUiVIqoXJMVES +kiTHpUmNLKlVJHVgckKZhNXJSSip1yQNuqQRTk7pk4gxOY0kTaak2ZK0oMkZaxK1J2expNWRtLmS +djw5505i3uQ8kXT4ks5A0hVMLoSSeCS5GE26Y0nPStKbSC6tJom15HIq6VtP+jeSgUzyw2YyuJX8 +mEuGtpPhnWSkkPy0m4zuJT+XkrH9ZPwwuVJOfjlKJk6SXyvJ1dNk8jy5Vk1+u0imrpLfa8n162T6 +NrlRT/64S2Yekr83kpuPyexzcgsAUtym1NuWFI+U4remBO2pd+SUsCP1vjMloqbEXSlJd2qInpL2 +pIZ7UzJmSt6XUvSnRtgpcCA1OphSclMqXkotSI0JU5AoNS5JaaQprSylU6QmwBSsTE2qU3ooZdCk +jLrUFJxC9KlpY8qEpMymlMWSmkFTqDU1a09ZsX+4M2V3pebwFOZOzXtTDiLl9KVcgdRCMIWHUouR +lDua8sRS3pXUUiJFrKaW11K+VMq/ngpspD5kUsHN1MetVCiXCm+nIjupT4VUdDf1eS8VK6Xi+6mV +w9SXcipxlPp6klqtpJKnqbXz1LdqKnWR+n6VWq+l0tepjdvUj3oqc5f6/SG12UhlH1Nbz6k/ACD9 +tinNa0nzSWlBa/pde1pITr/vSIs602JqWtKVHupOS+np4Z60rDctZ6YVfemR/jTITo8OpJWDaRU3 +realxwRpSJgeF6U1krRWmtbJ0hOKNAymJ5VpvTptgNJGTXpKl0bg9LQ+bTKmzUjaYkrPWNIomp61 +pq32tA1L2x3pOVcaw9Pz7rTDm3YSaZcvvRBI48H0YijtjqQ90bQ3ll5aSROJ9PJq2reW9qfSgfX0 +h410MJP+uJkObaXDuXRkO/1pJx0tpD/vpmN76XgpvbKf/nKYTpTTX4/SqyfpZCW9dpr+dp5OVdPf +L9LrV+l0Lb1xnf5xm87U07/fpTcf0tlGeusx/cdzOgcAGV5Tht+SEZAy71ozwvbMe3JG1JERd2Yk +1MxQV0banRmmZ2Q9GXlvRsHMjPRlwP7MKDujHMioBjNqbmaMl4EEmXFhRiPKaCUZnTQzIcvAiswk +mNErMwZ1xghlpjQZRJeZhjMmfcZszFiQzIwpg1oys2jGas3Y7Bk7lplzZDBXZh7PONwZpzfjIjIL +vgweyCwGM+5QxhPJeKOZpViGWMksJzK+1Yx/LRNIZT6sZ4IbmY+ZTGgzE97KRHKZT9uZ6E7mcyET +283E9zIrpcyX/UziMPO1nFk9yiRPMmuVzLfTTOo8872aWb/IpK8yG7XMj+tM5jbzez2zeZfJPmS2 +Gpk/HjO558yfAJDlN2UFLdl3pKywNfu+PSsiZ8UdWUlndoialXZlh7uzMnpW3pNV9GZHmFmwLzva +n1Wys6qBrHowO8bNQrzsuCCrEWa1oqxOkp2QZmFZdlKR1YNZgzJrVGenoCyiyU7rsiY4a9ZnLcbs +DJJFTdlZS9aKZm3WrN2encOymCM778o68KzTnXV5swtEFvdlFwNZdzDrCWW9kexSNEvEsssrWV8i +61/NBtayH1LZ4Hr240Y2lMmGN7ORreynXDa6nf28k40VsvHd7Mpe9kspm9jPfj3MrpazyaPs2kn2 +WyWbOs1+P8+uV7Ppi+zGVfZHLZu5zv5+m92sZ7N32a2H7B+NbO4x++dzdhsAcoKm3LuWnJCUe9+a +E7XnxOScpCM31JmTUnPDXTlZd05Ozyl6ciO9OZCZG+3LKftzKnZOPZAbG8xB3Nw4L6cR5LTCnE6U +m5DkYGluUpbTK3IGMGdU5qbUOQTKTWtyJl3ODOcs+tyMMYciuVlTzmrJ2dCc3Zqbs+cwLDfvyDlc +OSeec7lzC/9QOZFb9OXcgZwnmPOGckuRHBHNLcdyvpWcP5ELrOY+rOWCqdzH9VxoIxfO5CKbuU9b +uWgu93k7F9vJxQu5ld3cl71copT7up9bPcwly7m1o9y3k1yqkvt+mls/z6WruY2L3I+rXKaW+/06 +t3mby9ZzW3e5Px5yuUbuz8fc9nMuDwD5d015YUv+PSkvas2L2/MScn6oIy/tzA9T87KuvLw7r6Dn +R3ryYG9+lJlX9uVV/Xk1Oz82kIcG8+PcvIaX1wryOmF+QpSHJflJaV4vyxsUeSOYn1LmEXV+Gsqb +NHmzLm+B8zP6PGrMzyJ5qylvs+TtaH7Omsfs+Xks73Dkna68C88vuPO4N79I5N2+vCeQ9wbzS6E8 +EckvR/O+WN6/kg8k8h9W88G1/MdUPrSeD2/kI5n8p818dCv/OZePbefjO/mVQv7Lbj6xl/9ayq/u +55OH+bVy/ttRPnWS/17Jr5/m0+f5jWr+x0U+c5X/vZbfvM5nb/Nb9fwfd/ncQ/7PRn77MZ9/zu8A +QEHYVHjfUhCRCuLWgqS9MEQuSDsKw50FGbUg7yoougsj9ALYUxjtLSiZBVVfQd1fGGMXoIHC+GBB +wy1oeQWdoDAhLMCiwqSkoJcWDLKCUVGYAguIsjCtLpiggllTsOgKM3AB1RdmjQUrUrCZCnZLYQ4t +YNbCvL3gwApOR8HlKizgBdxdWPQW3EThH2fhDRSWggUiVFiOFHzRgj9WCKwUPiQKwdXCx7VCKFUI +rxciG4VPmUJ0s/B5qxDLFeLbhZWdwpdCIbFb+LpXWC0VkvuFtcPCt3IhdVT4flJYrxTSp4WN88KP +aiFzUfj9qrBZK2SvC1u3hT/qhdxd4c+HwnajkH8s7DwX/gKA4vumoqilKCYVJa3FofailFwc7ijK +OotyalHRVRzpLoL04mhPUdlbVDGL6r7iWH8RYhfHB4qawaKWW9TxihOCIiwsToqKeknRIC0aZcUp +RREBi9PKokldNENFi6Y4oyuicHFWX7QaizakaDcV5yxFDC3OW4sOe9GJFV2O4oKriOPFRXfR7S16 +iKLXV1wKFIlgcTlU9EWK/mgxECt+WCkGE8WPq8XQWjGcKkbWi582itFM8fNmMbZVjOeKK9vFLzvF +RKH4dbe4uldMlopr+8Vvh8VUufj9qLh+UkxXihunxR/nxUy1+PtFcfOqmK0Vt66Lf9wWc/Xin3fF +7YdivlHceSz+9VwsAEBJ1FQSt5QkpNJQa0naXhoml2QdJXlnSUEtjXSVwO7SKL2k7CmpektqZmms +rwT1l8bZJc1ASTtY0nFLE7wSLChNCkt6UckgKRmlpSlZCVGUpsGSSVkyq0sWqDSjKaG60ixcsupL +NmPJjpTmTCXMUppHSw5ryWkvubDSgqOEu0qLeMntLnm8JS9RWvKViEBpOVjyhUr+SCkQLX2IlYIr +pY+JUmi1FF4rRVKlT+ul6Ebpc6YU2yzFt0orudKX7VJip/S1UFrdLSX3Smul0rf9Uuqw9L1cWj8q +pU9KG5XSj9NS5rz0e7W0eVHKXpW2aqU/rku529Kf9dL2XSn/UNpplP56LBWeS38DwIG46UDScjBE +OpC2Hgy3H8jIB/KOA0XnwQj1AOw6GO0+UNIPVD0H6t6DMeYB1Hcw3n+gYR9oBw50gwcT3AOYdzAp +ONALDwyiA6PkYEp6gMgOphUHJvDArDywqA9moANUczCrO7DCBzb9gd14MIccYKaDecuBAz1wWg9c +9oMF7AB3HCy6Dtz4gcd94PUeLBEHhO9gOXDgCx74QweByMGH6EEwdvBx5SCUOAivHkTWDj6lDqLr +B583DmKZg/jmwcrWwZfcQWL74OvOwWrhILl7sLZ38K10kNo/+H54sF4+SB8dbJwc/KgcZE4Pfj8/ +2KweZC8Otq4O/qgd5K4P/rw92K4f5O8Odh4O/mocFB4P/n4+2AWAsqSpPNRSlpLKw61lWXtZTi4r +OsojnWWQWh7tKiu7yyp6Wd1THustQ8zyeF9Z01/Wssu6gfLEYBnmlid5Zb2gbBCWjaLylKSMSMvT +srJJUTaDZYuyPKMuo1B5VlO26so2uGzXl+eMZQwpz5vKDkvZiZZd1vKCvYxj5UVH2e0qe/Cy111e +8pYJorzsK/sCZX+wHAiVP0T+0Tnlj7FyaKUcTpQjq+VPa+Voqvx5vRzbKMcz5ZXN8petciJX/rpd +Xt0pJwvltd3yt71yqlT+vl9ePyyny+WNo/KPk3KmUv79tLx5Xs5Wy1sX5T+uyrla+c/r8vZtOV8v +79yV/3ooFxrlvx/Lu8/lIgAcDzUdS1uOh0nHstZjefuxgnw80nEMdh6PUo+VXceq7mM1/Xis5xjq +PR5nHmv6jrX9xzr28cTAMTx4PMk91vOODYJjo/B4SnSMSI6npccm2bFZcWwBj2eUx6j6eBY6tmqO +bbpjO3w8pz/GjMfzyLHDdOy0HLvQ4wXrMW4/XsSO3Y5jj+vYix8vuY8J7/EycezzHfsDx4Hg8YfQ +cTBy/DF6HIodh1eOI4njT6vH0bXjz6nj2PpxfON4JXP8ZfM4sXX8NXe8un2c3DleKxx/2z1O7R1/ +Lx2v7x+nD483ysc/jo4zJ8e/V443T4+z58db1eM/Lo5zV8d/1o63r4/zt8c79eO/7o4LD8d/N453 +H4+Lz8d7AFCRNlWGWyoyUkXeWlG0V0bIFbCjMtpZUVIrqq6KursyRq9APZXx3oqGWdH2VXT9lQl2 +BR6oTA5W9NyKgVcxCipTwgoiqkxLKiZpxSyrWBSVGbCCKiuz6ooVqtg0FbuuMgdXMH1l3lhxIBWn +qeKyVBbQCm6tLNorbqzicVS8rsoSXiHclWVvxUdU/L5KIFD5EKwEQ5WPkUooWgnHKpGVyqdEJbpa ++bxWiaUq8fXKykblS6aS2Kx83aqs5irJ7craTuVboZLarXzfq6yXKun9ysZh5Ue5kjmq/H5S2axU +sqeVrfPKH9VK7qLy51Vlu1bJX1d2bit/1SuFu8rfD5XdRqX4WNl7rvwXAM6Gm85kLWdy0pmi9Wyk +/Qwkn412nCk7z1TUM3XX2Vj3GUQ/G+850/SeaZlnur6zif4zmH02OXCmHzwzcM+MvLMpwRkiPJsW +nZkkZ2bpmUV2NqM4Q8GzWeWZVX1mg87smrM53RkGn83rzxzGMydy5jKdLVjOcPRs0Xrmtp95sDOv +42zJdUbgZ8vuM5/3zE+cBXxnHwJnweDZx9BZKHIWjp5FYmefVs6iibPPq2extbN46mxl/ezLxlki +c/Z182x16yyZO1vbPvu2c5YqnH3fPVvfO0uXzjb2z34cnmXKZ78fnW2enGUrZ1unZ3+cn+WqZ39e +nG1fneVrZzvXZ3/dnhXqZ3/fne0+nBUbZ3uPZ/99PisBQFXWVJW3VBWk6khrFWyvjpKryo6qqrOq +plbHuqpQd3WcXtX0VLW9VR2zOtFXhfurk+yqfqBqGKwaudUpXhURVKeFVZOoapZULdLqjKyKKqqz +YNWqrNrUVTtUndNUMV11Hq469FWnsepCqgumKm6pLqJVt7XqsVe9WHXJUSVc1WW86nNX/d5qgKh+ +8FWDgerHYDUUqoYj1Ui0+ilWja5UPyeqsX9k11p1JVX9sl5NbFS/Zqqrm9XkVnUtV/22XU3tVL8X +quu71fRedaNU/bFfzRxWfy9XN4+q2ZPqVqX6x2k1d179s1rdvqjmr6o7tepf19XCbfXvenX3rlp8 +qO41qv99rJaeq/8DgEt506Wi5XKEdAm2Xo62XyrJl6qOS3Xn5Rj1Euq6HO++1NAvtT2Xut7LCeYl +3Hc52X+pZ18aBi6Ng5dT3EuEdzktuDQJL82iS4vkckZ6icouZxWXVvDSpry0qy/noEtMczmvu3TA +l079pct4uYBc4qbLRculG730WC+99ssl7JJwXC67Ln34pd99GfBefiAug77Lj4HLUPAyHLqMRC4/ +RS+jscvPK5exxGV89XJl7fJL6jKxfvl143I1c5ncvFzbuvyWu0xtX37fuVwvXKZ3Lzf2Ln+ULjP7 +l78fXm6WL7NHl1snl39ULnOnl3+eX25XL/MXlztXl3/VLgvXl3/fXu7WL4t3l3sPl/9tXJYeL//3 +fLkPADVFU22kpQaSaqOtNWV7TUWuqTtqY501iFob76ppumtaek3XU5vorcHM2mRfTd9fM7BrxoHa +1GAN4dameTWToGYW1iyi2oykhkprs7KaVVGzgTW7sjanrmFQbV5Tc+hqTrjm0tcWjDUcqS2aam5L +zYPWvNbakr1GYLVlR83nqvnxWsBd++CtBYnaR18tFKiFg7VIqPYpUotGa59jtdhKLZ6orazWvqzV +/lGBX9drqxu1ZKa2tln7tlVL5Wrft2vrO7V0obaxW/uxV8uUar/v1zYPa9lybeuo9sdJLVep/Xla +2z6v5au1nYvaX1e1Qq3293Vt97ZWrNf27mr/faiVGrX/Pdb2n2sHAHAz0nQDttyMkm6UrTeq9hs1 ++Was4wbqvBmn3mi6brTdNzr6zUTPDdx7M8m80ffdGPpvjOybqYEbZPBmmntj4t2YBTcW4c2M6AaV +3MxKb6yyG5vixg7ezClvMPXNPHTj0Nw4dTcu+GZBf4MbbxaRG7fpxmO58aI3S9Ybwn6zjN34HDd+ +100Av/ngvgl6bz4SNyHfTThwEwnefArdRCM3n6M3sdhNfOVmJXHzZfUmsXbzNXWzun6T3LhZy9x8 +27xJbd18z92sb9+kd242Cjc/dm8yeze/l24292+yhzdb5Zs/jm5yJzd/Vm62T2/y5zc71Zu/Lm4K +Vzd/1252r2+Ktzd79Zv/3t2UHm7+17jZf7w5eL45BIA62FQfbakrSXVVa13dXh8j16GO+nhnXUOt +a7vquu76BL0O99Qne+t6Zt3QVzf216fYdWSgPj1YN3HrZl7dIqjPCOuoqD4rqVuldZusblfU58A6 +pqzPq+sOqO7U1F26+gJcx/X1RWPdjdQ9prrXUl9C64S1vmyv+7C631EPuOof8HrQXf/orYeIethX +jwTqn4L1aKj+OVKPRevxWH1lpf4lUU+s1r+u1VdT9eR6fW2j/i1TT23Wv2/V13P19HZ9Y6f+o1DP +7NZ/36tvlurZ/frWYf2Pcj13VP/zpL5dqedP6zvn9b+q9cJF/e+r+m6tXryu793W/1uvl+7q/3uo +7zfqB4/1w+f6/wHA/WjTvbLlXkW6V7fej7XfQ+T78Y57Tee9lnqv67qf6L6H6feTPff63nsD897Y +dz/Vf4+w76cH7k2D92buvYV3PyO4R4X3s6J7q+TeJr23y+7nFPcYeD+vvHeo753QvUtzv6C7x+H7 +Rf2923jvQe69pvslyz2B3i9b7332ez92H3Dcf3DdB/H7j+77kPc+TNxHfPefAvfR4P3n0H0sch+P +3q/E7r+s3CcS919X71fX7pOp+7X1+28b96nM/ffN+/Wt+3TufmP7/sfOfaZw//vu/ebefbZ0v7V/ +/8fhfa58/+fR/fbJfb5yv3N6/9f5faF6//fF/e7VfbF2v3d9/9/b+1L9/n939/sP9weN+8PH+/97 +vi8DQEPZ1FC1NNSkxlhrA2pvjJMbmo6GtrOhozYmuhpwd2OS3tD3NAy9DSOzMdXXQPob0+yGaaBh +HmxYuI0ZXgMVNGaFDauoYZM07NLGnKyBKRrzYMOhbDjVDRfUWNA0cF1jEW649Q2PseFFGkumBmFp +LKMNn7XhtzcCWOODoxF0NT7ijZC7EfY2IkTjk68RDTQ+BxuxUCMeaaxEG19ijcRK42uisbraSK41 +1lKNb+uN1Ebje6axvvmPJW1s5Bo/thuZncbvhcbmbiO719gqNf7Yb+QOG3+WG9tHjfxJY6fS+Ou0 +UThv/F1t7F40ileNvVrjv9eN0m3jf/XG/l3j4KFx2Gj832Oj/Nz4fwDwpGp6Urc8jZGeoNan8fYn +DflJ2/Gk63yaoD7BXU+T3U96+pOh58nY+zTFfEL6nqb7n0zsJ/PAk2XwaYb7hPKeZgVPVuGTTfRk +lzzNSZ8w2dO84skBPjmVTy710wL0hGueFnVPbvjJo3/yGp+WkCfC9LRsefKhT37rU8D+9AF7Cjqe +PrqeQvhT2P0U8T59Ip6ivqfPgadY8CkeelqJPH2JPiViT19XnlYTT8nVp7W1p2+pp9T60/eNp/XM +U3rzaWPr6UfuKbP99PvO02bhKbv7tLX39EfpKbf/9Ofh03b5KX/0tHPy9FflqXD69Pf50271qXjx +tHf19N/aU+n66X+3T/v1p4O7p8OHp/9rPJUfn/7f89PR/w8QCy14LJdV2gAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-007.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-007.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f4047dcc8ae6268e5f0c50729043417b5919e40 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-007.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-007.xml b/corpus/m6/native-expanded-control-ui-01/read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..47726fabb466fe17a2675b54522bbc71179dc601 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-007.xml @@ -0,0 +1,21 @@ + +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABAAGADASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDwhYfa +plh9qsrD7VMsPtUqRFOqVVh9qmWH2qysPtUyw+1UpHbTqlZYfaplh9qsrD7VMsPtVqR206pVWGpl +h9qsrDUyw+1UpHbTqlZYalWH2q0sNSrD7VSkdtOqVlh9qmWH2qysPtUyw+1UpHdTqnHrD7VMsPtV +lYfaplh9q81SPyqnVKqw+1TLD7VZWH2qZYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adUqrDUyw+1 +WVhqZYfarUjtp1SssNSrD7VaWGpVh9qpSO2nVKyw+1TLD7VZWH2qZYfaqUjup1Tj1h9qmWH2qysP +tUyw+1eapH5VTqlVYfaplh9qsrD7VMsPtVKR206pWWH2qZYfarKw+1TLD7VSkdtOqVVhqZYfarKw +1MsPtVqR206pWWGpVh9qtLDUqw+1UpHbTqlZYfaplh9qsrD7VMsPtVKR206px6w+1TLD7VZWH2qZ +YfavNUj8rp1SqsPtUyw+1WVh9qmWH2qlI7adUrLD7VMsPtVlYfaplh9qpSO2nVKqw1MsPtVlYamW +H2q1I7adUrLDUqw+1WlhqVYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adU//Z + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-008.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-008.pdf new file mode 100644 index 0000000000000000000000000000000000000000..57198c6f263c6ff605b432fd8dbb6099d6a11aa2 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-008.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-008.xml b/corpus/m6/native-expanded-control-ui-01/read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..7bfc97e1c1a4e199e69be0d3d5e964fdc9fb431d --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-008.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-009.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-009.pdf new file mode 100644 index 0000000000000000000000000000000000000000..44d9a61b422fabe498e03b451f1d18ca10f93e58 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-009.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-009.xml b/corpus/m6/native-expanded-control-ui-01/read/page-009.xml new file mode 100644 index 0000000000000000000000000000000000000000..4833d4cd4c16672f6f334323153a5512f971828f --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-009.xml @@ -0,0 +1,46 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAMAAADS6oI8AAADAFBMVEW4t5mrt5O4qpWrqo6euo2S +uoeZs4ieqoiSqoK4nJCrnIq4kIyrkIaen4SSn36ZmH+ekH+SkHmGuoGGs395t3pounJos3CGqnx5 +qnVtqm9iqmqGnHd5nHGGkHN5kG1on2lomGdokGS4hIirhIK4d4Srd32eh3ySh3aZgHeed3eSd3G4 +a4Cra3m4YHyrYHaea3OSa22eYG+SYGmGh3CGgG55hGloh2FogF+Gd2t5d2Rtd15id1mGa2d5a2CG +YGN5YF1ta1pia1VoYFRWumlWs2dJt2I4ulo4s1hWqmRJql09qlcyqlImulEaukshs0wKukMKs0Em +qkwaqkYPqkAEqjtWnF9JnFlWkFtJkFU4n1E4mE84kEwmn0gan0IhmEMmkEMakD0KnzoKmDgKkDVW +h1hWgFZJhFE4h0k4gEdWd1NJd0w9d0Yyd0FWa09Ja0hWYEtJYEU9a0Iyaz04YDwmh0AahzohgDsK +hzIKgDAmdzsadzUPdy8EdyomazcaazEmYDMaYC0PaysEayYKYCW4VHirVHK4R3SrR22eV2ySV2aZ +UGeeR2eSR2G4O3CrO2m4MGyrMGaeO2OSO12eMF+SMFmGV2CGUF55VFloV1FoUE+GR1t5R1RtR05i +R0mGO1d5O1CGMFN5ME1tO0piO0VoMES4JGirJGK4GGSrGF6eJ1ySJ1aZIFeeGFeSGFG4DmGrDlq4 +A12rA1eeDlSSDk6eA1CSA0qGJE95JEmGGEt5GEVoJ0FoID9oGDyGDkh5DkGGA0R5Az5tDjtiDjZo +AzVWVEdJVEE4Vzk4UDdWR0NJRzw9RzYyRzFWOz9JOzhWMDtJMDU9OzIyOy04MCwmVzAaVyohUCsK +VyIKUCAmRysaRyUPRx8ERxomOycaOyEmMCMaMB0POxsEOxYKMBVWJDdJJDFWGDNJGC04Jyk4ICc4 +GCRWDjBJDilWAyxJAyY9DiMyDh44Ax0mJyAaJxohIBsmGBsaGBUKJxIKIBAKGA0mDhgaDhImAxQa +Aw4PDgwEDgcKAwZYdbPqAAAAAWJLR0QAiAUdSAAAAAxjbVBQSkNtcDA3MTIAAAADSABzvAAABjJJ +REFUWEedkImbTgUcha9ChZl2RUKR0TKTtGiRsZUSEpI0tKm0GoW0WSOjMmNpL82oFG1apJJltNDC +KKRNURRZytZqRr9zzl2+79779Ty+9w943+ccZ7fPLvGv+N1js9jk8r7HfDFPzCRvktfIDOGEA64/ +rYD8oUCFVyhPGuAHtqRYUJq0IHFAOFBh7C4Hu/4B//4NfgO/bwGbN4JNm34FC8D7pWD+XDBv3hww +8w3w5uvgtVfBjBmvAAf+CvrL6f+HfgXo30L/RurdAP2l9M+lfs4c+t+g/3X6X6U+JiB/egH54wJ/ +xQ74bUNkAR9a8F5kQeKAaOAvUr5T7CB20Aay5WexTkBPSt8Rb4uXyUvkBfK8cCqkNxL9O3ZIbyQH +1klvxATkDwVC/p3btcAPrE8RmJ0U0IAX4wJ/+mDBdoLAeg8E1q5da/f8BGZ7IDBr1iy75y0DeqIB +U6dOtXueM5wgsM1QYKvhB0wOaE8MmBzAbkyfPl2BadOmmd2A3Qv8QRBAAXoGfiHRwLskEkDB9OGA +5H5gm/Rbt8oeDcgeDtgAg/qUAQ7YliJQVoZ7lhjJgZIS/FNcHAkUFeGfwsJC50efH8T34guPMgE5 +eNajRBSLSWQiKSImB5GA608rIH8osMZbsDppgB9YmmLBlKQFiQPCgTXGj6vBD6vA99+Bz8EXS0HZ +YrBkyWfgGfDsFFDyNCgungwmTQATx4OicaCw8EHgwL+G/tX0r6JfAfqX0r+YejdA/xT6n6Z+8mT6 +J9A/nv5x1McE5E8vIH/KQGRAzAI+9Ex0QeKAUOBb8g34mnxFPiWfgI/FIvIUeRI8IR4nD5D7yX1i +NHECfzRAvxuQXwH63YD8MQH5owEN0II9DWiAuyAxsHJl8NCKFb5/4cLIAg547LHIAj00dmx8YCXh +QysEBywkuOhDY9GiDwD9ABc9YjwsqCcYMMoYPfpe4HwrvbHckH+ZIb0Bu0G9Ib0BexAoKCiQf8yY +MdCPGkW9BaD+kiCAAvQMfESigUeJH3gIWAAF04cDkvuB5dIvWyZ7NCB7EKBegQLqUwY4YHmKQH4+ +7ulnJAdycxP8iYGcHPyTnZ3tjPQZJoaK2zzyBeSgtUeuaCGakpNIDjE5iARcf1oB+UOBEd6C4UkD +/ED/FAtaJi1IHBAOjDBGDgfDhoCh94BbwW39Qf4toF+/m0Er0LolyD0btGjRHDRtAk46EeScALKz +jwcO/CPoH07/EPoVoL8//bdQ7wbob0n/2dQ3b05/E/pPpP8E6mMC8qcXkD9lIDIgZgEfahVdkDgg +FLib3AXuJHeQm8iN4AZxPTmLnAnOEKeT48ix5BjRkDiBPxqg3w3IrwD9bkD+mID80YAGaMGeBjTA +XZAYGDw4eGjQIN/ft29kAQc0axZZoIcaN44PDCZ8aJDggL4EF11rXCPoB7joVOMUQT3BgAZGw4ZH +A+du6Y2BhvwDDOkN2IPANdIbsAeBrKws+Rs1agR9gwbUWwDq2wkCKEDPwHXED/Qhpj6N+IGTgQVQ +MH04ILkfGCj9gAGyBwHp+/SRPQhQr0AW9SkDHDAwRaBHj/hA3boJ/sRAjRr4p3r16s7VPleIy8Vl +Hj3EJS5HedQVR4oDyQGkBjE5iARcf1oB+VMF3AG9Qwt6plhQP2mBBuwfF7jKB4XeBI2eHgh0797d +HroY1PdAoE6dOnbPEQb0RAOqVatm9+xnOEGgl6FAnuEHTA5oTwyYHMBuZGZmKpCRkWF2A3YvcCVB +AAXoGbiURAP1SCSAgunDAcn9QC/p8/JkjwZkDwdsgEF9ONDN83flgkigffuki2p7/lq1Ei/6v0A3 +48quoFcXkHcRuABc2h6cL84jtUG9WuBwcRjJ3Bdk7AP2FnsRB/5u9Helvwv9CtDvBuRXgH43IP9h +9O9LvxuQPxqQP72A/DGBzp2DAZ06+f527SILOKBmzcgCDahaNT7QmfChToID2hFcdI7RVtAPcNEh +xsGCeoIBlQx7h3ST3uhoyN/BkN6APQi0ld6APQhUqVJF/sqVK0NfqZL0jgP1hQQBFKBn4FziB9oQ +Ux9K/MBBwAIomD4ckNwPdJS+QwfZg4D0bdrIHgSoV6AK9SkDHNAxzQD9sYH/AHAD8Cry1R2MAAAA +AElFTkSuQmCC + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-010.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-010.pdf new file mode 100644 index 0000000000000000000000000000000000000000..993822d332243195595fe99c2d94cbf13cbb0265 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-010.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-010.xml b/corpus/m6/native-expanded-control-ui-01/read/page-010.xml new file mode 100644 index 0000000000000000000000000000000000000000..89e9022617a59bcd9f29e0cc5e9d43dd8f4227b1 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-010.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-011.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-011.pdf new file mode 100644 index 0000000000000000000000000000000000000000..996982245396ac095a21c448483a8014ea291878 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-011.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-011.xml b/corpus/m6/native-expanded-control-ui-01/read/page-011.xml new file mode 100644 index 0000000000000000000000000000000000000000..2d507260be257739aba874207526c04d0f4b06ac --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-011.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-012.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-012.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f3033abb7e9391f343a54d1fb52910830dbabb32 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-012.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-012.xml b/corpus/m6/native-expanded-control-ui-01/read/page-012.xml new file mode 100644 index 0000000000000000000000000000000000000000..56f9bf1cd57705eaff31c01009731c959adafe35 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-012.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-013.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-013.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f5140b5e8eb9d8612ad044d147d11627ec986558 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-013.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-013.xml b/corpus/m6/native-expanded-control-ui-01/read/page-013.xml new file mode 100644 index 0000000000000000000000000000000000000000..d8b6430d71a2fcb3ab09c5db99c92346c237c487 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-013.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-014.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-014.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1b65e75dbf35d676b60bb1c4d4667bb8d3500f65 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-014.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-014.xml b/corpus/m6/native-expanded-control-ui-01/read/page-014.xml new file mode 100644 index 0000000000000000000000000000000000000000..0e278950a0d66c345a43695d99eae3e0e93ddd39 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-014.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-015.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-015.pdf new file mode 100644 index 0000000000000000000000000000000000000000..285cd1f491685aa4c641fcea6013136b239912c6 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-015.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-015.xml b/corpus/m6/native-expanded-control-ui-01/read/page-015.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e3feb006d2c524ca8096a6c45975a455e9f02e0 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-015.xml @@ -0,0 +1,4 @@ + +Inherited strike and spacing]]>مرحبا بالعالم]]> diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-016.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-016.pdf new file mode 100644 index 0000000000000000000000000000000000000000..19e8c9fb7721027f0989b8c9896bb8228ccbdb3a Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-016.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-016.xml b/corpus/m6/native-expanded-control-ui-01/read/page-016.xml new file mode 100644 index 0000000000000000000000000000000000000000..ca96e7525f9c613a1212bcef15e4476db58a09e8 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-016.xml @@ -0,0 +1,9 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAO +xAAADsQBlSsOGwAAARlJREFUeF7t2VFHQ2EcBvD3PWetVqvVam1ERESMiIiIiL7/J5p9gD1dvF51 +8eNcn4uf53n2P1ZLKUOpnkMCtYx0kkAt00F8gkAtsxFQBJpPAEWgxRGgCLScAopAq2NAEWhzAigC +3c0ARaD7U0AR6OEMUAR6nAOKQE/ngCLQ8wWgCLRdAIpAL5eAItDrFaAI9LYEFIHerwFFoI8bQBHo +cwUoAn3dAopA32tAEehnAygKjPu/xjyHBAY0WQDQL+0BBKhtYSVIgiSo6w+xiqmYiqnYX34J2SAb +ZINskA1qa4EESZAEdW1B15e7g9xBbf2VIAmSICPtDmprgQRJkAR1bUHXl7uD3EFt/ZUgCZIgI+0O +amuBBEnQP07QDo1OW207QPoWAAAAAElFTkSuQmCC + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-017.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-017.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4709ad33046a086648362abb852d262dae0b9847 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-017.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-017.xml b/corpus/m6/native-expanded-control-ui-01/read/page-017.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb6d600468e0ec7da476de96a2614bb21f21e858 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-017.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-018.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-018.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a509e4d130bd38955292bdb8d2b1f1776daec037 Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-018.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-018.xml b/corpus/m6/native-expanded-control-ui-01/read/page-018.xml new file mode 100644 index 0000000000000000000000000000000000000000..279bde70c1a861d617f80d7f36e3184a61967a44 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-018.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-019.pdf b/corpus/m6/native-expanded-control-ui-01/read/page-019.pdf new file mode 100644 index 0000000000000000000000000000000000000000..62f1d6ed18e1b79bed5a0212907bcb6f2c15d85c Binary files /dev/null and b/corpus/m6/native-expanded-control-ui-01/read/page-019.pdf differ diff --git a/corpus/m6/native-expanded-control-ui-01/read/page-019.xml b/corpus/m6/native-expanded-control-ui-01/read/page-019.xml new file mode 100644 index 0000000000000000000000000000000000000000..32007b20cbc307a2776e90970b0b52b1ed49b627 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/page-019.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-expanded-control-ui-01/read/payloads.json b/corpus/m6/native-expanded-control-ui-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..bc48d8c534348538cde9ae9b0e56ee4caa7c7800 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/read/payloads.json @@ -0,0 +1,18 @@ +[ + { + "sha256": "4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2", + "name": "Fictitious attachment.txt", + "object": "{2E7BA99D-CDED-080F-2255-D01592C0E5C8}{40}{B0}", + "kind": "InsertedFile", + "page": "{34619019-150E-06C2-3149-42A4E92723BF}{1}{B0}", + "bytes": 27 + }, + { + "sha256": "56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9", + "name": "silence.wav", + "object": "{2E7BA99D-CDED-080F-2255-D01592C0E5C8}{44}{B0}", + "kind": "MediaFile", + "page": "{34619019-150E-06C2-3149-42A4E92723BF}{1}{B0}", + "bytes": 16044 + } +] \ No newline at end of file diff --git a/corpus/m6/native-expanded-control-ui-01/run.json b/corpus/m6/native-expanded-control-ui-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..7366f38f807eabb913dd57dfbb3059a8b49f52a7 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/m6/native-features-01/notebook", + "expected_pages": 20, + "author": null, + "author_timeout_seconds": 600, + "inspect": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/m6/native-expanded-control-ui-01/scripts/cold.ps1 b/corpus/m6/native-expanded-control-ui-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-expanded-control-ui-01/scripts/read.ps1 b/corpus/m6/native-expanded-control-ui-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-expanded-control-ui-01/source.json b/corpus/m6/native-expanded-control-ui-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..d13acb396f676b9052e2e8b535685e471e26078c --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/source.json @@ -0,0 +1,110 @@ +[ + { + "path": "Empty.one", + "bytes": 4016, + "sha256": "9e99f8508837f3abe2874ccbd42bea9954ff01a596e3d4e8d1a01bc377b5a0df", + "mtime_ns": 1788661593561895158 + }, + { + "path": "Features.one", + "bytes": 121240, + "sha256": "97431f8b3d13096d74d95f72470d681792d5506df0692d2b72921031a6ade8c2", + "mtime_ns": 1788661593562175073 + }, + { + "path": "Group A/Duplicate.one", + "bytes": 23504, + "sha256": "77d0ffb49f308122e1a9155d0941ccecece888cb8f9af395697569a7be70d308", + "mtime_ns": 1788661593563832275 + }, + { + "path": "Group A/Open Notebook.onetoc2", + "bytes": 3760, + "sha256": "945d36daadca6eef55cc34107f6415356836ec79ca2b484a7f1adc0643fa27e0", + "mtime_ns": 1788661593563917316 + }, + { + "path": "Group B/Nested/Duplicate.one", + "bytes": 23424, + "sha256": "952dd1766415dd2c622d6981eb1eb6bf9d3415abf50735048529240c6ae40343", + "mtime_ns": 1788661593564205357 + }, + { + "path": "Group B/Nested/Open Notebook.onetoc2", + "bytes": 3760, + "sha256": "12e9cefade3dfdce9ad27bdc678b6401c71a5ab0fbeb260f94febc6c74fa0bc2", + "mtime_ns": 1788661593564303940 + }, + { + "path": "Group B/Open Notebook.onetoc2", + "bytes": 3736, + "sha256": "0f6318eae2aee05a8f909f009b7ef948e1e7973c34bc348659b7f5cf5dd63f4d", + "mtime_ns": 1788661593564040816 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 5364, + "sha256": "06ec4fb5b2454514eafae121f3f740c443053f8a4c857e6eb0dc59e5f8024233", + "mtime_ns": 1788661593562572238 + }, + { + "path": "fixture-data/Open Notebook.onetoc2", + "bytes": 3656, + "sha256": "7b2c9d872dfbec669423821452b76d9cca25d2eea83034623ecaf4cf601848ce", + "mtime_ns": 1788661593562956029 + }, + { + "path": "fixture-data/attachment.txt", + "bytes": 27, + "sha256": "4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2", + "mtime_ns": 1788661593562850321 + }, + { + "path": "fixture-data/pattern.bmp", + "bytes": 18486, + "sha256": "d7802912d031a974c277d1500f845faf7d1d5dc3dd9d5a3daf69c44db8d9dbf5", + "mtime_ns": 1788661593563127403 + }, + { + "path": "fixture-data/pattern.gif", + "bytes": 3902, + "sha256": "e0d351f33d156bf3d77b4912269768e2261c0c4850a8e78a87c245a2db2c5953", + "mtime_ns": 1788661593563230986 + }, + { + "path": "fixture-data/pattern.jpg", + "bytes": 1071, + "sha256": "bf7ef0fb92642d75f186c27a0ba662138c7c3f9ea85b1c478805a229cda451ed", + "mtime_ns": 1788661593563318944 + }, + { + "path": "fixture-data/pattern.png", + "bytes": 250, + "sha256": "02065dc5a46ae9a4adc68d0fff2641b62cedaa396f59f93ec6ac79c8b358904a", + "mtime_ns": 1788661593563399569 + }, + { + "path": "fixture-data/pattern.tiff", + "bytes": 18572, + "sha256": "fbbc74945e085389c3e994bfab64c26144056066e0d631512e62a3007b373427", + "mtime_ns": 1788661593563547193 + }, + { + "path": "fixture-data/silence.wav", + "bytes": 16044, + "sha256": "56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9", + "mtime_ns": 1788661593563674442 + }, + { + "path": "fixture.json", + "bytes": 12415, + "sha256": "d3c2142230816e8717c7612a5d2ca816a7551cebc2bc445846f3824d3a44dbc3", + "mtime_ns": 1788661593562325448 + }, + { + "path": "synthetic.one", + "bytes": 7428, + "sha256": "eb1e702f86562e91efcabf0065211efdeaf39bdc977beb82382faf901bf3b2c4", + "mtime_ns": 1788661593562715779 + } +] diff --git a/corpus/m6/native-expanded-control-ui-01/teardown.json b/corpus/m6/native-expanded-control-ui-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-expanded-control-ui-01/ui-operation.json b/corpus/m6/native-expanded-control-ui-01/ui-operation.json new file mode 100644 index 0000000000000000000000000000000000000000..b3cbe890769f0c9229ed90cdfab3b061661daf2b --- /dev/null +++ b/corpus/m6/native-expanded-control-ui-01/ui-operation.json @@ -0,0 +1,5 @@ +{ + "page_id": "{D0D04EF0-C565-0ED4-2AB4-711BAE6015ED}{1}{B0}", + "action": "Double-click the collapsed paragraph handle at (120,317).", + "observed": "Hidden child remains stored and Grandchild become visible." +} \ No newline at end of file diff --git a/corpus/m6/native-features-01/ORACLE.md b/corpus/m6/native-features-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..a76246674439b5e799761a5a04be639a7f338c7c --- /dev/null +++ b/corpus/m6/native-features-01/ORACLE.md @@ -0,0 +1,46 @@ +# Native feature controls + +OneNote 14.0.4763.1000 authored 19 pages alongside the Rust seed page, then +exported XML, PDFs and attachment bytes. The frozen input is +[notebook/fixture.json](notebook/fixture.json); [scripts/author.ps1](scripts/author.ps1) +contains the executed author. The input generator validates every page against +the unmodified [2010 COM schema](../../../resources/onenote2010-com/SOURCE.md). + +The fixture covers PNG/JPEG/BMP/TIFF/GIF import, alternative text and image links, +all four background/printout flag combinations, an attachment, a WAV recording +and its timed annotation, inherited strikethrough and paragraph spacing, RTL, +collapsed nested paragraphs, repeated breaks, numbering formats 0–4, a disabled +task with identity and dates, duplicate titles, three page levels, nested section +groups, duplicate section names in different groups, and an empty section. +Native XML exports BMP, TIFF and GIF images as PNG; JPEG remains JPEG. +The stored TIFF payload remains TIFF. The report preserves it and creates a +PNG browser preview whose pixels are checked against the native XML export. + +The printout controls isolate a native framing distinction. All four inputs +request 288 × 192 points. Without `isPrintOut`, stored layout maxima are exactly +288 × 192. With it, they are 286.56 × 190.56, independently of `backgroundImage`. +Native XML includes the 0.72-point border on each side; native PDF bitmap bounds +agree with the smaller stored dimensions within PDF coordinate rounding. +The corresponding stored Boolean is `0x08001d85`; the model retains both flags +and exposes the bitmap dimensions without adding the frame to them. + +The recording GUID is stored in `0x1c001c97`. Its annotation stores the same GUID +in `0x1c001c98` and 500 milliseconds in `0x14001c99`, agreeing with native +`MediaIndex`. The WAV payload is checked byte-for-byte against the native cache. +COM import does not set `IRecordMedia` for this fixture; the model leaves that +property absent. The separate private video has the documented value 2. + +The task's GUID, disabled/completed bits and four dates are checked against +`OutlookTask`. Numbering format 0 ends in a meaningful UTF-16 NUL code, which +must survive decoding. Rust assertions are in [tests/document.rs](../../../tests/document.rs). + +Reproduce the native semantic comparison with the bundled Python runtime: + +```sh +cargo build --example document +python3 tools/verify-document.py corpus/m6/native-features-01/notebook corpus/m6/native-features-01/read +``` + +The comparison passed 20 pages, the task association and 8,576 explicit +character-format comparisons. These results establish model and native +agreement; report visual inspection is a separate acceptance gate. diff --git a/corpus/m6/native-features-01/agent.py b/corpus/m6/native-features-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-features-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-features-01/commands.jsonl b/corpus/m6/native-features-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..fcc2a2d5a133acb3f5c2427884a857d1ea1a427b --- /dev/null +++ b/corpus/m6/native-features-01/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-1FDCD415", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-1FDCD415 -ExpectedPages 20 -UseCurrentCache -Pdf", "exit": 0, "stdout": "Read 5 sections and 20 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-features-01/format-differences.json b/corpus/m6/native-features-01/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-features-01/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-features-01/geometry-differences.json b/corpus/m6/native-features-01/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-features-01/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-features-01/health.json b/corpus/m6/native-features-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..246b8f5a1ad8083d62cd4e38c989ab04d63d4362 --- /dev/null +++ b/corpus/m6/native-features-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-1FDCD415", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-features-01/inputs/page-000.xml b/corpus/m6/native-features-01/inputs/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..233d491e352b2951c5e142facd849b57cc448235 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-000.xml @@ -0,0 +1 @@ +Image png \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-001.xml b/corpus/m6/native-features-01/inputs/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..68c26b00a8059282f6dd194f17bc707968700d17 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-001.xml @@ -0,0 +1 @@ +Image jpg \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-002.xml b/corpus/m6/native-features-01/inputs/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..41134a9dac810dfcf48133cdfc904093f73d9298 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-002.xml @@ -0,0 +1 @@ +Image bmp \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-003.xml b/corpus/m6/native-features-01/inputs/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..3b8f79e19edd12365eeceb7eca03776be08ffd91 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-003.xml @@ -0,0 +1 @@ +Image tiff \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-004.xml b/corpus/m6/native-features-01/inputs/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d482d2b5916d47a6c15cc0c2612b82d79d63469 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-004.xml @@ -0,0 +1 @@ +Image gif \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-005.xml b/corpus/m6/native-features-01/inputs/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..8edf420deca06e5db8cafe2dbeabae72b5ce8853 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-005.xml @@ -0,0 +1 @@ +Image role background=false, printout=falseForeground role control \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-006.xml b/corpus/m6/native-features-01/inputs/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..27599608d939ced04c88ddd56b7bd5f507b6e509 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-006.xml @@ -0,0 +1 @@ +Image role background=true, printout=falseForeground role control \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-007.xml b/corpus/m6/native-features-01/inputs/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..b8fec55f439dacc0c7f6a76e6b307f1ab2a1f9bd --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-007.xml @@ -0,0 +1 @@ +Image role background=false, printout=trueForeground role control \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-008.xml b/corpus/m6/native-features-01/inputs/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..5ad4c796eb6c42d058d116c3281fa0587bb45d9d --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-008.xml @@ -0,0 +1 @@ +Image role background=true, printout=trueForeground role control \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-009.xml b/corpus/m6/native-features-01/inputs/page-009.xml new file mode 100644 index 0000000000000000000000000000000000000000..638f70eefda32ea8a5e64a191a7e19c64630afa9 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-009.xml @@ -0,0 +1 @@ +Files and recordingRecording annotation \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-010.xml b/corpus/m6/native-features-01/inputs/page-010.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d23701fddb084177efe44a69fae834410bd6825 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-010.xml @@ -0,0 +1 @@ +Paragraph controlsInherited strike and spacingCentered paragraphمرحبا بالعالمCollapsed parentHidden child remains storedGrandchild
B        C]]>
\ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-011.xml b/corpus/m6/native-features-01/inputs/page-011.xml new file mode 100644 index 0000000000000000000000000000000000000000..2a66239e3780798ee482c47d0984e71c59e0db29 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-011.xml @@ -0,0 +1 @@ +Numbering controlsSequence 0, item 0Sequence 0, item 1Sequence 1, item 0Sequence 1, item 1Sequence 2, item 0Sequence 2, item 1Sequence 3, item 0Sequence 3, item 1Sequence 4, item 0Sequence 4, item 1 \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-012.xml b/corpus/m6/native-features-01/inputs/page-012.xml new file mode 100644 index 0000000000000000000000000000000000000000..f0755346c1ceba6cf650b49d230f49c165bd4da4 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-012.xml @@ -0,0 +1 @@ +Task controlsDisabled standalone task \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-013.xml b/corpus/m6/native-features-01/inputs/page-013.xml new file mode 100644 index 0000000000000000000000000000000000000000..1b6d6fc4f8c43d1bd8f092f08c5f1b125bfeb096 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-013.xml @@ -0,0 +1 @@ +Repeated titleGroup path Group A/Duplicate.one, level 1 \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-014.xml b/corpus/m6/native-features-01/inputs/page-014.xml new file mode 100644 index 0000000000000000000000000000000000000000..8622a3c91e04b6e605b5e99a926611b2223d7c3f --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-014.xml @@ -0,0 +1 @@ +Repeated titleGroup path Group A/Duplicate.one, level 2 \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-015.xml b/corpus/m6/native-features-01/inputs/page-015.xml new file mode 100644 index 0000000000000000000000000000000000000000..ec582f09036146b4ffb26ddcfe80e01481dd3bef --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-015.xml @@ -0,0 +1 @@ +Repeated titleGroup path Group A/Duplicate.one, level 3 \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-016.xml b/corpus/m6/native-features-01/inputs/page-016.xml new file mode 100644 index 0000000000000000000000000000000000000000..43bb0a17806a5b4c2b8edf5c37537425b137ef75 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-016.xml @@ -0,0 +1 @@ +Repeated titleGroup path Group B/Nested/Duplicate.one, level 1 \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-017.xml b/corpus/m6/native-features-01/inputs/page-017.xml new file mode 100644 index 0000000000000000000000000000000000000000..b60d8458799487628dc363d17698e0bc11e4c3d2 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-017.xml @@ -0,0 +1 @@ +Repeated titleGroup path Group B/Nested/Duplicate.one, level 2 \ No newline at end of file diff --git a/corpus/m6/native-features-01/inputs/page-018.xml b/corpus/m6/native-features-01/inputs/page-018.xml new file mode 100644 index 0000000000000000000000000000000000000000..75f50164686d7720ccaa4e138b17defc8538ff90 --- /dev/null +++ b/corpus/m6/native-features-01/inputs/page-018.xml @@ -0,0 +1 @@ +Repeated titleGroup path Group B/Nested/Duplicate.one, level 3 \ No newline at end of file diff --git a/corpus/m6/native-features-01/machine.json b/corpus/m6/native-features-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..cbb461b8e74d6b25cc3df5ad13078de7c984159b --- /dev/null +++ b/corpus/m6/native-features-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-1fdcd415", "hostname": "ONE-M6-1FDCD415"} diff --git a/corpus/m6/native-features-01/notebook/Empty.one b/corpus/m6/native-features-01/notebook/Empty.one new file mode 100644 index 0000000000000000000000000000000000000000..a4b1251f3d66bcd7c58bb49839082be7f8d348a5 Binary files /dev/null and b/corpus/m6/native-features-01/notebook/Empty.one differ diff --git a/corpus/m6/native-features-01/notebook/Features.one b/corpus/m6/native-features-01/notebook/Features.one new file mode 100644 index 0000000000000000000000000000000000000000..9ff7c3c8a71557d322f80b1336c7484c20fe25ef Binary files /dev/null and b/corpus/m6/native-features-01/notebook/Features.one differ diff --git a/corpus/m6/native-features-01/notebook/Group A/Duplicate.one b/corpus/m6/native-features-01/notebook/Group A/Duplicate.one new file mode 100644 index 0000000000000000000000000000000000000000..6687d7a552e7054af2dcb9e6adcd41dd158210db Binary files /dev/null and b/corpus/m6/native-features-01/notebook/Group A/Duplicate.one differ diff --git a/corpus/m6/native-features-01/notebook/Group A/Open Notebook.onetoc2 b/corpus/m6/native-features-01/notebook/Group A/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..e3eb690e5b29e3c79ef46ead9727827143802024 Binary files /dev/null and b/corpus/m6/native-features-01/notebook/Group A/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-features-01/notebook/Group B/Nested/Duplicate.one b/corpus/m6/native-features-01/notebook/Group B/Nested/Duplicate.one new file mode 100644 index 0000000000000000000000000000000000000000..8fe7d5960c7df1b1a50bbd97fff7374dba2b64bb Binary files /dev/null and b/corpus/m6/native-features-01/notebook/Group B/Nested/Duplicate.one differ diff --git a/corpus/m6/native-features-01/notebook/Group B/Nested/Open Notebook.onetoc2 b/corpus/m6/native-features-01/notebook/Group B/Nested/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..f29696488a6dffa27deb01e77fa60d41987d41d9 Binary files /dev/null and b/corpus/m6/native-features-01/notebook/Group B/Nested/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-features-01/notebook/Group B/Open Notebook.onetoc2 b/corpus/m6/native-features-01/notebook/Group B/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..bbb2ebe0fafacfee8a7e7e7f798012ea9eb6171b Binary files /dev/null and b/corpus/m6/native-features-01/notebook/Group B/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-features-01/notebook/Open Notebook.onetoc2 b/corpus/m6/native-features-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..55b1d2a96ef4e952bbeb0628401b622064e4c6b0 Binary files /dev/null and b/corpus/m6/native-features-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-features-01/notebook/fixture-data/Open Notebook.onetoc2 b/corpus/m6/native-features-01/notebook/fixture-data/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..308d2b40b6fb4e53a4c27657fcef9b62ee1e00b5 Binary files /dev/null and b/corpus/m6/native-features-01/notebook/fixture-data/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-features-01/notebook/fixture-data/attachment.txt b/corpus/m6/native-features-01/notebook/fixture-data/attachment.txt new file mode 100644 index 0000000000000000000000000000000000000000..a959c053358a06abc072d3492e7a86d2e712d804 Binary files /dev/null and b/corpus/m6/native-features-01/notebook/fixture-data/attachment.txt differ diff --git a/corpus/m6/native-features-01/notebook/fixture-data/pattern.bmp b/corpus/m6/native-features-01/notebook/fixture-data/pattern.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eab3975a924ce23658c2cd72ca3725b2d3ce3449 Binary files /dev/null and b/corpus/m6/native-features-01/notebook/fixture-data/pattern.bmp differ diff --git a/corpus/m6/native-features-01/notebook/fixture-data/pattern.gif b/corpus/m6/native-features-01/notebook/fixture-data/pattern.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b0069028a8c88f3b11d6bd7f2a7588fa0fdfb8a Binary files /dev/null and b/corpus/m6/native-features-01/notebook/fixture-data/pattern.gif differ diff --git a/corpus/m6/native-features-01/notebook/fixture-data/pattern.jpg b/corpus/m6/native-features-01/notebook/fixture-data/pattern.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2d4cb0f5ca8f87d6ee3a740929637004f92ec63 Binary files /dev/null and b/corpus/m6/native-features-01/notebook/fixture-data/pattern.jpg differ diff --git a/corpus/m6/native-features-01/notebook/fixture-data/pattern.png b/corpus/m6/native-features-01/notebook/fixture-data/pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..185512b97148b00cd95c7571321a76ce80cc6205 Binary files /dev/null and b/corpus/m6/native-features-01/notebook/fixture-data/pattern.png differ diff --git a/corpus/m6/native-features-01/notebook/fixture-data/pattern.tiff b/corpus/m6/native-features-01/notebook/fixture-data/pattern.tiff new file mode 100644 index 0000000000000000000000000000000000000000..cd2a1ff44360f3e5b281cff0a23e5f1da6a0262c Binary files /dev/null and b/corpus/m6/native-features-01/notebook/fixture-data/pattern.tiff differ diff --git a/corpus/m6/native-features-01/notebook/fixture-data/silence.wav b/corpus/m6/native-features-01/notebook/fixture-data/silence.wav new file mode 100644 index 0000000000000000000000000000000000000000..96260477f0ca60b1605e2971d8cdc146b8b4e02b Binary files /dev/null and b/corpus/m6/native-features-01/notebook/fixture-data/silence.wav differ diff --git a/corpus/m6/native-features-01/notebook/fixture.json b/corpus/m6/native-features-01/notebook/fixture.json new file mode 100644 index 0000000000000000000000000000000000000000..8958eecf4411591c28ed38f148ad5f7ead182cab --- /dev/null +++ b/corpus/m6/native-features-01/notebook/fixture.json @@ -0,0 +1,86 @@ +{ + "sections": [ + "Features.one", + "Group A/Duplicate.one", + "Group B/Nested/Duplicate.one", + "Empty.one" + ], + "pages": [ + { + "section": "Features.one", + "xml": "Image png" + }, + { + "section": "Features.one", + "xml": "Image jpg" + }, + { + "section": "Features.one", + "xml": "Image bmp" + }, + { + "section": "Features.one", + "xml": "Image tiff" + }, + { + "section": "Features.one", + "xml": "Image gif" + }, + { + "section": "Features.one", + "xml": "Image role background=false, printout=falseForeground role control" + }, + { + "section": "Features.one", + "xml": "Image role background=true, printout=falseForeground role control" + }, + { + "section": "Features.one", + "xml": "Image role background=false, printout=trueForeground role control" + }, + { + "section": "Features.one", + "xml": "Image role background=true, printout=trueForeground role control" + }, + { + "section": "Features.one", + "xml": "Files and recordingRecording annotation" + }, + { + "section": "Features.one", + "xml": "Paragraph controlsInherited strike and spacingCentered paragraphمرحبا بالعالمCollapsed parentHidden child remains storedGrandchild
B        C]]>
" + }, + { + "section": "Features.one", + "xml": "Numbering controlsSequence 0, item 0Sequence 0, item 1Sequence 1, item 0Sequence 1, item 1Sequence 2, item 0Sequence 2, item 1Sequence 3, item 0Sequence 3, item 1Sequence 4, item 0Sequence 4, item 1" + }, + { + "section": "Features.one", + "xml": "Task controlsDisabled standalone task" + }, + { + "section": "Group A/Duplicate.one", + "xml": "Repeated titleGroup path Group A/Duplicate.one, level 1" + }, + { + "section": "Group A/Duplicate.one", + "xml": "Repeated titleGroup path Group A/Duplicate.one, level 2" + }, + { + "section": "Group A/Duplicate.one", + "xml": "Repeated titleGroup path Group A/Duplicate.one, level 3" + }, + { + "section": "Group B/Nested/Duplicate.one", + "xml": "Repeated titleGroup path Group B/Nested/Duplicate.one, level 1" + }, + { + "section": "Group B/Nested/Duplicate.one", + "xml": "Repeated titleGroup path Group B/Nested/Duplicate.one, level 2" + }, + { + "section": "Group B/Nested/Duplicate.one", + "xml": "Repeated titleGroup path Group B/Nested/Duplicate.one, level 3" + } + ] +} \ No newline at end of file diff --git a/corpus/m6/native-features-01/notebook/synthetic.one b/corpus/m6/native-features-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..b7614a47dce6dcb02ff9a02e06ea94e75a7ad3b1 Binary files /dev/null and b/corpus/m6/native-features-01/notebook/synthetic.one differ diff --git a/corpus/m6/native-features-01/pdf-format-checks.json b/corpus/m6/native-features-01/pdf-format-checks.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-features-01/pdf-format-checks.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-features-01/read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment b/corpus/m6/native-features-01/read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment new file mode 100644 index 0000000000000000000000000000000000000000..a959c053358a06abc072d3492e7a86d2e712d804 Binary files /dev/null and b/corpus/m6/native-features-01/read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment differ diff --git a/corpus/m6/native-features-01/read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment b/corpus/m6/native-features-01/read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment new file mode 100644 index 0000000000000000000000000000000000000000..96260477f0ca60b1605e2971d8cdc146b8b4e02b Binary files /dev/null and b/corpus/m6/native-features-01/read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment differ diff --git a/corpus/m6/native-features-01/read/environment.json b/corpus/m6/native-features-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..c91fc2263e21da49d454834b04ab71cf02923702 --- /dev/null +++ b/corpus/m6/native-features-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-1FDCD415", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-features-01/read/hierarchy.xml b/corpus/m6/native-features-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..f46fbafaa14e6adb5f05ee8f77a4cacb66f24379 --- /dev/null +++ b/corpus/m6/native-features-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/page-000.pdf b/corpus/m6/native-features-01/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eae005ebffac610dd7da7317dc1c1f3d03fde762 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-000.pdf differ diff --git a/corpus/m6/native-features-01/read/page-000.xml b/corpus/m6/native-features-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..32d4cb80b9d0f24f099aae46adeb5701cd6f1ddc --- /dev/null +++ b/corpus/m6/native-features-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/page-001.pdf b/corpus/m6/native-features-01/read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4eb9fa73c65905583305f1b1b2557be5a0efb4a8 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-001.pdf differ diff --git a/corpus/m6/native-features-01/read/page-001.xml b/corpus/m6/native-features-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..7c45033164e8c579867fbf690cadf72f77d2509d --- /dev/null +++ b/corpus/m6/native-features-01/read/page-001.xml @@ -0,0 +1,4 @@ + +Inherited strike and spacing]]>مرحبا بالعالم]]> diff --git a/corpus/m6/native-features-01/read/page-002.pdf b/corpus/m6/native-features-01/read/page-002.pdf new file mode 100644 index 0000000000000000000000000000000000000000..84a250dc922d70e1fdea85d4150664d473c25773 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-002.pdf differ diff --git a/corpus/m6/native-features-01/read/page-002.xml b/corpus/m6/native-features-01/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..c3617fe704aa2e152a9ae6e8af7e523af1be0d00 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-002.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-features-01/read/page-003.pdf b/corpus/m6/native-features-01/read/page-003.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4a260530705d0446789a598177c375d3215fa50e Binary files /dev/null and b/corpus/m6/native-features-01/read/page-003.pdf differ diff --git a/corpus/m6/native-features-01/read/page-003.xml b/corpus/m6/native-features-01/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..eb3b1df9ea96a0fa0666e6947ee58d7f96f70b0f --- /dev/null +++ b/corpus/m6/native-features-01/read/page-003.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/page-004.pdf b/corpus/m6/native-features-01/read/page-004.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cdab0ad0bc62fcda0647972c38eaa7645400a257 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-004.pdf differ diff --git a/corpus/m6/native-features-01/read/page-004.xml b/corpus/m6/native-features-01/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..97cb397339c412db9d1cf448608ee1b22a91c2c0 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-004.xml @@ -0,0 +1,9 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAO +xAAADsQBlSsOGwAAARlJREFUeF7t2VFHQ2EcBvD3PWetVqvVam1ERESMiIiIiL7/J5p9gD1dvF51 +8eNcn4uf53n2P1ZLKUOpnkMCtYx0kkAt00F8gkAtsxFQBJpPAEWgxRGgCLScAopAq2NAEWhzAigC +3c0ARaD7U0AR6OEMUAR6nAOKQE/ngCLQ8wWgCLRdAIpAL5eAItDrFaAI9LYEFIHerwFFoI8bQBHo +cwUoAn3dAopA32tAEehnAygKjPu/xjyHBAY0WQDQL+0BBKhtYSVIgiSo6w+xiqmYiqnYX34J2SAb +ZINskA1qa4EESZAEdW1B15e7g9xBbf2VIAmSICPtDmprgQRJkAR1bUHXl7uD3EFt/ZUgCZIgI+0O +amuBBEnQP07QDo1OW207QPoWAAAAAElFTkSuQmCC + diff --git a/corpus/m6/native-features-01/read/page-005.pdf b/corpus/m6/native-features-01/read/page-005.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4f5d633ec80251c46481b2d41c0fd833b662025d Binary files /dev/null and b/corpus/m6/native-features-01/read/page-005.pdf differ diff --git a/corpus/m6/native-features-01/read/page-005.xml b/corpus/m6/native-features-01/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..455b10bada589e787c4c4047fbe1adfcc606f036 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-005.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-features-01/read/page-006.pdf b/corpus/m6/native-features-01/read/page-006.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ba39b105d997d5a681aa720f08c25c5f4ff1cea4 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-006.pdf differ diff --git a/corpus/m6/native-features-01/read/page-006.xml b/corpus/m6/native-features-01/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..8a12ced95d9d66914a20a7c171fb050a35fe5d70 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-006.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-features-01/read/page-007.pdf b/corpus/m6/native-features-01/read/page-007.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9abb05cf6f3cdfa29d6ec66d10952f3be4f5d80b Binary files /dev/null and b/corpus/m6/native-features-01/read/page-007.pdf differ diff --git a/corpus/m6/native-features-01/read/page-007.xml b/corpus/m6/native-features-01/read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..50f0dac09c6b34d13bb92ed0725c613c0948c228 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-007.xml @@ -0,0 +1,46 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAMAAADS6oI8AAADAFBMVEW4t5mrt5O4qpWrqo6euo2S +uoeZs4ieqoiSqoK4nJCrnIq4kIyrkIaen4SSn36ZmH+ekH+SkHmGuoGGs395t3pounJos3CGqnx5 +qnVtqm9iqmqGnHd5nHGGkHN5kG1on2lomGdokGS4hIirhIK4d4Srd32eh3ySh3aZgHeed3eSd3G4 +a4Cra3m4YHyrYHaea3OSa22eYG+SYGmGh3CGgG55hGloh2FogF+Gd2t5d2Rtd15id1mGa2d5a2CG +YGN5YF1ta1pia1VoYFRWumlWs2dJt2I4ulo4s1hWqmRJql09qlcyqlImulEaukshs0wKukMKs0Em +qkwaqkYPqkAEqjtWnF9JnFlWkFtJkFU4n1E4mE84kEwmn0gan0IhmEMmkEMakD0KnzoKmDgKkDVW +h1hWgFZJhFE4h0k4gEdWd1NJd0w9d0Yyd0FWa09Ja0hWYEtJYEU9a0Iyaz04YDwmh0AahzohgDsK +hzIKgDAmdzsadzUPdy8EdyomazcaazEmYDMaYC0PaysEayYKYCW4VHirVHK4R3SrR22eV2ySV2aZ +UGeeR2eSR2G4O3CrO2m4MGyrMGaeO2OSO12eMF+SMFmGV2CGUF55VFloV1FoUE+GR1t5R1RtR05i +R0mGO1d5O1CGMFN5ME1tO0piO0VoMES4JGirJGK4GGSrGF6eJ1ySJ1aZIFeeGFeSGFG4DmGrDlq4 +A12rA1eeDlSSDk6eA1CSA0qGJE95JEmGGEt5GEVoJ0FoID9oGDyGDkh5DkGGA0R5Az5tDjtiDjZo +AzVWVEdJVEE4Vzk4UDdWR0NJRzw9RzYyRzFWOz9JOzhWMDtJMDU9OzIyOy04MCwmVzAaVyohUCsK +VyIKUCAmRysaRyUPRx8ERxomOycaOyEmMCMaMB0POxsEOxYKMBVWJDdJJDFWGDNJGC04Jyk4ICc4 +GCRWDjBJDilWAyxJAyY9DiMyDh44Ax0mJyAaJxohIBsmGBsaGBUKJxIKIBAKGA0mDhgaDhImAxQa +Aw4PDgwEDgcKAwZYdbPqAAAAAWJLR0QAiAUdSAAAAAxjbVBQSkNtcDA3MTIAAAADSABzvAAABjJJ +REFUWEedkImbTgUcha9ChZl2RUKR0TKTtGiRsZUSEpI0tKm0GoW0WSOjMmNpL82oFG1apJJltNDC +KKRNURRZytZqRr9zzl2+79779Ty+9w943+ccZ7fPLvGv+N1js9jk8r7HfDFPzCRvktfIDOGEA64/ +rYD8oUCFVyhPGuAHtqRYUJq0IHFAOFBh7C4Hu/4B//4NfgO/bwGbN4JNm34FC8D7pWD+XDBv3hww +8w3w5uvgtVfBjBmvAAf+CvrL6f+HfgXo30L/RurdAP2l9M+lfs4c+t+g/3X6X6U+JiB/egH54wJ/ +xQ74bUNkAR9a8F5kQeKAaOAvUr5T7CB20Aay5WexTkBPSt8Rb4uXyUvkBfK8cCqkNxL9O3ZIbyQH +1klvxATkDwVC/p3btcAPrE8RmJ0U0IAX4wJ/+mDBdoLAeg8E1q5da/f8BGZ7IDBr1iy75y0DeqIB +U6dOtXueM5wgsM1QYKvhB0wOaE8MmBzAbkyfPl2BadOmmd2A3Qv8QRBAAXoGfiHRwLskEkDB9OGA +5H5gm/Rbt8oeDcgeDtgAg/qUAQ7YliJQVoZ7lhjJgZIS/FNcHAkUFeGfwsJC50efH8T34guPMgE5 +eNajRBSLSWQiKSImB5GA608rIH8osMZbsDppgB9YmmLBlKQFiQPCgTXGj6vBD6vA99+Bz8EXS0HZ +YrBkyWfgGfDsFFDyNCgungwmTQATx4OicaCw8EHgwL+G/tX0r6JfAfqX0r+YejdA/xT6n6Z+8mT6 +J9A/nv5x1McE5E8vIH/KQGRAzAI+9Ex0QeKAUOBb8g34mnxFPiWfgI/FIvIUeRI8IR4nD5D7yX1i +NHECfzRAvxuQXwH63YD8MQH5owEN0II9DWiAuyAxsHJl8NCKFb5/4cLIAg547LHIAj00dmx8YCXh +QysEBywkuOhDY9GiDwD9ABc9YjwsqCcYMMoYPfpe4HwrvbHckH+ZIb0Bu0G9Ib0BexAoKCiQf8yY +MdCPGkW9BaD+kiCAAvQMfESigUeJH3gIWAAF04cDkvuB5dIvWyZ7NCB7EKBegQLqUwY4YHmKQH4+ +7ulnJAdycxP8iYGcHPyTnZ3tjPQZJoaK2zzyBeSgtUeuaCGakpNIDjE5iARcf1oB+UOBEd6C4UkD +/ED/FAtaJi1IHBAOjDBGDgfDhoCh94BbwW39Qf4toF+/m0Er0LolyD0btGjRHDRtAk46EeScALKz +jwcO/CPoH07/EPoVoL8//bdQ7wbob0n/2dQ3b05/E/pPpP8E6mMC8qcXkD9lIDIgZgEfahVdkDgg +FLib3AXuJHeQm8iN4AZxPTmLnAnOEKeT48ix5BjRkDiBPxqg3w3IrwD9bkD+mID80YAGaMGeBjTA +XZAYGDw4eGjQIN/ft29kAQc0axZZoIcaN44PDCZ8aJDggL4EF11rXCPoB7joVOMUQT3BgAZGw4ZH +A+du6Y2BhvwDDOkN2IPANdIbsAeBrKws+Rs1agR9gwbUWwDq2wkCKEDPwHXED/Qhpj6N+IGTgQVQ +MH04ILkfGCj9gAGyBwHp+/SRPQhQr0AW9SkDHDAwRaBHj/hA3boJ/sRAjRr4p3r16s7VPleIy8Vl +Hj3EJS5HedQVR4oDyQGkBjE5iARcf1oB+VMF3AG9Qwt6plhQP2mBBuwfF7jKB4XeBI2eHgh0797d +HroY1PdAoE6dOnbPEQb0RAOqVatm9+xnOEGgl6FAnuEHTA5oTwyYHMBuZGZmKpCRkWF2A3YvcCVB +AAXoGbiURAP1SCSAgunDAcn9QC/p8/JkjwZkDwdsgEF9ONDN83flgkigffuki2p7/lq1Ei/6v0A3 +48quoFcXkHcRuABc2h6cL84jtUG9WuBwcRjJ3Bdk7AP2FnsRB/5u9Helvwv9CtDvBuRXgH43IP9h +9O9LvxuQPxqQP72A/DGBzp2DAZ06+f527SILOKBmzcgCDahaNT7QmfChToID2hFcdI7RVtAPcNEh +xsGCeoIBlQx7h3ST3uhoyN/BkN6APQi0ld6APQhUqVJF/sqVK0NfqZL0jgP1hQQBFKBn4FziB9oQ +Ux9K/MBBwAIomD4ckNwPdJS+QwfZg4D0bdrIHgSoV6AK9SkDHNAxzQD9sYH/AHAD8Cry1R2MAAAA +AElFTkSuQmCC + diff --git a/corpus/m6/native-features-01/read/page-008.pdf b/corpus/m6/native-features-01/read/page-008.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2710f649698a658ea35a5c04bc0ab853a3258ed6 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-008.pdf differ diff --git a/corpus/m6/native-features-01/read/page-008.xml b/corpus/m6/native-features-01/read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..1eac11961c982f1eb4761c1f6e13693b77cc4aaa --- /dev/null +++ b/corpus/m6/native-features-01/read/page-008.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/page-009.pdf b/corpus/m6/native-features-01/read/page-009.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dd3378ea330e266834550f7301341ff5d043564c Binary files /dev/null and b/corpus/m6/native-features-01/read/page-009.pdf differ diff --git a/corpus/m6/native-features-01/read/page-009.xml b/corpus/m6/native-features-01/read/page-009.xml new file mode 100644 index 0000000000000000000000000000000000000000..163423253f75801d2215caa251faecaff3dcd5f9 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-009.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/page-010.pdf b/corpus/m6/native-features-01/read/page-010.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c88febba38f72cc6505175a4f24363006d73b0d3 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-010.pdf differ diff --git a/corpus/m6/native-features-01/read/page-010.xml b/corpus/m6/native-features-01/read/page-010.xml new file mode 100644 index 0000000000000000000000000000000000000000..464c76a0f3ee277771db18586e9513f06884e058 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-010.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/page-011.pdf b/corpus/m6/native-features-01/read/page-011.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5f1df8ce158e6190b278168fca63770f303ca89b Binary files /dev/null and b/corpus/m6/native-features-01/read/page-011.pdf differ diff --git a/corpus/m6/native-features-01/read/page-011.xml b/corpus/m6/native-features-01/read/page-011.xml new file mode 100644 index 0000000000000000000000000000000000000000..6f04ff2a1cfb9d7bc8cf6775c6f33d6daa36adfa --- /dev/null +++ b/corpus/m6/native-features-01/read/page-011.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/page-012.pdf b/corpus/m6/native-features-01/read/page-012.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8f7d493705682daa9f354316ce6af8bd22505eca Binary files /dev/null and b/corpus/m6/native-features-01/read/page-012.pdf differ diff --git a/corpus/m6/native-features-01/read/page-012.xml b/corpus/m6/native-features-01/read/page-012.xml new file mode 100644 index 0000000000000000000000000000000000000000..a79cdd5e739c61b365ec40eec574b613764f425c --- /dev/null +++ b/corpus/m6/native-features-01/read/page-012.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-features-01/read/page-013.pdf b/corpus/m6/native-features-01/read/page-013.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a509b48e07202b36b7ec60fd9069cd47c5a1ce49 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-013.pdf differ diff --git a/corpus/m6/native-features-01/read/page-013.xml b/corpus/m6/native-features-01/read/page-013.xml new file mode 100644 index 0000000000000000000000000000000000000000..65947a0e8d14456ff04b91fb425b7cb16728dc80 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-013.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/page-014.pdf b/corpus/m6/native-features-01/read/page-014.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e71fbd59a66454060af6c6a54eb1d574084ec575 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-014.pdf differ diff --git a/corpus/m6/native-features-01/read/page-014.xml b/corpus/m6/native-features-01/read/page-014.xml new file mode 100644 index 0000000000000000000000000000000000000000..faf4db888f9e129322ec676a8cf02a98cb500ba5 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-014.xml @@ -0,0 +1,21 @@ + +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABAAGADASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDwhYfa +plh9qsrD7VMsPtUqRFOqVVh9qmWH2qysPtUyw+1UpHbTqlZYfaplh9qsrD7VMsPtVqR206pVWGpl +h9qsrDUyw+1UpHbTqlZYalWH2q0sNSrD7VSkdtOqVlh9qmWH2qysPtUyw+1UpHdTqnHrD7VMsPtV +lYfaplh9q81SPyqnVKqw+1TLD7VZWH2qZYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adUqrDUyw+1 +WVhqZYfarUjtp1SssNSrD7VaWGpVh9qpSO2nVKyw+1TLD7VZWH2qZYfaqUjup1Tj1h9qmWH2qysP +tUyw+1eapH5VTqlVYfaplh9qsrD7VMsPtVKR206pWWH2qZYfarKw+1TLD7VSkdtOqVVhqZYfarKw +1MsPtVqR206pWWGpVh9qtLDUqw+1UpHbTqlZYfaplh9qsrD7VMsPtVKR206px6w+1TLD7VZWH2qZ +YfavNUj8rp1SqsPtUyw+1WVh9qmWH2qlI7adUrLD7VMsPtVlYfaplh9qpSO2nVKqw1MsPtVlYamW +H2q1I7adUrLDUqw+1WlhqVYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adU//Z + diff --git a/corpus/m6/native-features-01/read/page-015.pdf b/corpus/m6/native-features-01/read/page-015.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0a3ae700a489e434e9986dc59bd0acbb1da2e8ab Binary files /dev/null and b/corpus/m6/native-features-01/read/page-015.pdf differ diff --git a/corpus/m6/native-features-01/read/page-015.xml b/corpus/m6/native-features-01/read/page-015.xml new file mode 100644 index 0000000000000000000000000000000000000000..ccf3b49b32f8b45354490cbd0a4f9bceda0b6a02 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-015.xml @@ -0,0 +1,300 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAEImSURBVHheDbiBV2GL+v+/f9V1q+uk46TjpDFp +TBqDMUhoh3Zoh3Zoh3Zoh3YYgzE0Jo1J46TjpOOk61Yf32pZ1bKqZVXLqpZV/W2/8y8863nez/v1 +AgAAaAL+vxagiQQ0twIt7cC/yACpA/h3J9BKBdq6gPZu4D90gNwD/NQLdDABSh/Q2Q/8zAaoA8Av +g0AXF6DxgG4B8KsQoIuA3yRAjxRgyIBeBfACBJhK4KUa6IMAlgbo1wGvYICtB14bgQEE4JiAQQvw +BgW4VuCtHeBhAN8BCFzAOxwQuoH3XkBEAGIfIAkAQ0FAGgKGI4AsCshjgGIFGEkA4CowugYoU4Bq +HVBvAGMZANoExrcATQ7QbgO6HWCiAMC7wOQeoC8Bhn3AeAhMlQHkCJg+AUwVwHwKWM6BmSqAXgCz +V4C1BtiuAfstMFcHsDtg/gFwNADnI+B6BhYAoPn/a2puamluJjW3tDb/q72ZRG7+d0dza2dzG7W5 +vav5P93NZHrzTz3NHb3NFGZzZ1/zz/3NVHbzLwPNXYPNNG5zN6/5V0EzXdj8m6i5R9LMkDb3yppf +KJqZYPNLZXOfupkFNfdrml/pmtlw82t984CxmYM0D5qa31iauWjzW2szz97Mx5oFjuZ3rmYh3vze +3SzyNouJZomveSjQLA02D4eaZZFmebRZEWseWWkGE82jq83KtWZVqlm93jy20Qxlmsc3mzVbzdpc +s267eWKnGS40T+426/eaDaVm437z1GEzUm6ePmo2nTSbK82W0+aZ82a02jx70Wy9arbVmu3XzXO3 +zVi9ef6u2fHQ7Gw0ux6bF56bcQAgNTX9MxtSC4n0r1YSqZ30bzKptYPU1klqp5L+00Uid5N+opM6 +ekiUXlInk/RzH4naT/qFTeoaINEGSd1c0q88El1A+k1I6hGRGBJSr5T0QkZiKkgvQVKfksRSk/oh +0isNia0jvYZJA3oSx0gaREhvTCSuhfQWJfGsJL6dJMBI7xwkoYv0HieJ3CSxlyQhSEM+kjRAGg6S +ZCGSPEJSREkjMRK4QhpNkJSrJNUaSZ0ija2ToA3SeIak2SRpt0i6HGlimwTvkCYLJP0uybBHMpZI +U/sk5JA0XSaZjkjmE5KlQpo5JaHnpNkqyXpBsl2R7DXS3DUJuyXN10mOO5LzgeRqkBYeSfgzaREA +2pqb2lpa2v5FaiO1tv27va2V3NbW0dbe2fYfahu5q+2n7rYOehulp62zt+1nZhu1r+2X/rYudhtt +oK17sO1Xbhud1/aboK1H2MYQtfVK2l5I25iytpeKtj6wjaVs61e3vYLa2Jq217q2AbiNo28bNLa9 +Qdq4pra3ljYe2sa3tgnsbe+wNqGj7b2rTYS3id1tEm/bENEm9bUNB9pkwTZ5qE0RaRuJtoGxttGV +NmWiTbXapl5rG0u1Qett4xttmkybdrNNt9U2kWuDt9smd9r0hTbDbptxr22q1Ibst00ftpnKbeaj +NstJ20ylDT1tmz1vs1bbbBdt9qu2uVobdt02f9vmqLc579pcD20LjTb8sW3xuc0NAOSWJvK/Wsgk +EvnfreTWdnIbmdzeQf5PJ5lMJf/URe7oJlPo5M4e8s+9ZCqT/EsfuaufTGOTuwfIvw6S6Vzybzxy +j4DMEJJ7ReQXEjJTSn4pI/cpyCyQ3K8kv1KT2RD5tYY8oCNzYPKgnvzGSOYi5LcmMs9C5qNkgZX8 +zk4WYuT3DrLIRRbjZImbPOQlSwnysI8sC5DlQbIiRB6JkMEoeTRGVq6QVQmyepU8tkaGUuTxdbJm +g6zNkHWb5IktMpwjT26T9TtkQ4Fs3CVP7ZGREnl6n2w6JJvLZMsReeaEjFbIs6dk6znZViXbL8hz +V2SsRp6/Jjtuyc462XVHXngg4w3y4iPZ/Uz2AADlX00UUgvl3yRKayulrZ3STqb8p4NC7qT8RKV0 +dFEo3ZROOuXnHgq1l/ILk9LVR6H1U7rZlF8HKPRBym9cSg+PwhBQeoWUFyIKU0J5KaX0ySgsBaUf +pLxSUthqymuIMqChcHSUQZjyRk/hGilvEQrPROFbKAKU8s5KEdop7zGKyEERuygSnDLkpki9lGGC +IvNR5AGKIkgZCVHACGU0SlHGKKoVijpBGVulQGuU8RRFs07RblB0GcrEJgXeokzmKPptimGHYixQ +pnYpyB5lukQx7VPMhxRLmTJzREFPKLMVivWUYjun2KuUuQsKdkWZr1Ec1xTnLcVVpyzcUfAHymKD +4n6keJ4pXgCgkpqo/26htpKoba3U9nbqf/7ZnA7qT53UDiqV0kXt7Kb+TKdSe6i/9FK7mFRaH7W7 +n/orm0ofoP42SO3hUhk8aq+A+kJIZYqoLyXUPimVJaP2K6ivQCpbSX2tpg5AVI6GOqijvoGpXD31 +rZHKQ6h8E1Vgob5DqUIr9b2dKsKoYgdV4qIO4VSpmzrspcoIqtxHVQSoI0EqGKKORqjKKFUVo6pX +qGMJKrRKHV+jalJU7TpVt0GdyFDhTerkFlWfoxq2qcYd6lSBiuxSp/eophLVvE+1HFJnylT0iDp7 +QrVWqLZTqv2cOlelYhfU+Suqo0Z1XlNdt9SFOhW/oy4+UN0NqueR6n2mLgEA7d9NtNYWWhuJ1t5K ++087jUym/dRB6+ikUai0zi7az900Kp32Sw+tq5dGY9K6+2i/9tPobNpvA7SeQRqDS+vl0V4IaEwh +7aWI1iehsaS0fhntlYLGBmmvlbQBNY0D0QY1tDc6GhemvdXTeEYaH6EJTLR3FpoQpb230kR2mhij +SRy0IRdNitOG3TSZlyYnaAofbSRAA4O00RBNGaGpojR1jDa2QoMStPFVmmaNpk3RdOu0iQ0anKFN +btL0WzRDjmbcpk3t0JACbXqXZtqjmUs0yz5t5pCGlmmzRzTrCc1WodlPaXPnNKxKm7+gOa5ozhrN +dU1buKXhddriHc39QPM0aN5H2tIzjQAAemsTva2F3k6i/6eVTm6n/0Smd3TQ/7mrTir95y46tZv+ +C53e1UOn9dK7mfRf++j0fvpvbHrPAJ0xSO/l0l/w6EwB/aWQ3ieisyT0fin9lYzOVtBfg/QBJZ2j +pg9C9DcaOldHfwvTeXo630gXIPR3JrrQQn+P0kVWuthOl2D0IQdd6qIP43SZmy730hUEfcRHBwP0 +0SBdGaKrInR1lD4Wo0Mr9PEEXbNK167RdSn6xDod3qBPZuj6Tbphi27M0ae26cgOfbpAN+3SzXt0 +S4k+s09HD+mzZbr1iG47odsr9LlTOnZOn6/SHRd05xXdVaMvXNPxW/pine6+o3se6N4GfemRTjzT +lwGA0dbEaG9h/IfEILcyfmpndJAZlA5GZyfjZyqD2sX4pZvRRWfQehjdvYxfmQx6H+O3fkYPm8EY +YPQOMl5wGUwe46WA0SdksESMfgnjlZTBljFeKxgDIIOjZAyqGW8gBlfDeKtj8GAGX88QGBnvEIbQ +xHhvYYhQhtjKkNgZQxhD6mAMuxgynCF3MxRexgjBAH2M0QBDGWSoQgx1hDEWZUAxxvgKQ5NgaFcZ +ujXGRIoBrzMmNxj6DMOwyTBuMaZyDGSbMb3DMBUY5l2GZY8xU2Kg+4zZQ4a1zLAdMewnjLkKAztl +zJ8zHFWG84LhumIs1Bj4NWPxluGuMzx3DO8DY6nBIB4Zy88MHwAw25uY/2lhkknMn1qZHe1MCpnZ +2cH8uZNJpTJ/6WJ2dTNpdGZ3D/PXXiadyfytj9nTz2Swmb0DzBeDTCaX+ZLH7BMwWUJmv4j5SsJk +S5mvZcwBBZMDMgeVzDdqJhdivtUweTomH2YK9Mx3RqYQYb43MUUWphhlSqzMITtTijGHHUyZiynH +mQo3c8TLBAnmqI+pDDBVQaY6xByLMKEoczzG1KwwtQmmbpU5scaEU8zJdaZ+g2nIMI2bzKktJpJj +Tm8zTTtMc4Fp2WXO7DHREnN2n2k9ZNrKTPsRc+6EiVWY86dMxznTWWW6LpgLV0y8xly8ZrpvmZ46 +03vHXHpgEg3m8iPT98z0AwDrP00scgvrJxKro5VFaWd1klk/d7ConaxfqKyuLhatm9VNZ/3aw6L3 +sn5jsnr6WIx+Vi+b9WKAxRxkveSy+ngsloDVL2S9ErHYEtZrKWtAxuIoWIMg642SxVWz3kIsnobF +17EEMOudniU0st4jLJGJJbawJChryMqS2lnDGEvmYMldLAXOGnGzQC9rlGApfSxVgKUOssZCLCjC +Go+yNDGWdoWlS7AmVlnwGmsyxdKvswwbLGOGNbXJQrZY0zmWaZtl3mFZCqyZXRa6x5otsaz7LNsh +y15mzR2xsBPWfIXlOGU5z1muKmvhgoVfsRZrLPc1y3PL8tZZS3cs4oG13GD5Hln+Z1YAANjkJvZP +LewOEpvSyu5sZ/9MZlM72L90sruobFoXu7ub/Sv9n8hh/9bL7mGyGX3s3n72CzabOcB+Ocju47JZ +PHa/gP1KyGaL2K8l7AEpmyNjDyrYb0A2V8l+q2bzIDZfwxbo2O9gtlDPfm9kixC22MSWWNhDKFtq +ZQ/b2TKMLXewFS72CM4G3exRL1tJsFU+tjrAHguyoRB7PMLWRNnaGFu3wp5IsOFV9uQaW59iG9bZ +xg32VIaNbLKnt9imHNu8zbbssGcKbHSXPbvHtpbYtn22/ZA9V2ZjR+z5E7ajwnaesl3n7IUqG79g +L16x3TW255rtvWUv1dnEHXv5ge1rsP2P7MAz+wMAcH5q4nS0cCgkTmcr5+d2DpXM+aWD09XJoVE5 +3V2cX7s5dDrntx5OTy+HweT09nFe9HOYbM7LAU7fIIfF5fTzOK8EHLaQ81rEGZBwOFLOoIzzRsHh +gpy3Sg5PzeFDHIGG807HEcKc93qOyMgRIxyJiTNk4UhRzrCVI7Nz5BhH4eCMuDggzhl1c5Rejorg +qH2csQAHCnLGQxxNhKONcnQxzsQKB05wJlc5+jWOIcUxrnOmNjhIhjO9yTFtccw5jmWbM7PDQQuc +2V2OdY9jK3Hs+5y5Qw5W5swfcRwnHGeF4zrlLJxz8Cpn8YLjvuJ4ahzvNWfplkPUOct3HN8Dx9/g +BB45H545QQDgdjRxKS3cThL351YutZ37C5nb1cGldXK7qdxfu7j0bu5vdG5PD5fRy+1lcl/0cZn9 +3Jdsbt8AlzXI7edyX/G4bAH3tZA7IOJyJNxBKfeNjMtVcN+CXJ6Sy1dzBRD3nYYr1HHfw1yRnis2 +ciUId8jElVq4wyhXZuXK7VwFxh1xcEEXdxTnKt1clZerJrhjPi4U4I4HuZoQVxvh6qLciRgXXuFO +Jrj6Va5hjWtMcafWucgGdzrDNW1yzVtcS447s81Fd7izBa51l2vb49pL3Ll9LnbInS9zHUdc5wnX +VeEunHLxc+5ileu+4HquuN4ad+maS9xyl+tc3x3X/8ANNLgfHrnBZ+5HAOBTmvidLfyfSXxqK/+X +dn4XmU/r4Hd38n+l8uld/N+6+T10PqOH39vLf8HkM/v4L/v5fWw+a4DfP8h/xeWzefzXAv6AkM8R +8Qcl/DdSPlfGf6vg80A+X8kXqPnvIL5Qw3+v44tgvljPlxj5QwhfauIPW/gylC+38hV2/gjGBx38 +URdfifNVbr7ayx8j+JCPPx7ga4J8bYivi/Anonw4xp9c4esTfMMq37jGn0rxkXX+9AbflOGbN/mW +Lf5Mjo9u82d3+NYC37bLt+/x50p8bJ8/f8h3lPnOI77rhL9Q4eOn/MVzvrvK91zwvVf8pRqfuOYv +3/J9db7/jh944H9o8IOP/I/P/BAACDubhD+3CKkk4S+twq52IY0s7O4Q/toppFOFv3UJe7qFDLqw +t0f4olfIZApf9gn7/glktrB/QPhqUMjmCl/zhAMCIUcoHBQJ30iEXKnwrUzIUwj5oFCgFL5TC4WQ +8L1GKNIJxbBQohcOGYVSRDhsEsosQjkqVFiFI3YhiAlHHUKlS6jChWq3cMwrhAjhuE+oCQi1QaEu +JJyICOGocDIm1K8IDQmhcVU4tSZEUsLpdaFpQ2jOCC2bwpktIZoTzm4LrTtCW0Fo3xXO7QmxknB+ +X+g4FDrLQteRcOFEiFeEi6dC97nQUxV6L4RLV0KiJly+Fvpuhf66MHAn/PAgDDaEHx+FoWdhGADE +PzeJqS3iX0jirlYxrV3cTRb/2iGmd4p/o4p7usSMbnEvXfyiR8zsFb9kivv6xKx+cT9b/GpAzB4U +v+aKB3hijkA8KBS/EYm5EvFbqZgnE/MVYgEofqcUC9Xi95BYpBGLdWIJLB7Si6VG8TAilpnEcotY +gYpHrGLQLh7FxEqHWOUSq3HxmFsMecXjhFjjE2sDYl1QPBESwxHxZFSsj4kNK2JjQjy1KkbWxNMp +sWldbN4QWzLimU0xuiWezYmt22LbjtheEM/tirE98XxJ7NgXOw/FrrJ44UiMn4gXK2L3qdhzLvZW +xUsXYuJKvFwT+67F/ltxoC7+cCcOPog/NsShR3H4WRwBACm1SfpLi7SLJKW1Srvbpb+SpfQO6W+d +0h6qlNEl7e2WvqBLmT3Sl73SPqaU1Sft75e+Ykv/eVevB6UDXCmHJx0USN8IpVyR9K1EypNK+TKp +QCF9B0qFSul7tVQEScUaqUQnHYKlUr102CiVIVK5SaqwSEdQKWiVjtqlSkyqckjVLukYLoXc0nGv +VENItT6pLiCdCErhkHQyItVHpYaY1LginUpIkVXp9JrUlJKa16WWDelMRopuSme3pNac1LYtte9I +5wpSbFc6vyd1lKTOfanrULpQluJH0sUTqbsi9ZxKvefSpaqUuJAuX0l9Nan/Whq4lX6oS4N30o8P +0lBDGn6URp6lnwBA/kuTvKtFTiPJu1vlv7bL6WT5bx3ynk45gyrv7ZK/6JYz6fKXPfK+XjmLKe/v +k7/ql7PZ8tcD8oFBOYcrH+TJ3wjkXKH8rUjOk8j5UrlAJn+nkAtB+XulXKSWiyG5RCMf0smlsHxY +L5cZ5XJErjDJRyxyEJWPWuVKu1yFydUO+ZhLDuHycbdc45VrCbnOJ58IyOGgfDIk10fkhqjcGJNP +rciRhHx6VW5ak5tTcsu6fGZDjmbks5ty65bclpPbt+VzO3KsIJ/flTv25M6S3LUvXziU42X54pHc +fSL3VOTeU/nSuZyoypcv5L4rub8mD1zLP9zKg3X5xzt56EEebsgjj/JPz/IoAIBdTSCtBewmgb+2 +gvR28Dcy2NMBMjrBXir4ogtkdoMv6WBfD8jqBfuZ4Ks+kN0PvmaDAwMgZxAc5IJveCBXAL4VgjwR +yJeAAin4TgYKFeB7EBQpQbEalEDgkAaU6sBhGJTpQbkRVCDgiAkELeAoCiqtoMoOqjFwzAFCLnAc +BzVuUOsFdQQ44QPhADgZBPUh0BABjVFwKgYiK+B0AjStguY10JICZ9ZBdAOczYDWTdC2Bdpz4Nw2 +iO2A8wXQsQs690BXCVzYB/FDcLEMuo9AzwnorYBLpyBxDi5XQd8F6L8CAzXwwzUYvAU/1sHQHRh+ +ACMN8NMjGH0GPwOAitak6m5R/UpS0VtVv7WresgqRoeqt1P1gqpidqledqv66CpWj6q/V/WKqWL3 +qV73qwbYKs6AanBQ9Yar4vJUbwUqnlDFF6kEEtU7qUooU71XqESgSqxUSdSqIUgl1aiGdSoZrJLr +VQqjagRRgSbVqEWlRFUqq0ptV41hKsihGnepNLhK61bpvKoJQgX7VJMBlT6oMoRUxohqKqpCYqrp +FZUpoTKvqixrqpmUCl1XzW6orBmVbVNl31LN5VTYtmp+R+UoqJy7KteeaqGkwvdVi4cqd1nlOVJ5 +T1RLFRVxqlo+V/mqKv+FKnCl+lBTBa9VH29VoboqfKeKPKg+NVTRR9XnZ1UMAKDuJujXFohOgn5r +hXraIQYZ6u2AXnRCTCr0sgvq64ZYdKi/B3rVC7GZ0Os+aKAf4rChwQHozSDE5UJveRBP8M8nhwQi +6J0EEkqh9zJIpIDEICRRQkNqSApBwxpIpoPkMKTQQyNGCESgUROktEAqFFJboTE7BGHQuAPSuCAt +Dunc0IQXgglo0gfpA5AhCBlD0FQEQqLQdAwyrUDmBGRZhWbWIDQFza5D1g3IloHsm9DcFoTloPlt +yLEDOQuQaxda2IPwErS4D7kPIU8Z8h5BSycQUYGWTyHfOeSvQoEL6MMVFKxBH6+h0C0UrkORO+jT +AxRtQJ8fodgzFAcA7a9NWnqL9jeStqdVy2jX9pK1Lzq0zE7tS6q2r0vL6tb207WverTsXu1rpnag +T8vp1w6ytW8GtNxB7VuulsfT8gVagVD7TqQVSrTvpVqRTCtWaCWgdkiplaq1w5BWptHKdVoFrB3R +a0GjdhTRKk1alUWrRrVjVi1k145jWo1Dq3Vpdbh2wq2FvdpJQqv3aQ0BrTGonQppkYh2Oqo1xbTm +Fa0loZ1Z1aJr2tmU1rqutW1o7Rnt3KYW29LO57SOba1zR+sqaBd2tfiedrGkde9rPYdab1m7dKQl +TrTLFa3vVOs/1waq2g8X2uCV9mNNG7rWhm+1kbr20502+qD93NDGHrXxZ+0KAMD0Jvi3FriHBDNa +4d52+AUZZnbALzvhPirM6oL7u+FXdJjdA7/uhQeYMKcPHuyH37Bh7gD8dhDmcWE+DxYI4HdCWCiC +30tgkRQWy2CJAh4CYakSHlbDMgiWa2CFDh6BYVAPjxphJQKrTLDaAo+hMGSFx+2wBoO1Dljngidw +GHbDk15YT8AGH2wMwFNBGAnB0xHYFIXNMdiyAs8kYHQVnl2DrSnYtg7bN+C5DIxtwvNbsCMHO7dh +1w68UIDxXXhxD3aXYM8+7D2El8owcQQvn8C+Cuw/hQPn8IcqHLyAP17BoRocvoYjt/CnOhy9gz8/ +wLEGHH+EV57hLwBg+K3J0NNiYJAMva2GF+0GJtnwssPQ12lgUQ39XYZX3QY23fC6xzDQa+AwDYN9 +hjf9Bi7b8HbAwBs08LkGAc/wTmAQCg3vRQaRxCCWGiQyw5DCIAUNw0qDTG2QQwaFxjCiM4CwYVRv +UBoNKsSgNhnGLAYINYxbDRq7QYsZdA7DhMsA44ZJt0HvNRgIg9FnmAoYkKBhOmQwRQzmqMESM8ys +GNCEYXbVYF0z2FIG+7phbsOAZQzzmwbHlsGZM7i2DQs7BrxgWNw1uPcMnpLBu29YOjQQZcPykcF3 +YvBXDIFTw4dzQ7Bq+HhhCF0ZwjVD5Nrw6dYQrRs+3xliD4Z4w7DyaPjybEgAANLThDBakF4S8qIV +YbYjL8lIXwfC6kT6qcirLoTdjbymIwM9CKcXGWQib/oQbj/ylo3wBhD+ICLgIu94iFCAvBciIhEi +liASKTL0T89RIMMgIlMicjWigJARDQLqkFEYUeoRlRFRI8iYCYEsyDiKaKyI1o7oMGTCgcAuZBJH +9G7E4EWMBDLlQ5AAMh1ETCHEHEEsUWQmhqAryGwCsa4itjXEnkLm1hFsA5nPII5NxLmFuHLIwjaC +7yCLBcS9i3j2EG8JWdpHiENkuYz4jhD/CRKoIB9OkeA58rGKhC6Q8BUSqSGfrpHoLfK5jsTukPgD +stJAvjwiiWfkKwCYGU3m3hbzC5KZ2Wp+2W7uI5tZHeb+TvMrqpndZX7dbR6gmzk95sFe8xummdtn +fttv5rHN/AGzYND8jmsW8szvBWaR0CwWmSUS85DULJWZhxVmGWiWK80KtXkEMoMa86jOrITNKr1Z +bTSPIWbIZB63mDWoWWs16+zmCcwMO8yTLrMeNxvcZqPXPEWYEZ95OmA2Bc3mkNkSMc9EzWjMPLti +tibMtlWzfc08lzJj6+b5DbMjY3Zuml1b5oWcGd82L+6Y3QWzZ9fs3TMvlczEvnn50Owrm/1H5sCJ ++UPFHDw1fzw3h6rm8IU5cmX+VDNHr82fb82xujl+Z155MH9pmBOP5q/P5lUAQHub0BctKJOEvmxF ++9pRFhnt70BfdaJsKvq6Cx3oRjl0dLAHfdOLcpno2z6U14/y2ahgAH03iAq56HseKhKgYiEqEaFD +ElQqRYdlqEyB/tMCFUp0RI2CEDqqQZU6VAWjaj06ZkQhBB03oRoLqkVRnRWdsKMwhk46UL0LNeCo +0Y1OeVGEQKd9qCmAmoOoJYTORFA0is7GUOsKakug9lV0bg3FUuj8OurYQJ0Z1LWJLmyheA5d3Ebd +O6ingHp30aU9lCihy/uo7xD1l9HAEfrhBA1W0I+naOgcDVfRyAX66QqN1tDP12jsFo3X0ZU79MsD +mmigXx/R1Wc0CQC2F002ZovtJcnW12pjtdv6ybZXHTZ2p+011TbQZeN02wbptjc9Nm6v7S3Txuuz +8fttArbt3YBNOGh7z7WJeDaxwCYR2oZENqnENiy1yWQ2ucKmAG0jShuoto1CNqXGptLZ1LBtTG+D +jLZxxKYx2bQWmw61TVhtsN02idn0DpvBZTPitim3DfHapgmbyWczB2yWoG0mZEMjttmozRqz2VZs +9oRtbtWGrdnmUzbHus25YXNlbAubNnzLtpizubdtnh2bt2Bb2rURe7blks23b/Mf2gJl24cjW/DE +9rFiC53awue2SNX26cIWvbJ9rtli17b4rW2lbvtyZ0s82L42bKuPtuSzbQ0AMGYT9rIF6yNhrFas +vx17RcbYHdjrTmyAinG6sMFu7A0d4/Zgb3sxHhPj92GCfuwdGxMOYO8HMREXE/MwiQAbEmJSETYs +wWRSTC7DFApsBMRAJTaqxpQQptJgah02BmOQHhs3YhoE05ownQWbQDHYik3aMT2GGRyY0YVN4Rji +xqa9mInAzD7MEsBmghgawmYjmDWK2WKYfQWbS2DYKja/hjlSmHMdc21gCxkM38QWtzB3DvNsY94d +bKmAEbvY8h7mK2H+fSxwiH0oY8Ej7OMJFqpg4VMsco59qmLRC+zzFRarYfFrbOUW+1LHEnfY1wds +tYElH7G1Z+wbADhfNjn7WpwskrO/1fmq3ckmO193OAc6nRyqc7DL+abbyaU73/Y4eb1OPtMp6HO+ +63cK2c73A07RoFPMdUp4ziGBUyp0DoucMolTLnUqZM4RhRMEnaNKp1LtVEFOtcY5pnNCsHNc79QY +nVrEqTM5JyxOGHVOWp16u9OAOY0O55TLieDOabfT5HWaCafF55wJONGgczbktEactqjTHnPOrTix +hHN+1elYczpTTte6c2HDiWeci5tO95bTk3N6t51LO06i4Fzedfr2nP6SM7Dv/HDoDJadH4+coRNn +uOKMnDo/nTujVefnC2fsyhmvOVeunV9unYm68+udc/XBmWw41x6d356dKQDA+5pwVgveT8JfteLs +dvw1GR/owDmd+CAVf9OFc7vxt3Sc14Pze3EBE3/Xhwv78fdsXDSAiwdxCRcf4uFSAT4sxGUiXC7B +FVJ8RIaDCnwUxJVKXKXG1RA+pvmnIOPjMK7R41ojrkPwCRMOW/BJFNdbcYMdN2L4lANHXPg0jpvc +uNmLWwh8xoejAXw2iFtDuC2C26P4XAzHVvD5BO5YxZ1ruCuFL6zj+Aa+mMHdm7hnC/fm8KVtnNjB +lwu4bxf37+GBEv5hHw8e4h/LeOgID5/gkQr+6RSPnuOfq3jsAo9f4Ss1/Ms1nrjFv9bx1Ts8+YCv +NfBvj3jqGf8OAB5Wk6e/xfOK5GG3el63ewbIHk6HZ7DT84bq4XZ53nZ7eHQPv8cj6PW8Y3qEfZ73 +/R4R2yMe8EgGPUNcj5TnGRZ4ZEKPXORRSDwjUg8o84wqPErQo1J61GrPGOSBNJ5xnUcDe7R6j87o +mUA8sMkzafHoUY/B6jHaPVOYB3F4pl0eE+4xuz0Wr2eG8KA+z2zAYw16bCGPPeKZi3qwmGd+xeNI +eJyrHteaZyHlwdc9ixsed8bj2fR4tzxLOQ+x7Vne8fgKHv+uJ7Dn+VDyBPc9Hw89obInfOSJnHg+ +VTzRU8/nc0+s6olfeFauPF9qnsS15+utZ7XuSd551h483xqe1KPn+7NnHQCI/ibiVQvBJhGvW4mB +doJDJgY7iDedBJdKvO0ieN0En04Ieoh3vYSQSbzvI0T9hJhNSAaIoUFCyiWGeYRMQMiFhEJEjEgI +UEqMygilglCBhFpJjKkJCCLGNYRGR2hhQqcnJowEjBCTJkJvIQwoYbQSU3YCwYhpB2FyEWacsLiJ +GS+BEsSsj7AGCFuQsIeIuQiBRYn5GOFYIZwJwrVKLKwReIpYXCfcG4QnQ3g3iaUtgsgRy9uEb4fw +F4jALvFhjwiWiI/7ROiQCJeJyBHx6YSIVojPp0TsnIhXiZUL4ssVkagRX6+J1VsiWSfW7ohvD0Sq +QXx/JNafiTQA+F81+dkt/tck/0Crn9PuHyT733T4uZ3+t1Q/r8vP7/YL6P53PX5hr/890y/q84v7 +/RK2f2jALx30D3P9Mp5fLvArhP4RkR+U+EelfqXMr1L41aB/TOmH1P5xyK/R+LU6vw72T+j9sNE/ +ifj1Jr/B4jei/imrH7H7pzG/yeE3u/wW3D/j9qNe/yzht/r8toDfHvTPhfxYxD8f9TtifueK35Xw +L6z68TX/YsrvXvd7NvzejH9p009s+Zdzft+237/jDxT8H3b9wT3/x5I/tO8PH/ojZf+nI3/0xP+5 +4o+d+uPn/pWq/8uFP3Hl/1rzr177k7f+tbr/250/9eD/3vCvP/rTz/4NAAiym4KvW4IDpCCnNTjY +HnxDDnI7gm87gzxqkN8VFHQH39GDwp7g+96giBkU9wUl/cEhdlA6EBweDMq4QTkvqBAER4RBUBQc +lQSV0qBKFlQrgmNgEFIGx9VBDRTUaoI6XXACDsL64KQxqP8HH0xBoyU4hQYRa3DaHjRhQbMjaHEF +Z/Ag6g7OeoNWImjzBe2B4FwwiIWC85GgIxp0xoKuleBCIoivBhfXgu5U0LMe9G4ElzJBYjO4vBX0 +5YL+7WBgJ/ihEAzuBj/uBUOlYHg/GDkMfioHo0fBzyfBWCUYPw2unAe/VIOJi+DXq+BqLZi8Dq7d +Br/Vg6m74PeH4HojmH4MbjwHfwBA+HVTeKAlzCGFB1vDb9rDXHL4bUeY1xnmU8OCrvC77rCQHn7f +Exb1hsXMsKQvPNQflrLDwwNh2WBYzg0reOERQRgUhkdFYaUkrJKG1bLwmCIMgeFxZVijDmuhsE4T +ntCFYTg8qQ/rjWEDEjaawlOWMIKGp61hkz1sxsIWR3jGFUbx8Kw7bPWGbUTY7gvPBcJYMDwfCjsi +YWc07IqFF1bCeCK8uBp2r4U9qbB3Pby0ESYy4eXNsG8r7M+FA9vhDzvhYCH8cTcc2guHS+HIfvjT +YThaDn8+CsdOwvFKeOU0/OU8nKiGv16EV6/CyVp47Tr87Tacqoe/34XXH8LpRnjjMfzjOZwBgOhA +U5TTEh0kRd+0Rrnt0bfkKK8jyu+MCqjRd11RYXf0PT0q6omKe6MSZnSoLyrtjw6zo7KBqHwwquBG +R3hRUBAdFUaVoqhKElVLo2OyKKSIjoNRjTKqVUd1UHRCE4V10Uk4qtdHDcaoEYlOmaL/wNU0GjVZ +o2Z71IJFZxxR1BWdxaNWd9TmjdqJ6JwvigWi88GoIxR1RqKuaHQhFsVXoouJqHs16lmLelPRpfUo +sRFdzkR9m1H/VjSQi37YjgZ3oh8L0dBuNLwXjZSin/aj0cPo53I0dhSNn0RXKtEvp9HEefRrNbp6 +EU1eRddq0W/X0dRt9Hs9un4XTT9ENxrRH4/RzHP0dwCIc5rigy3xN6Q4tzX+tj3OI8f5HXFBZ/wd +NS7sir/vjovocXFPXNIbH2LGpX3x4f64jB2XD8QVg/ERbhzkxUcFcaUwrhLF1ZL4mDQOyeLjirgG +jGuVcZ06PgHFYU18UhfXw3GDPm40xqeQOGKKT1viJjRutsYt9vgMFkcd8VlX3IrHbe643RufI+KY +Lz4fiDuCcWco7orEF6JxPBZfXIm7E3HPaty7Fl9KxYn1+PJG3JeJ+zfjga34h1w8uB3/uBMPFeLh +3XhkL/6pFI/uxz8fxmPlePwovnIS/1KJJ07jX8/jq9V48iK+dhX/VounruPfb+Pr9Xj6Lr7xEP/R +iGce478/xzcBIDHYlHjTkuCSEm9bE7z2BJ+cEHQk3nUmhNTE+66EqDshpickPYmh3oSUmRjuS8j6 +E3J2QjGQGBlMgNzEKC+hFCRUwoRalBiTJCBpYlyW0CgSWjChUyYm1AkYSkxqEnpdwgAnjPrElDGB +IIlpU8JkSZjRhMWamLEnUCwx60hYXQkbnrC7E3PeBEYk5n0JRyDhDCZcocRCJIFHE4uxhHsl4Ukk +vKuJpbUEkUosryd8Gwl/JhHYTHzYSgRziY/bidBOIlxIRHYTn/YS0VLi834idpiIlxMrR4kvJ4lE +JfH1NLF6nkhWE2sXiW9XiVQt8f06sX6bSNcTG3eJHw+JTCPx+2Ni8zmRBYDkm6YktyX5lpTktSb5 +7UkBOfmuIynsTL6nJkVdSXF3UkJPDvUkpb3JYWZS1peU9ycV7OTIQBIcTI5yk0peUiVIqoXJMVES +kiTHpUmNLKlVJHVgckKZhNXJSSip1yQNuqQRTk7pk4gxOY0kTaak2ZK0oMkZaxK1J2expNWRtLmS +djw5505i3uQ8kXT4ks5A0hVMLoSSeCS5GE26Y0nPStKbSC6tJom15HIq6VtP+jeSgUzyw2YyuJX8 +mEuGtpPhnWSkkPy0m4zuJT+XkrH9ZPwwuVJOfjlKJk6SXyvJ1dNk8jy5Vk1+u0imrpLfa8n162T6 +NrlRT/64S2Yekr83kpuPyexzcgsAUtym1NuWFI+U4remBO2pd+SUsCP1vjMloqbEXSlJd2qInpL2 +pIZ7UzJmSt6XUvSnRtgpcCA1OphSclMqXkotSI0JU5AoNS5JaaQprSylU6QmwBSsTE2qU3ooZdCk +jLrUFJxC9KlpY8qEpMymlMWSmkFTqDU1a09ZsX+4M2V3pebwFOZOzXtTDiLl9KVcgdRCMIWHUouR +lDua8sRS3pXUUiJFrKaW11K+VMq/ngpspD5kUsHN1MetVCiXCm+nIjupT4VUdDf1eS8VK6Xi+6mV +w9SXcipxlPp6klqtpJKnqbXz1LdqKnWR+n6VWq+l0tepjdvUj3oqc5f6/SG12UhlH1Nbz6k/ACD9 +tinNa0nzSWlBa/pde1pITr/vSIs602JqWtKVHupOS+np4Z60rDctZ6YVfemR/jTITo8OpJWDaRU3 +realxwRpSJgeF6U1krRWmtbJ0hOKNAymJ5VpvTptgNJGTXpKl0bg9LQ+bTKmzUjaYkrPWNIomp61 +pq32tA1L2x3pOVcaw9Pz7rTDm3YSaZcvvRBI48H0YijtjqQ90bQ3ll5aSROJ9PJq2reW9qfSgfX0 +h410MJP+uJkObaXDuXRkO/1pJx0tpD/vpmN76XgpvbKf/nKYTpTTX4/SqyfpZCW9dpr+dp5OVdPf +L9LrV+l0Lb1xnf5xm87U07/fpTcf0tlGeusx/cdzOgcAGV5Tht+SEZAy71ozwvbMe3JG1JERd2Yk +1MxQV0banRmmZ2Q9GXlvRsHMjPRlwP7MKDujHMioBjNqbmaMl4EEmXFhRiPKaCUZnTQzIcvAiswk +mNErMwZ1xghlpjQZRJeZhjMmfcZszFiQzIwpg1oys2jGas3Y7Bk7lplzZDBXZh7PONwZpzfjIjIL +vgweyCwGM+5QxhPJeKOZpViGWMksJzK+1Yx/LRNIZT6sZ4IbmY+ZTGgzE97KRHKZT9uZ6E7mcyET +283E9zIrpcyX/UziMPO1nFk9yiRPMmuVzLfTTOo8872aWb/IpK8yG7XMj+tM5jbzez2zeZfJPmS2 +Gpk/HjO558yfAJDlN2UFLdl3pKywNfu+PSsiZ8UdWUlndoialXZlh7uzMnpW3pNV9GZHmFmwLzva +n1Wys6qBrHowO8bNQrzsuCCrEWa1oqxOkp2QZmFZdlKR1YNZgzJrVGenoCyiyU7rsiY4a9ZnLcbs +DJJFTdlZS9aKZm3WrN2encOymCM778o68KzTnXV5swtEFvdlFwNZdzDrCWW9kexSNEvEsssrWV8i +61/NBtayH1LZ4Hr240Y2lMmGN7ORreynXDa6nf28k40VsvHd7Mpe9kspm9jPfj3MrpazyaPs2kn2 +WyWbOs1+P8+uV7Ppi+zGVfZHLZu5zv5+m92sZ7N32a2H7B+NbO4x++dzdhsAcoKm3LuWnJCUe9+a +E7XnxOScpCM31JmTUnPDXTlZd05Ozyl6ciO9OZCZG+3LKftzKnZOPZAbG8xB3Nw4L6cR5LTCnE6U +m5DkYGluUpbTK3IGMGdU5qbUOQTKTWtyJl3ODOcs+tyMMYciuVlTzmrJ2dCc3Zqbs+cwLDfvyDlc +OSeec7lzC/9QOZFb9OXcgZwnmPOGckuRHBHNLcdyvpWcP5ELrOY+rOWCqdzH9VxoIxfO5CKbuU9b +uWgu93k7F9vJxQu5ld3cl71copT7up9bPcwly7m1o9y3k1yqkvt+mls/z6WruY2L3I+rXKaW+/06 +t3mby9ZzW3e5Px5yuUbuz8fc9nMuDwD5d015YUv+PSkvas2L2/MScn6oIy/tzA9T87KuvLw7r6Dn +R3ryYG9+lJlX9uVV/Xk1Oz82kIcG8+PcvIaX1wryOmF+QpSHJflJaV4vyxsUeSOYn1LmEXV+Gsqb +NHmzLm+B8zP6PGrMzyJ5qylvs+TtaH7Omsfs+Xks73Dkna68C88vuPO4N79I5N2+vCeQ9wbzS6E8 +EckvR/O+WN6/kg8k8h9W88G1/MdUPrSeD2/kI5n8p818dCv/OZePbefjO/mVQv7Lbj6xl/9ayq/u +55OH+bVy/ttRPnWS/17Jr5/m0+f5jWr+x0U+c5X/vZbfvM5nb/Nb9fwfd/ncQ/7PRn77MZ9/zu8A +QEHYVHjfUhCRCuLWgqS9MEQuSDsKw50FGbUg7yoougsj9ALYUxjtLSiZBVVfQd1fGGMXoIHC+GBB +wy1oeQWdoDAhLMCiwqSkoJcWDLKCUVGYAguIsjCtLpiggllTsOgKM3AB1RdmjQUrUrCZCnZLYQ4t +YNbCvL3gwApOR8HlKizgBdxdWPQW3EThH2fhDRSWggUiVFiOFHzRgj9WCKwUPiQKwdXCx7VCKFUI +rxciG4VPmUJ0s/B5qxDLFeLbhZWdwpdCIbFb+LpXWC0VkvuFtcPCt3IhdVT4flJYrxTSp4WN88KP +aiFzUfj9qrBZK2SvC1u3hT/qhdxd4c+HwnajkH8s7DwX/gKA4vumoqilKCYVJa3FofailFwc7ijK +OotyalHRVRzpLoL04mhPUdlbVDGL6r7iWH8RYhfHB4qawaKWW9TxihOCIiwsToqKeknRIC0aZcUp +RREBi9PKokldNENFi6Y4oyuicHFWX7QaizakaDcV5yxFDC3OW4sOe9GJFV2O4oKriOPFRXfR7S16 +iKLXV1wKFIlgcTlU9EWK/mgxECt+WCkGE8WPq8XQWjGcKkbWi582itFM8fNmMbZVjOeKK9vFLzvF +RKH4dbe4uldMlopr+8Vvh8VUufj9qLh+UkxXihunxR/nxUy1+PtFcfOqmK0Vt66Lf9wWc/Xin3fF +7YdivlHceSz+9VwsAEBJ1FQSt5QkpNJQa0naXhoml2QdJXlnSUEtjXSVwO7SKL2k7CmpektqZmms +rwT1l8bZJc1ASTtY0nFLE7wSLChNCkt6UckgKRmlpSlZCVGUpsGSSVkyq0sWqDSjKaG60ixcsupL +NmPJjpTmTCXMUppHSw5ryWkvubDSgqOEu0qLeMntLnm8JS9RWvKViEBpOVjyhUr+SCkQLX2IlYIr +pY+JUmi1FF4rRVKlT+ul6Ebpc6YU2yzFt0orudKX7VJip/S1UFrdLSX3Smul0rf9Uuqw9L1cWj8q +pU9KG5XSj9NS5rz0e7W0eVHKXpW2aqU/rku529Kf9dL2XSn/UNpplP56LBWeS38DwIG46UDScjBE +OpC2Hgy3H8jIB/KOA0XnwQj1AOw6GO0+UNIPVD0H6t6DMeYB1Hcw3n+gYR9oBw50gwcT3AOYdzAp +ONALDwyiA6PkYEp6gMgOphUHJvDArDywqA9moANUczCrO7DCBzb9gd14MIccYKaDecuBAz1wWg9c +9oMF7AB3HCy6Dtz4gcd94PUeLBEHhO9gOXDgCx74QweByMGH6EEwdvBx5SCUOAivHkTWDj6lDqLr +B583DmKZg/jmwcrWwZfcQWL74OvOwWrhILl7sLZ38K10kNo/+H54sF4+SB8dbJwc/KgcZE4Pfj8/ +2KweZC8Otq4O/qgd5K4P/rw92K4f5O8Odh4O/mocFB4P/n4+2AWAsqSpPNRSlpLKw61lWXtZTi4r +OsojnWWQWh7tKiu7yyp6Wd1THustQ8zyeF9Z01/Wssu6gfLEYBnmlid5Zb2gbBCWjaLylKSMSMvT +srJJUTaDZYuyPKMuo1B5VlO26so2uGzXl+eMZQwpz5vKDkvZiZZd1vKCvYxj5UVH2e0qe/Cy111e +8pYJorzsK/sCZX+wHAiVP0T+0Tnlj7FyaKUcTpQjq+VPa+Voqvx5vRzbKMcz5ZXN8petciJX/rpd +Xt0pJwvltd3yt71yqlT+vl9ePyyny+WNo/KPk3KmUv79tLx5Xs5Wy1sX5T+uyrla+c/r8vZtOV8v +79yV/3ooFxrlvx/Lu8/lIgAcDzUdS1uOh0nHstZjefuxgnw80nEMdh6PUo+VXceq7mM1/Xis5xjq +PR5nHmv6jrX9xzr28cTAMTx4PMk91vOODYJjo/B4SnSMSI6npccm2bFZcWwBj2eUx6j6eBY6tmqO +bbpjO3w8pz/GjMfzyLHDdOy0HLvQ4wXrMW4/XsSO3Y5jj+vYix8vuY8J7/EycezzHfsDx4Hg8YfQ +cTBy/DF6HIodh1eOI4njT6vH0bXjz6nj2PpxfON4JXP8ZfM4sXX8NXe8un2c3DleKxx/2z1O7R1/ +Lx2v7x+nD483ysc/jo4zJ8e/V443T4+z58db1eM/Lo5zV8d/1o63r4/zt8c79eO/7o4LD8d/N453 +H4+Lz8d7AFCRNlWGWyoyUkXeWlG0V0bIFbCjMtpZUVIrqq6KursyRq9APZXx3oqGWdH2VXT9lQl2 +BR6oTA5W9NyKgVcxCipTwgoiqkxLKiZpxSyrWBSVGbCCKiuz6ooVqtg0FbuuMgdXMH1l3lhxIBWn +qeKyVBbQCm6tLNorbqzicVS8rsoSXiHclWVvxUdU/L5KIFD5EKwEQ5WPkUooWgnHKpGVyqdEJbpa ++bxWiaUq8fXKykblS6aS2Kx83aqs5irJ7craTuVboZLarXzfq6yXKun9ysZh5Ue5kjmq/H5S2axU +sqeVrfPKH9VK7qLy51Vlu1bJX1d2bit/1SuFu8rfD5XdRqX4WNl7rvwXAM6Gm85kLWdy0pmi9Wyk +/Qwkn412nCk7z1TUM3XX2Vj3GUQ/G+850/SeaZlnur6zif4zmH02OXCmHzwzcM+MvLMpwRkiPJsW +nZkkZ2bpmUV2NqM4Q8GzWeWZVX1mg87smrM53RkGn83rzxzGMydy5jKdLVjOcPRs0Xrmtp95sDOv +42zJdUbgZ8vuM5/3zE+cBXxnHwJnweDZx9BZKHIWjp5FYmefVs6iibPPq2extbN46mxl/ezLxlki +c/Z182x16yyZO1vbPvu2c5YqnH3fPVvfO0uXzjb2z34cnmXKZ78fnW2enGUrZ1unZ3+cn+WqZ39e +nG1fneVrZzvXZ3/dnhXqZ3/fne0+nBUbZ3uPZ/99PisBQFXWVJW3VBWk6khrFWyvjpKryo6qqrOq +plbHuqpQd3WcXtX0VLW9VR2zOtFXhfurk+yqfqBqGKwaudUpXhURVKeFVZOoapZULdLqjKyKKqqz +YNWqrNrUVTtUndNUMV11Hq469FWnsepCqgumKm6pLqJVt7XqsVe9WHXJUSVc1WW86nNX/d5qgKh+ +8FWDgerHYDUUqoYj1Ui0+ilWja5UPyeqsX9k11p1JVX9sl5NbFS/Zqqrm9XkVnUtV/22XU3tVL8X +quu71fRedaNU/bFfzRxWfy9XN4+q2ZPqVqX6x2k1d179s1rdvqjmr6o7tepf19XCbfXvenX3rlp8 +qO41qv99rJaeq/8DgEt506Wi5XKEdAm2Xo62XyrJl6qOS3Xn5Rj1Euq6HO++1NAvtT2Xut7LCeYl +3Hc52X+pZ18aBi6Ng5dT3EuEdzktuDQJL82iS4vkckZ6icouZxWXVvDSpry0qy/noEtMczmvu3TA +l079pct4uYBc4qbLRculG730WC+99ssl7JJwXC67Ln34pd99GfBefiAug77Lj4HLUPAyHLqMRC4/ +RS+jscvPK5exxGV89XJl7fJL6jKxfvl143I1c5ncvFzbuvyWu0xtX37fuVwvXKZ3Lzf2Ln+ULjP7 +l78fXm6WL7NHl1snl39ULnOnl3+eX25XL/MXlztXl3/VLgvXl3/fXu7WL4t3l3sPl/9tXJYeL//3 +fLkPADVFU22kpQaSaqOtNWV7TUWuqTtqY501iFob76ppumtaek3XU5vorcHM2mRfTd9fM7BrxoHa +1GAN4dameTWToGYW1iyi2oykhkprs7KaVVGzgTW7sjanrmFQbV5Tc+hqTrjm0tcWjDUcqS2aam5L +zYPWvNbakr1GYLVlR83nqvnxWsBd++CtBYnaR18tFKiFg7VIqPYpUotGa59jtdhKLZ6orazWvqzV +/lGBX9drqxu1ZKa2tln7tlVL5Wrft2vrO7V0obaxW/uxV8uUar/v1zYPa9lybeuo9sdJLVep/Xla +2z6v5au1nYvaX1e1Qq3293Vt97ZWrNf27mr/faiVGrX/Pdb2n2sHAHAz0nQDttyMkm6UrTeq9hs1 ++Was4wbqvBmn3mi6brTdNzr6zUTPDdx7M8m80ffdGPpvjOybqYEbZPBmmntj4t2YBTcW4c2M6AaV +3MxKb6yyG5vixg7ezClvMPXNPHTj0Nw4dTcu+GZBf4MbbxaRG7fpxmO58aI3S9Ybwn6zjN34HDd+ +100Av/ngvgl6bz4SNyHfTThwEwnefArdRCM3n6M3sdhNfOVmJXHzZfUmsXbzNXWzun6T3LhZy9x8 +27xJbd18z92sb9+kd242Cjc/dm8yeze/l24292+yhzdb5Zs/jm5yJzd/Vm62T2/y5zc71Zu/Lm4K +Vzd/1252r2+Ktzd79Zv/3t2UHm7+17jZf7w5eL45BIA62FQfbakrSXVVa13dXh8j16GO+nhnXUOt +a7vquu76BL0O99Qne+t6Zt3QVzf216fYdWSgPj1YN3HrZl7dIqjPCOuoqD4rqVuldZusblfU58A6 +pqzPq+sOqO7U1F26+gJcx/X1RWPdjdQ9prrXUl9C64S1vmyv+7C631EPuOof8HrQXf/orYeIethX +jwTqn4L1aKj+OVKPRevxWH1lpf4lUU+s1r+u1VdT9eR6fW2j/i1TT23Wv2/V13P19HZ9Y6f+o1DP +7NZ/36tvlurZ/frWYf2Pcj13VP/zpL5dqedP6zvn9b+q9cJF/e+r+m6tXryu793W/1uvl+7q/3uo +7zfqB4/1w+f6/wHA/WjTvbLlXkW6V7fej7XfQ+T78Y57Tee9lnqv67qf6L6H6feTPff63nsD897Y +dz/Vf4+w76cH7k2D92buvYV3PyO4R4X3s6J7q+TeJr23y+7nFPcYeD+vvHeo753QvUtzv6C7x+H7 +Rf2923jvQe69pvslyz2B3i9b7332ez92H3Dcf3DdB/H7j+77kPc+TNxHfPefAvfR4P3n0H0sch+P +3q/E7r+s3CcS919X71fX7pOp+7X1+28b96nM/ffN+/Wt+3TufmP7/sfOfaZw//vu/ebefbZ0v7V/ +/8fhfa58/+fR/fbJfb5yv3N6/9f5faF6//fF/e7VfbF2v3d9/9/b+1L9/n939/sP9weN+8PH+/97 +vi8DQEPZ1FC1NNSkxlhrA2pvjJMbmo6GtrOhozYmuhpwd2OS3tD3NAy9DSOzMdXXQPob0+yGaaBh +HmxYuI0ZXgMVNGaFDauoYZM07NLGnKyBKRrzYMOhbDjVDRfUWNA0cF1jEW649Q2PseFFGkumBmFp +LKMNn7XhtzcCWOODoxF0NT7ijZC7EfY2IkTjk68RDTQ+BxuxUCMeaaxEG19ijcRK42uisbraSK41 +1lKNb+uN1Ebje6axvvmPJW1s5Bo/thuZncbvhcbmbiO719gqNf7Yb+QOG3+WG9tHjfxJY6fS+Ou0 +UThv/F1t7F40ileNvVrjv9eN0m3jf/XG/l3j4KFx2Gj832Oj/Nz4fwDwpGp6Urc8jZGeoNan8fYn +DflJ2/Gk63yaoD7BXU+T3U96+pOh58nY+zTFfEL6nqb7n0zsJ/PAk2XwaYb7hPKeZgVPVuGTTfRk +lzzNSZ8w2dO84skBPjmVTy710wL0hGueFnVPbvjJo3/yGp+WkCfC9LRsefKhT37rU8D+9AF7Cjqe +PrqeQvhT2P0U8T59Ip6ivqfPgadY8CkeelqJPH2JPiViT19XnlYTT8nVp7W1p2+pp9T60/eNp/XM +U3rzaWPr6UfuKbP99PvO02bhKbv7tLX39EfpKbf/9Ofh03b5KX/0tHPy9FflqXD69Pf50271qXjx +tHf19N/aU+n66X+3T/v1p4O7p8OHp/9rPJUfn/7f89PR/w8QCy14LJdV2gAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-features-01/read/page-016.pdf b/corpus/m6/native-features-01/read/page-016.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c7241a829a401f8f730442b490b239e060f8b632 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-016.pdf differ diff --git a/corpus/m6/native-features-01/read/page-016.xml b/corpus/m6/native-features-01/read/page-016.xml new file mode 100644 index 0000000000000000000000000000000000000000..44a4b3ceaefd2c5013d96224b57043ecc61cf67d --- /dev/null +++ b/corpus/m6/native-features-01/read/page-016.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/page-017.pdf b/corpus/m6/native-features-01/read/page-017.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8b587a6d4ff00135fe26d8441c757f05501a6a35 Binary files /dev/null and b/corpus/m6/native-features-01/read/page-017.pdf differ diff --git a/corpus/m6/native-features-01/read/page-017.xml b/corpus/m6/native-features-01/read/page-017.xml new file mode 100644 index 0000000000000000000000000000000000000000..bd3b2103e2292f7efc1bc96dd3aee9086a7352f6 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-017.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/page-018.pdf b/corpus/m6/native-features-01/read/page-018.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bd6fb7b6eb0d8756293bb137fb5641f726d10bfb Binary files /dev/null and b/corpus/m6/native-features-01/read/page-018.pdf differ diff --git a/corpus/m6/native-features-01/read/page-018.xml b/corpus/m6/native-features-01/read/page-018.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb026758fc28967d4b350e10a612315fe05db7ea --- /dev/null +++ b/corpus/m6/native-features-01/read/page-018.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/native-features-01/read/page-019.pdf b/corpus/m6/native-features-01/read/page-019.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d27291ed514ee0192ef5cd06d49e903f9112b0eb Binary files /dev/null and b/corpus/m6/native-features-01/read/page-019.pdf differ diff --git a/corpus/m6/native-features-01/read/page-019.xml b/corpus/m6/native-features-01/read/page-019.xml new file mode 100644 index 0000000000000000000000000000000000000000..0bf2b3ad4db654f3eadec77a3c992a41ed7df027 --- /dev/null +++ b/corpus/m6/native-features-01/read/page-019.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-features-01/read/payloads.json b/corpus/m6/native-features-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..9a2728fdade6659391fb887ece23cafe4e2183ad --- /dev/null +++ b/corpus/m6/native-features-01/read/payloads.json @@ -0,0 +1,18 @@ +[ + { + "sha256": "4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2", + "name": "Fictitious attachment.txt", + "object": "{F93B0A80-B001-0936-3055-39CC30C35F9B}{40}{B0}", + "kind": "InsertedFile", + "page": "{E3213304-68E2-07FB-2349-AB7D4B2499EC}{1}{B0}", + "bytes": 27 + }, + { + "sha256": "56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9", + "name": "silence.wav", + "object": "{F93B0A80-B001-0936-3055-39CC30C35F9B}{44}{B0}", + "kind": "MediaFile", + "page": "{E3213304-68E2-07FB-2349-AB7D4B2499EC}{1}{B0}", + "bytes": 16044 + } +] \ No newline at end of file diff --git a/corpus/m6/native-features-01/run.json b/corpus/m6/native-features-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..c57d425d1d2723120a1971aa76792ec47aadd835 --- /dev/null +++ b/corpus/m6/native-features-01/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m6/feature-input-02/notebook", + "expected_pages": 20, + "author": "tools/native/pages.ps1", + "author_timeout_seconds": 600, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "dfbf0e016aa4c8486ecea9f39768c633de05ac0db8214139052ca2e9c43bbd02", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "fc7199ff4e01a5d18dbc6d472130006ef6f195a8f944daa33eaf6de2ac896553" + } +} diff --git a/corpus/m6/native-features-01/scripts/author.ps1 b/corpus/m6/native-features-01/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..8e428618e3452caa35da88687293b520c273b6c6 --- /dev/null +++ b/corpus/m6/native-features-01/scripts/author.ps1 @@ -0,0 +1,42 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$fixture = Get-Content (Join-Path $Root 'notebook\fixture.json') -Raw -Encoding UTF8 | ConvertFrom-Json +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sections = @{} + foreach ($path in $fixture.sections) { + $parts = $path.Split('/') + if (@($parts | Where-Object { $_ -in @('', '.', '..') -or $_.Contains('\') -or $_.Contains(':') }).Count) { throw 'Invalid fixture section path.' } + $parent = $notebookId + for ($index = 0; $index -lt $parts.Count; $index++) { + $id = '' + $app.OpenHierarchy($parts[$index], $parent, [ref]$id, $(if ($index -eq $parts.Count - 1) {3} else {2})) + $parent = $id + } + $sections[$path] = $id + } + $index = 0 + foreach ($item in $fixture.pages) { + $pageId = '' + $app.CreateNewPage($sections[$item.section], [ref]$pageId, 0) + [xml]$xml = $item.xml.Replace('__ASSETS__', [Security.SecurityElement]::Escape((Join-Path $Root 'notebook\fixture-data'))) + $xml.DocumentElement.SetAttribute('ID', $pageId) + [IO.File]::WriteAllText((Join-Path $inputs ('page-{0:d3}.xml' -f $index)), $xml.OuterXml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml.OuterXml, [DateTime]::MinValue, 1, $true) + $index++ + } + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/corpus/m6/native-features-01/scripts/cold.ps1 b/corpus/m6/native-features-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-features-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-features-01/scripts/read.ps1 b/corpus/m6/native-features-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..ec9463bef5b3fc7be427a10f19c42c4338186945 --- /dev/null +++ b/corpus/m6/native-features-01/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 3, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-features-01/source.json b/corpus/m6/native-features-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..0f808f196ec08d65f13ad92b65cc50ce6d534b6e --- /dev/null +++ b/corpus/m6/native-features-01/source.json @@ -0,0 +1,62 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86", + "mtime_ns": 1788592288950419463 + }, + { + "path": "fixture-data/attachment.txt", + "bytes": 27, + "sha256": "4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2", + "mtime_ns": 1788661433289873149 + }, + { + "path": "fixture-data/pattern.bmp", + "bytes": 18486, + "sha256": "d7802912d031a974c277d1500f845faf7d1d5dc3dd9d5a3daf69c44db8d9dbf5", + "mtime_ns": 1788661433281066713 + }, + { + "path": "fixture-data/pattern.gif", + "bytes": 3902, + "sha256": "e0d351f33d156bf3d77b4912269768e2261c0c4850a8e78a87c245a2db2c5953", + "mtime_ns": 1788661433289731365 + }, + { + "path": "fixture-data/pattern.jpg", + "bytes": 1071, + "sha256": "bf7ef0fb92642d75f186c27a0ba662138c7c3f9ea85b1c478805a229cda451ed", + "mtime_ns": 1788661433280638778 + }, + { + "path": "fixture-data/pattern.png", + "bytes": 250, + "sha256": "02065dc5a46ae9a4adc68d0fff2641b62cedaa396f59f93ec6ac79c8b358904a", + "mtime_ns": 1788661433279052573 + }, + { + "path": "fixture-data/pattern.tiff", + "bytes": 18572, + "sha256": "fbbc74945e085389c3e994bfab64c26144056066e0d631512e62a3007b373427", + "mtime_ns": 1788661433282081783 + }, + { + "path": "fixture-data/silence.wav", + "bytes": 16044, + "sha256": "56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9", + "mtime_ns": 1788661433289972060 + }, + { + "path": "fixture.json", + "bytes": 12415, + "sha256": "d3c2142230816e8717c7612a5d2ca816a7551cebc2bc445846f3824d3a44dbc3", + "mtime_ns": 1788661433292101944 + }, + { + "path": "synthetic.one", + "bytes": 3348, + "sha256": "b0662387c3fdc256d8dbe809e3b8f73b3586559696467fb1fff8f589095fa797", + "mtime_ns": 1788592288941514581 + } +] diff --git a/corpus/m6/native-features-01/teardown.json b/corpus/m6/native-features-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-features-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-histories-pilot-01/agent.py b/corpus/m6/native-histories-pilot-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-histories-pilot-01/commands.jsonl b/corpus/m6/native-histories-pilot-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..bb8c4e6006fd8a7ada6856336da2a8be4b96c922 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-C757B24A", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-C757B24A -ExpectedPages 4 -UseCurrentCache", "exit": 0, "stdout": "Read 1 sections and 4 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-histories-pilot-01/health.json b/corpus/m6/native-histories-pilot-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..e9f567b47f27d86cde95aa3cd372373b8af441d2 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-C757B24A", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-00.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..cd499de5933c77d8c951aa664cc772f1641bd147 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-00.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-01.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-01.xml new file mode 100644 index 0000000000000000000000000000000000000000..6fd4bc17bf0ed212a520c9bed88cc0820e90a5f9 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-01.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-02.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-02.xml new file mode 100644 index 0000000000000000000000000000000000000000..cf63bcacc3a771fb121271f6100ec3bb2cfabd2b --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-02.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-03.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-03.xml new file mode 100644 index 0000000000000000000000000000000000000000..1f6147ab97ac1bc5f805a4b581e962b406f97dd1 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-03.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-04.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-04.xml new file mode 100644 index 0000000000000000000000000000000000000000..09bce958baa7c122b0bce9553b0cbd4245375165 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-04.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-05.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-05.xml new file mode 100644 index 0000000000000000000000000000000000000000..e55870e35442079d100a1f5021aab10815230b13 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-05.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-06.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-06.xml new file mode 100644 index 0000000000000000000000000000000000000000..533bf392aa2534e5e73f7c1f8f5f8d025a3bd072 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-06.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-07.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-07.xml new file mode 100644 index 0000000000000000000000000000000000000000..68347d20716df9445cbf12a2163fd9beea0b305e --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-07.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-08.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-08.xml new file mode 100644 index 0000000000000000000000000000000000000000..68347d20716df9445cbf12a2163fd9beea0b305e --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-08.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-09.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-09.xml new file mode 100644 index 0000000000000000000000000000000000000000..ebd01b138f3dc2a12b15e51c3386ca35f516c62f --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-09.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-10.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-10.xml new file mode 100644 index 0000000000000000000000000000000000000000..08666606dcfe926f4d553cd58841f0f0aeb1412e --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-10.xml @@ -0,0 +1 @@ +History 000000Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-11.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-11.xml new file mode 100644 index 0000000000000000000000000000000000000000..3c06ff780ee1d39bde5c37fc4ee5eb91d69eaaf2 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-11.xml @@ -0,0 +1 @@ +History 000000tabs here]]>Initial 0]]>Initial 1]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-12.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-12.xml new file mode 100644 index 0000000000000000000000000000000000000000..c58a804bc15719fb9216590f6f08573ec73475fd --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-12.xml @@ -0,0 +1 @@ +History 000000tabs here]]>Initial 0]]>Initial 2]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-13.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-13.xml new file mode 100644 index 0000000000000000000000000000000000000000..d0b61f7fdfa3a4c13b0e335ac5ebc45941cf530b --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-13.xml @@ -0,0 +1 @@ +History 000000tabs here]]>Initial 2]]>Initial 0]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-14.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-14.xml new file mode 100644 index 0000000000000000000000000000000000000000..c7ef886092bc591eca56b1facb58ddac8f75dbb5 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-14.xml @@ -0,0 +1 @@ +History 000000tabs here]]>Initial 2]]>Initial 0]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-15.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-15.xml new file mode 100644 index 0000000000000000000000000000000000000000..8bb5dae01f184d6d08450d9cde2f83fcaf296afc --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-15.xml @@ -0,0 +1 @@ +History 000000tabs here]]>Initial 2]]>Initial 0]]>simple text]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-16.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-16.xml new file mode 100644 index 0000000000000000000000000000000000000000..bffab83ed2b162b9e77cd1f6fea0a6eb85b21bef --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-16.xml @@ -0,0 +1 @@ +History 000000tabs here]]>Initial 2]]>Initial 0]]>A😀éZ]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-17.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-17.xml new file mode 100644 index 0000000000000000000000000000000000000000..5c42acd98a7c628fc3865aaf6d33a3e37d0979a9 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-17.xml @@ -0,0 +1 @@ +History 000000tabs here]]>Initial 2]]>Initial 0]]>A😀éZ]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-18.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-18.xml new file mode 100644 index 0000000000000000000000000000000000000000..49b5195838c4c6163d3303bcac81a7d6dc797e9c --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-18.xml @@ -0,0 +1 @@ +History 000000tabs here]]>Initial 2]]>Initial 0]]>A😀éZ]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-19.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-19.xml new file mode 100644 index 0000000000000000000000000000000000000000..50c322958fb8dcef3bbd8aef73edc5921780acc8 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-19.xml @@ -0,0 +1 @@ +History 000000tabs here]]>Initial 2]]>Initial 0]]>A😀éZ]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000000-20.xml b/corpus/m6/native-histories-pilot-01/inputs/000000-20.xml new file mode 100644 index 0000000000000000000000000000000000000000..9626d79d5b63b87ab341415595c2cbeef718a6f5 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000000-20.xml @@ -0,0 +1 @@ +History 000000tabs here]]>Initial 2]]>Initial 0]]>A😀éZ]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-00.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..c032930c0262d47bb911068ff9a277c12a99521a --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-00.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-01.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-01.xml new file mode 100644 index 0000000000000000000000000000000000000000..9b9876a2a9bff48c64443b44f69c16d1414c0740 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-01.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-02.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-02.xml new file mode 100644 index 0000000000000000000000000000000000000000..695f9dd48979fdcb7af91cbab0daa0460eb8768d --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-02.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-03.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-03.xml new file mode 100644 index 0000000000000000000000000000000000000000..2a4dad78a7616bce23eee253ff44c8f3791feaac --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-03.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-04.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-04.xml new file mode 100644 index 0000000000000000000000000000000000000000..93bd183be138f26edfe6cfe4ddfe018934639a4b --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-04.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-05.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-05.xml new file mode 100644 index 0000000000000000000000000000000000000000..554e2235dc2db75f20a456f04c5733173946c58b --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-05.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-06.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-06.xml new file mode 100644 index 0000000000000000000000000000000000000000..e799daa907077c643dd25711c881018e53d406e5 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-06.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-07.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-07.xml new file mode 100644 index 0000000000000000000000000000000000000000..cc20d0260aa1b2ff3b0f4650a2a6a10024c99958 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-07.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-08.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-08.xml new file mode 100644 index 0000000000000000000000000000000000000000..02dd441ed6ba18e391e93b9fa66094e91741679b --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-08.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-09.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-09.xml new file mode 100644 index 0000000000000000000000000000000000000000..43076262abf2e1cbfc21c9889eaa1e439074c06b --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-09.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-10.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-10.xml new file mode 100644 index 0000000000000000000000000000000000000000..f09ec6d7e8b68fa1e1326b947624637a8756758c --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-10.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-11.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-11.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9ab1861c0efd11c82b7d6636e79a9878c1657d2 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-11.xml @@ -0,0 +1 @@ +History 000001Initial 0]]>tabs here]]>Initial 2]]>tabs here]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-12.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-12.xml new file mode 100644 index 0000000000000000000000000000000000000000..1e8199a8745008f8e1b99cd5a9a9caa06517bdb8 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-12.xml @@ -0,0 +1 @@ +History 000001tabs here]]>Initial 2]]>tabs here]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-13.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-13.xml new file mode 100644 index 0000000000000000000000000000000000000000..7c2a98695f5083253acd48939eb9838477c54faa --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-13.xml @@ -0,0 +1 @@ +History 000001tabs here]]>Initial 2]]>Initial 3]]>tabs here]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-14.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-14.xml new file mode 100644 index 0000000000000000000000000000000000000000..080622522f733aa321a5cd4077612d4603fe9734 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-14.xml @@ -0,0 +1 @@ +History 000001tabs here]]>Initial 2]]>Initial 3]]>tabs here]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-15.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-15.xml new file mode 100644 index 0000000000000000000000000000000000000000..037139dc119e9bc6f2f24448b312e41bf049ad39 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-15.xml @@ -0,0 +1 @@ +History 000001tabs here]]>Initial 2]]>Initial 3]]>tabs here]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-16.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-16.xml new file mode 100644 index 0000000000000000000000000000000000000000..4ffe6d758222ec182446b7ce565a83e1ae5208a6 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-16.xml @@ -0,0 +1 @@ +History 000001literal <b> & "quotes"]]>Initial 2]]>Initial 3]]>tabs here]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-17.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-17.xml new file mode 100644 index 0000000000000000000000000000000000000000..0180f4ee3b9fa5c626313f05b69071c749863a55 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-17.xml @@ -0,0 +1 @@ +History 000001literal <b> & "quotes"]]>Initial 2]]>Initial 3]]>tabs here]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-18.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-18.xml new file mode 100644 index 0000000000000000000000000000000000000000..8824758e3b4a4b999852324b03f0a6a1d631a8c0 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-18.xml @@ -0,0 +1 @@ +History 000001literal <b> & "quotes"]]>Initial 2]]>Initial 3]]>tabs here]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-19.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-19.xml new file mode 100644 index 0000000000000000000000000000000000000000..e54e42447f2ae61e836563fa8c2cbfa0d503dd7f --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-19.xml @@ -0,0 +1 @@ +History 000001literal <b> & "quotes"]]>Initial 2]]>Initial 3]]>tabs here]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000001-20.xml b/corpus/m6/native-histories-pilot-01/inputs/000001-20.xml new file mode 100644 index 0000000000000000000000000000000000000000..15bf61787b2068c4bc1bdcb5e976c53091b733ac --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000001-20.xml @@ -0,0 +1 @@ +History 000001literal <b> & "quotes"]]>Initial 2]]>Initial 3]]>tabs here]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-00.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..fda5641a4d7edb92c1a141dfbd4ff4a898f1226f --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-00.xml @@ -0,0 +1 @@ +History 000002Initial 0]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-01.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-01.xml new file mode 100644 index 0000000000000000000000000000000000000000..9edb9818d73db6e7e4776cfaa8e577f5f45bdb87 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-01.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-02.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-02.xml new file mode 100644 index 0000000000000000000000000000000000000000..7c00a37c0fc3009147416f533e468dca4b74b027 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-02.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-03.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-03.xml new file mode 100644 index 0000000000000000000000000000000000000000..34bc02b15ca5cc986ba06acfb97b189d0e25d92a --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-03.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-04.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-04.xml new file mode 100644 index 0000000000000000000000000000000000000000..538f5406185ccfa9aaa9406ee64aa9feede92e01 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-04.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-05.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-05.xml new file mode 100644 index 0000000000000000000000000000000000000000..d72ee2d1e1e05acefc63e14c6392e79f0a9b75b8 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-05.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-06.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-06.xml new file mode 100644 index 0000000000000000000000000000000000000000..a995da9f39480be34bb2155520da6dcda0dda1e1 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-06.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-07.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-07.xml new file mode 100644 index 0000000000000000000000000000000000000000..53e01f46492e97a297b08077914a5c7ba7429842 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-07.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-08.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-08.xml new file mode 100644 index 0000000000000000000000000000000000000000..53e01f46492e97a297b08077914a5c7ba7429842 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-08.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-09.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-09.xml new file mode 100644 index 0000000000000000000000000000000000000000..14c96de4166a993b966fcc1121bcf8b067ccc2c6 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-09.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-10.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-10.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea36cd2227909be0d02e6b4cb590f16196175fe4 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-10.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-11.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-11.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb8ebbcf17073c99dda024b0178e5bec0f282e89 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-11.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>tabs here]]>Initial 2]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-12.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-12.xml new file mode 100644 index 0000000000000000000000000000000000000000..3b45f80e814ad95dee0dbc2f9e44668face9ba7d --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-12.xml @@ -0,0 +1 @@ +History 000002Repeated words]]>Initial 1]]>tabs here]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-13.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-13.xml new file mode 100644 index 0000000000000000000000000000000000000000..feaf4da1c587e32dacacf49181ca6d30265d0035 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-13.xml @@ -0,0 +1 @@ +History 000002tabs here]]>Repeated words]]>Initial 1]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-14.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-14.xml new file mode 100644 index 0000000000000000000000000000000000000000..e1b6f995550c324b2eed6c6aa58382f5629069e4 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-14.xml @@ -0,0 +1 @@ +History 000002tabs here]]>Repeated words]]>Initial 1]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-15.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-15.xml new file mode 100644 index 0000000000000000000000000000000000000000..1800946d4e840aa9ddf48646a90d0ff87ddda106 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-15.xml @@ -0,0 +1 @@ +History 000002tabs here]]>Repeated words]]>Initial 1]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-16.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-16.xml new file mode 100644 index 0000000000000000000000000000000000000000..962a860e67205e06df298ab3d2e52bd839fd71f0 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-16.xml @@ -0,0 +1 @@ +History 000002tabs here]]>tabs here]]>Initial 1]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-17.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-17.xml new file mode 100644 index 0000000000000000000000000000000000000000..b9ee824ee9522d22ad3ee9139efcff8b14151772 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-17.xml @@ -0,0 +1 @@ +History 000002tabs here]]>tabs here]]>Initial 1]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-18.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-18.xml new file mode 100644 index 0000000000000000000000000000000000000000..3be0614e55b6f6b41ab9a4d26c21249ea848e393 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-18.xml @@ -0,0 +1 @@ +History 000002tabs here]]>tabs here]]>Initial 1]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-19.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-19.xml new file mode 100644 index 0000000000000000000000000000000000000000..f5e3f683725325a5501d58a037525747b846b911 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-19.xml @@ -0,0 +1 @@ +History 000002tabs here]]>tabs here]]>Initial 1]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/inputs/000002-20.xml b/corpus/m6/native-histories-pilot-01/inputs/000002-20.xml new file mode 100644 index 0000000000000000000000000000000000000000..891fc32f3bd361bb213c43c7746104fbecb2ac02 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/inputs/000002-20.xml @@ -0,0 +1 @@ +History 000002tabs here]]>tabs here]]>Initial 1]]>Initial 3]]> \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/machine.json b/corpus/m6/native-histories-pilot-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..8867b9389b88e361e3926647a10691ef19dee99b --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-c757b24a", "hostname": "ONE-M6-C757B24A"} diff --git a/corpus/m6/native-histories-pilot-01/notebook/Open Notebook.onetoc2 b/corpus/m6/native-histories-pilot-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..f3258016bc468238d246f93f2108bfec36c571f3 Binary files /dev/null and b/corpus/m6/native-histories-pilot-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-histories-pilot-01/notebook/histories.json b/corpus/m6/native-histories-pilot-01/notebook/histories.json new file mode 100644 index 0000000000000000000000000000000000000000..4ad7c9225636fe7d5c9431cc077d2553d8eba9f1 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/notebook/histories.json @@ -0,0 +1,566 @@ +[ + { + "seed": 0, + "title": "History 000000", + "initial": { + "paragraphs": [ + { + "id": "p0", + "text": "Initial 0", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p1", + "text": "Initial 1", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p2", + "text": "Initial 2", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p3", + "text": "Initial 3", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + } + ], + "table": [ + [ + "Cell 0,0", + "Cell 0,1" + ], + [ + "Cell 1,0", + "Cell 1,1" + ] + ], + "x": 72, + "y": 108 + }, + "operations": [ + { + "kind": "text", + "index": 3, + "value": "simple text" + }, + { + "kind": "bold", + "index": 3, + "value": true + }, + { + "kind": "italic", + "index": 0, + "value": true + }, + { + "kind": "underline", + "index": 2, + "value": true + }, + { + "kind": "strike", + "index": 3, + "value": true + }, + { + "kind": "color", + "index": 3, + "value": "#00ffff" + }, + { + "kind": "highlight", + "index": 3, + "value": "#00ffff" + }, + { + "kind": "font_size", + "index": 1, + "value": 11 + }, + { + "kind": "link", + "index": 2, + "value": "https://example.invalid/0/8?a=1&b=2" + }, + { + "kind": "tag", + "index": 1, + "value": true + }, + { + "kind": "insert", + "index": 0, + "paragraph": { + "id": "new10", + "text": "tabs\there", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + } + }, + { + "kind": "delete", + "index": 2 + }, + { + "kind": "move", + "index": 1, + "to": 2 + }, + { + "kind": "position", + "index": 0, + "x": 216, + "y": 108 + }, + { + "kind": "cell", + "index": 2, + "row": 1, + "column": 0, + "text": "A😀éZ" + }, + { + "kind": "text", + "index": 3, + "value": "A😀éZ" + }, + { + "kind": "bold", + "index": 1, + "value": true + }, + { + "kind": "italic", + "index": 3, + "value": true + }, + { + "kind": "underline", + "index": 3, + "value": true + }, + { + "kind": "strike", + "index": 2, + "value": true + } + ] + }, + { + "seed": 1, + "title": "History 000001", + "initial": { + "paragraphs": [ + { + "id": "p0", + "text": "Initial 0", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p1", + "text": "Initial 1", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p2", + "text": "Initial 2", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p3", + "text": "Initial 3", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + } + ], + "table": [ + [ + "Cell 0,0", + "Cell 0,1" + ], + [ + "Cell 1,0", + "Cell 1,1" + ] + ], + "x": 72, + "y": 108 + }, + "operations": [ + { + "kind": "text", + "index": 1, + "value": "tabs\there" + }, + { + "kind": "bold", + "index": 0, + "value": true + }, + { + "kind": "italic", + "index": 2, + "value": true + }, + { + "kind": "underline", + "index": 0, + "value": true + }, + { + "kind": "strike", + "index": 3, + "value": true + }, + { + "kind": "color", + "index": 3, + "value": "#ffff00" + }, + { + "kind": "highlight", + "index": 3, + "value": "#ff0000" + }, + { + "kind": "font_size", + "index": 0, + "value": 18 + }, + { + "kind": "link", + "index": 0, + "value": "https://example.invalid/1/8?a=1&b=2" + }, + { + "kind": "tag", + "index": 3, + "value": true + }, + { + "kind": "insert", + "index": 3, + "paragraph": { + "id": "new10", + "text": "tabs\there", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + } + }, + { + "kind": "delete", + "index": 0 + }, + { + "kind": "move", + "index": 3, + "to": 2 + }, + { + "kind": "position", + "index": 1, + "x": 180, + "y": 108 + }, + { + "kind": "cell", + "index": 2, + "row": 0, + "column": 0, + "text": "Repeated words" + }, + { + "kind": "text", + "index": 0, + "value": "literal & \"quotes\"" + }, + { + "kind": "bold", + "index": 1, + "value": true + }, + { + "kind": "italic", + "index": 3, + "value": true + }, + { + "kind": "underline", + "index": 0, + "value": true + }, + { + "kind": "strike", + "index": 1, + "value": true + } + ] + }, + { + "seed": 2, + "title": "History 000002", + "initial": { + "paragraphs": [ + { + "id": "p0", + "text": "Initial 0", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p1", + "text": "Initial 1", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p2", + "text": "Initial 2", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + }, + { + "id": "p3", + "text": "Initial 3", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + } + ], + "table": [ + [ + "Cell 0,0", + "Cell 0,1" + ], + [ + "Cell 1,0", + "Cell 1,1" + ] + ], + "x": 72, + "y": 108 + }, + "operations": [ + { + "kind": "text", + "index": 0, + "value": "Repeated words" + }, + { + "kind": "bold", + "index": 0, + "value": true + }, + { + "kind": "italic", + "index": 2, + "value": true + }, + { + "kind": "underline", + "index": 1, + "value": true + }, + { + "kind": "strike", + "index": 2, + "value": true + }, + { + "kind": "color", + "index": 2, + "value": "#00ff00" + }, + { + "kind": "highlight", + "index": 1, + "value": "#00ff00" + }, + { + "kind": "font_size", + "index": 0, + "value": 11 + }, + { + "kind": "link", + "index": 3, + "value": "https://example.invalid/2/8?a=1&b=2" + }, + { + "kind": "tag", + "index": 3, + "value": true + }, + { + "kind": "insert", + "index": 2, + "paragraph": { + "id": "new10", + "text": "tabs\there", + "bold": false, + "italic": false, + "underline": false, + "strike": false, + "color": "#000000", + "highlight": "#ffff00", + "font_size": 11, + "link": "", + "tag": false + } + }, + { + "kind": "delete", + "index": 3 + }, + { + "kind": "move", + "index": 2, + "to": 0 + }, + { + "kind": "position", + "index": 0, + "x": 108, + "y": 324 + }, + { + "kind": "cell", + "index": 2, + "row": 1, + "column": 1, + "text": "tabs\there" + }, + { + "kind": "text", + "index": 1, + "value": "tabs\there" + }, + { + "kind": "bold", + "index": 1, + "value": false + }, + { + "kind": "italic", + "index": 1, + "value": true + }, + { + "kind": "underline", + "index": 1, + "value": true + }, + { + "kind": "strike", + "index": 0, + "value": true + } + ] + } +] \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/notebook/synthetic.one b/corpus/m6/native-histories-pilot-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..1e8a9224807f5323d3d35503d2dd824d6e77d6b4 Binary files /dev/null and b/corpus/m6/native-histories-pilot-01/notebook/synthetic.one differ diff --git a/corpus/m6/native-histories-pilot-01/operations.jsonl b/corpus/m6/native-histories-pilot-01/operations.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..c0acabc999f664aabd8a98b6a933bf7535497863 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/operations.jsonl @@ -0,0 +1,63 @@ +{"step":-1,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":0,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":1,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":2,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":3,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":4,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":5,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":6,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":7,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":8,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":9,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":10,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":11,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":12,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":13,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":14,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":15,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":16,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":17,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":18,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":19,"seed":0,"page":"{EAAE75E2-34FE-44DE-991F-4B75BF503616}{1}{B0}","outline":"{61379533-DDB3-40A1-A836-40DD2A937A33}{39}{B0}"} +{"step":-1,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":0,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":1,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":2,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":3,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":4,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":5,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":6,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":7,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":8,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":9,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":10,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":11,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":12,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":13,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":14,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":15,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":16,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":17,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":18,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":19,"seed":1,"page":"{80FE0FED-CA08-4385-BE7E-A7253BEED6CA}{1}{B0}","outline":"{029D6555-3118-40EF-8210-4C502C9F216D}{39}{B0}"} +{"step":-1,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":0,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":1,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":2,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":3,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":4,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":5,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":6,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":7,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":8,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":9,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":10,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":11,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":12,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":13,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":14,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":15,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":16,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":17,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":18,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} +{"step":19,"seed":2,"page":"{E1F7C64A-9729-48F7-A6F7-DE50604C7D74}{1}{B0}","outline":"{BE045C12-B494-41CA-969F-7B4667D46FE3}{39}{B0}"} diff --git a/corpus/m6/native-histories-pilot-01/read/environment.json b/corpus/m6/native-histories-pilot-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..2c3373a2bed068276a09a3d8c0ab3e60ec138232 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-C757B24A", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-histories-pilot-01/read/hierarchy.xml b/corpus/m6/native-histories-pilot-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..67bd6b2fe735fac457ad62d2a7cd60df48e283ec --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-histories-pilot-01/read/page-000.xml b/corpus/m6/native-histories-pilot-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..7a0ea0877e8e3f640aca16521f39cf19a771ac84 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/read/page-000.xml @@ -0,0 +1,7 @@ + +literal <b> & "quotes"]]>Initial 2]]>Initial 3]]>tabs        here]]> diff --git a/corpus/m6/native-histories-pilot-01/read/page-001.xml b/corpus/m6/native-histories-pilot-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..c674e5b405ea9e62bff7fdef5bc187a2a448a730 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/read/page-001.xml @@ -0,0 +1,8 @@ + +tabs        here]]>tabs        here]]>Initial 1]]>Initial 3]]> diff --git a/corpus/m6/native-histories-pilot-01/read/page-002.xml b/corpus/m6/native-histories-pilot-01/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..490395d372efdb27fb6718e375e0e75157992b5c --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/read/page-002.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-histories-pilot-01/read/page-003.xml b/corpus/m6/native-histories-pilot-01/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..fc8b680d6eabbbb33e655f964d83f2360542c65e --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/read/page-003.xml @@ -0,0 +1,9 @@ + +tabs        here]]>Initial 2]]>Initial 0]]>A😀éZ]]> diff --git a/corpus/m6/native-histories-pilot-01/read/payloads.json b/corpus/m6/native-histories-pilot-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/m6/native-histories-pilot-01/run.json b/corpus/m6/native-histories-pilot-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..7418a3641fe495f1e32387ff8448036aa0f4e58b --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/run.json @@ -0,0 +1,16 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m6/history-input-01/notebook", + "expected_pages": 4, + "author": "tools/native/history.ps1", + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "397acf4be501afc3c5cd8d64e84f0cf2a828314fb98a1d394ccdf2fe95b870c8", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "bec4953cc49b9ccb57041be00d7d7ce8bb88f2c0446c664b0a631e91f0007b45" + } +} diff --git a/corpus/m6/native-histories-pilot-01/scripts/author.ps1 b/corpus/m6/native-histories-pilot-01/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..cd461e15bee637b103b71825f377ee519998bf96 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/scripts/author.ps1 @@ -0,0 +1,83 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$histories = Get-Content (Join-Path $Root 'notebook\histories.json') -Raw -Encoding UTF8 | ConvertFrom-Json +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$namespace = 'http://schemas.microsoft.com/office/onenote/2010/onenote' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sectionId = '' + $app.OpenHierarchy('synthetic.one', $notebookId, [ref]$sectionId, 0) + foreach ($history in $histories) { + $pageId = '' + $app.CreateNewPage($sectionId, [ref]$pageId, 0) + $state = $history.initial + $paragraphs = New-Object Collections.ArrayList + foreach ($paragraph in $state.paragraphs) { [void]$paragraphs.Add($paragraph) } + $ids = @{} + $outlineId = '' + for ($step = -1; $step -lt $history.operations.Count; $step++) { + if ($step -ge 0) { + $op = $history.operations[$step] + switch ($op.kind) { + 'insert' { $paragraphs.Insert($op.index, $op.paragraph) } + 'delete' { $paragraphs.RemoveAt($op.index) } + 'move' { $paragraph = $paragraphs[$op.index]; $paragraphs.RemoveAt($op.index); $paragraphs.Insert($op.to, $paragraph) } + 'position' { $state.x = $op.x; $state.y = $op.y } + 'cell' { $state.table[$op.row][$op.column] = $op.text } + default { $property = $op.kind; $paragraphs[$op.index].$property = $op.value } + } + } + $xml = '' + $history.title + '' + foreach ($paragraph in $paragraphs) { + $xml += '' + [Security.SecurityElement]::Escape($paragraph.text) + '' + if ($paragraph.link) { $html = '' + $html + '' } + $xml += '' + } + $xml += '' + foreach ($row in $state.table) { + $xml += '' + foreach ($cell in $row) { $xml += '' } + $xml += '' + } + $xml += '' + [IO.File]::WriteAllText((Join-Path $inputs ('{0:d6}-{1:d2}.xml' -f $history.seed, ($step + 1))), $xml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $true) + $content = '' + $app.GetPageContent($pageId, [ref]$content, 3, 1) + [xml]$document = $content + $manager = New-Object Xml.XmlNamespaceManager($document.NameTable) + $manager.AddNamespace('one', $namespace) + $outline = $document.SelectSingleNode('/one:Page/one:Outline', $manager) + $outlineId = $outline.GetAttribute('objectID') + $objects = @($outline.SelectNodes('one:OEChildren/one:OE[one:T]', $manager)) + if ($objects.Count -ne $paragraphs.Count) { throw "Native paragraph count changed at seed $($history.seed), step $step." } + for ($index = 0; $index -lt $paragraphs.Count; $index++) { $ids[$paragraphs[$index].id] = $objects[$index].GetAttribute('objectID') } + $log = @{ seed = $history.seed; step = $step; page = $pageId; outline = $outlineId } | ConvertTo-Json -Compress + [IO.File]::AppendAllText((Join-Path $Root 'operations.jsonl'), $log + [Environment]::NewLine, [Text.Encoding]::UTF8) + } + } + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/corpus/m6/native-histories-pilot-01/scripts/cold.ps1 b/corpus/m6/native-histories-pilot-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-histories-pilot-01/scripts/read.ps1 b/corpus/m6/native-histories-pilot-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..2c36d388f08430730e32fb5f44655a10caecde80 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/scripts/read.ps1 @@ -0,0 +1,131 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(45) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 3, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-histories-pilot-01/source.json b/corpus/m6/native-histories-pilot-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..cf474b8d032d5fb769159e22ba1c167fc61cb44c --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/source.json @@ -0,0 +1,20 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86", + "mtime_ns": 1788592288950419463 + }, + { + "path": "histories.json", + "bytes": 11091, + "sha256": "b6a7f34ee0bfe8aebd532fc1464e3136ce45663f0a71ab016ae41223c8d9bd1a", + "mtime_ns": 1788658359257655599 + }, + { + "path": "synthetic.one", + "bytes": 3348, + "sha256": "b0662387c3fdc256d8dbe809e3b8f73b3586559696467fb1fff8f589095fa797", + "mtime_ns": 1788592288941514581 + } +] diff --git a/corpus/m6/native-histories-pilot-01/teardown.json b/corpus/m6/native-histories-pilot-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-histories-pilot-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-link-controls-01/ORACLE.md b/corpus/m6/native-link-controls-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..502deea85109079c8afbd166f5ec713ae0e4946d --- /dev/null +++ b/corpus/m6/native-link-controls-01/ORACLE.md @@ -0,0 +1,22 @@ +# Native hyperlink boundary controls + +`notebook/fixture.json` is the independent authored input; `inputs/page-000.xml` +records the submitted COM page. `read/page-001.xml` and its PDF are the native +output. `read/environment.json` identifies the OneNote build and fresh clone; +`teardown.json` records deletion. The original capture location links here. + +Ten labels isolate ASCII spaces, tabs, NBSP, EM space, literal HTML metacharacters, +and line breaks. Native import places leading ASCII spaces/tabs outside the link, +keeps trailing spaces/tabs inside it, and keeps NBSP linked at both ends. An +all-space label has no link. EM spaces are removed during import. Newlines become +stored CRs outside the hyperlink; the final CR is absent from exported HTML. + +Authored red foreground and underline do not survive this hyperlink import: +native storage and exported XML use automatic foreground and no underline, +including the leading unlinked text. Bold, 14-point font, and yellow highlight +remain. These are native import observations, not transformations in the reader. + +`native_hyperlink_boundaries_preserve_whitespace_and_literal_labels` checks the +stored visible text, linked text, exact destinations, and native formatting. The +seeded-history comparator must apply the evidenced leading ASCII-space/tab rule +to its independent expectation without stripping Unicode whitespace generally. diff --git a/corpus/m6/native-link-controls-01/agent.py b/corpus/m6/native-link-controls-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-link-controls-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-link-controls-01/commands.jsonl b/corpus/m6/native-link-controls-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..f4dc7eea586d5f5f07b35c951af5971fd11e3b5d --- /dev/null +++ b/corpus/m6/native-link-controls-01/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-5025FB31", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-5025FB31 -ExpectedPages 2 -UseCurrentCache -Pdf", "exit": 0, "stdout": "Read 2 sections and 2 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-link-controls-01/format-differences.json b/corpus/m6/native-link-controls-01/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-link-controls-01/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-link-controls-01/geometry-differences.json b/corpus/m6/native-link-controls-01/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-link-controls-01/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-link-controls-01/health.json b/corpus/m6/native-link-controls-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..5df17081cb212bce2b78dcb4858332bc1bb8c34f --- /dev/null +++ b/corpus/m6/native-link-controls-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-5025FB31", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-link-controls-01/inputs/page-000.xml b/corpus/m6/native-link-controls-01/inputs/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..1aaf2c14b87ff74f79c2a866e07ced50c64cc62b --- /dev/null +++ b/corpus/m6/native-link-controls-01/inputs/page-000.xml @@ -0,0 +1,3 @@ +Hyperlink boundary controls<a href="https://example.invalid/label/0"><span style="font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow"> label </span></a><a href="https://example.invalid/label/1"><span style="font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow"> label </span></a><a href="https://example.invalid/label/2"><span style="font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow"> label </span></a><a href="https://example.invalid/label/3"><span style="font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow"> label </span></a><a href="https://example.invalid/label/4"><span style="font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow">label</span></a><a href="https://example.invalid/label/5"><span style="font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow"> </span></a><a href="https://example.invalid/label/6"><span style="font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow"> label </span></a><a href="https://example.invalid/label/7"><span style="font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow"> ]]&gt; end</span></a><a href="https://example.invalid/label/8"><span style="font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow">&lt;b&gt; &amp; &quot;quoted&quot;</span></a><a href="https://example.invalid/label/9"><span style="font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow"> +label +</span></a> \ No newline at end of file diff --git a/corpus/m6/native-link-controls-01/machine.json b/corpus/m6/native-link-controls-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..9fef917c6b29aed555ae3b45706c36fc77f2174d --- /dev/null +++ b/corpus/m6/native-link-controls-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-5025fb31", "hostname": "ONE-M6-5025FB31"} diff --git a/corpus/m6/native-link-controls-01/notebook/Links.one b/corpus/m6/native-link-controls-01/notebook/Links.one new file mode 100644 index 0000000000000000000000000000000000000000..9c1dce9d28614b07fff0175bde098cd113fc6af1 Binary files /dev/null and b/corpus/m6/native-link-controls-01/notebook/Links.one differ diff --git a/corpus/m6/native-link-controls-01/notebook/Open Notebook.onetoc2 b/corpus/m6/native-link-controls-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..39b72ca110cdfbeb05ff10d839cc26f42d46f5b0 Binary files /dev/null and b/corpus/m6/native-link-controls-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-link-controls-01/notebook/fixture.json b/corpus/m6/native-link-controls-01/notebook/fixture.json new file mode 100644 index 0000000000000000000000000000000000000000..3259f14a28b36969e66580d437c0988f14b9ca20 --- /dev/null +++ b/corpus/m6/native-link-controls-01/notebook/fixture.json @@ -0,0 +1,11 @@ +{ + "sections": [ + "Links.one" + ], + "pages": [ + { + "section": "Links.one", + "xml": "Hyperlink boundary controls<a href=\"https://example.invalid/label/0\"><span style=\"font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow\"> label </span></a><a href=\"https://example.invalid/label/1\"><span style=\"font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow\">\tlabel\t</span></a><a href=\"https://example.invalid/label/2\"><span style=\"font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow\"> label </span></a><a href=\"https://example.invalid/label/3\"><span style=\"font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow\"> \tlabel \t</span></a><a href=\"https://example.invalid/label/4\"><span style=\"font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow\">label</span></a><a href=\"https://example.invalid/label/5\"><span style=\"font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow\"> </span></a><a href=\"https://example.invalid/label/6\"><span style=\"font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow\"> label </span></a><a href=\"https://example.invalid/label/7\"><span style=\"font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow\"> ]]&gt; end</span></a><a href=\"https://example.invalid/label/8\"><span style=\"font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow\">&lt;b&gt; &amp; &quot;quoted&quot;</span></a><a href=\"https://example.invalid/label/9\"><span style=\"font-family:Calibri;font-size:14pt;font-weight:bold;text-decoration:underline;color:red;background:yellow\">\nlabel\n</span></a>" + } + ] +} \ No newline at end of file diff --git a/corpus/m6/native-link-controls-01/notebook/synthetic.one b/corpus/m6/native-link-controls-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..8f7bd60a9270aeec8e1f9d09453cf57b30d3d1ed Binary files /dev/null and b/corpus/m6/native-link-controls-01/notebook/synthetic.one differ diff --git a/corpus/m6/native-link-controls-01/pdf-format-checks.json b/corpus/m6/native-link-controls-01/pdf-format-checks.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-link-controls-01/pdf-format-checks.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-link-controls-01/read/environment.json b/corpus/m6/native-link-controls-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..2eae7ca8822ab6a47a68f4c50261928d3cab3c77 --- /dev/null +++ b/corpus/m6/native-link-controls-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-5025FB31", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-link-controls-01/read/hierarchy.xml b/corpus/m6/native-link-controls-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..4edbeb1abc7dd1eee3a1d22f82a770fe4797c4e1 --- /dev/null +++ b/corpus/m6/native-link-controls-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-link-controls-01/read/page-000.pdf b/corpus/m6/native-link-controls-01/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e33bac4b3b39ddf0d703084cd9e28b938862fffd Binary files /dev/null and b/corpus/m6/native-link-controls-01/read/page-000.pdf differ diff --git a/corpus/m6/native-link-controls-01/read/page-000.xml b/corpus/m6/native-link-controls-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..a54a36c6e591ff2921a09f7308c3af50c0a8fa17 --- /dev/null +++ b/corpus/m6/native-link-controls-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-link-controls-01/read/page-001.pdf b/corpus/m6/native-link-controls-01/read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1be5a8e4ff1e32365cac11817fcca5a841675c0c Binary files /dev/null and b/corpus/m6/native-link-controls-01/read/page-001.pdf differ diff --git a/corpus/m6/native-link-controls-01/read/page-001.xml b/corpus/m6/native-link-controls-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..fcb1157bfe77fb755bc287feabf5f878e506c202 --- /dev/null +++ b/corpus/m6/native-link-controls-01/read/page-001.xml @@ -0,0 +1,27 @@ + + label ]]>        label        ]]> label ]]>         label         ]]>label]]> ]]>label]]> ]]> end]]><b> & "quoted"]]>
+label]]>
diff --git a/corpus/m6/native-link-controls-01/read/payloads.json b/corpus/m6/native-link-controls-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/m6/native-link-controls-01/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/m6/native-link-controls-01/run.json b/corpus/m6/native-link-controls-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..4651e8dcd277aa0332b111370f30d361e42dfb60 --- /dev/null +++ b/corpus/m6/native-link-controls-01/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m6/link-controls-input-01/notebook", + "expected_pages": 2, + "author": "tools/native/pages.ps1", + "author_timeout_seconds": 600, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "dfbf0e016aa4c8486ecea9f39768c633de05ac0db8214139052ca2e9c43bbd02", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "fc7199ff4e01a5d18dbc6d472130006ef6f195a8f944daa33eaf6de2ac896553" + } +} diff --git a/corpus/m6/native-link-controls-01/scripts/author.ps1 b/corpus/m6/native-link-controls-01/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..8e428618e3452caa35da88687293b520c273b6c6 --- /dev/null +++ b/corpus/m6/native-link-controls-01/scripts/author.ps1 @@ -0,0 +1,42 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$fixture = Get-Content (Join-Path $Root 'notebook\fixture.json') -Raw -Encoding UTF8 | ConvertFrom-Json +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sections = @{} + foreach ($path in $fixture.sections) { + $parts = $path.Split('/') + if (@($parts | Where-Object { $_ -in @('', '.', '..') -or $_.Contains('\') -or $_.Contains(':') }).Count) { throw 'Invalid fixture section path.' } + $parent = $notebookId + for ($index = 0; $index -lt $parts.Count; $index++) { + $id = '' + $app.OpenHierarchy($parts[$index], $parent, [ref]$id, $(if ($index -eq $parts.Count - 1) {3} else {2})) + $parent = $id + } + $sections[$path] = $id + } + $index = 0 + foreach ($item in $fixture.pages) { + $pageId = '' + $app.CreateNewPage($sections[$item.section], [ref]$pageId, 0) + [xml]$xml = $item.xml.Replace('__ASSETS__', [Security.SecurityElement]::Escape((Join-Path $Root 'notebook\fixture-data'))) + $xml.DocumentElement.SetAttribute('ID', $pageId) + [IO.File]::WriteAllText((Join-Path $inputs ('page-{0:d3}.xml' -f $index)), $xml.OuterXml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml.OuterXml, [DateTime]::MinValue, 1, $true) + $index++ + } + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/corpus/m6/native-link-controls-01/scripts/cold.ps1 b/corpus/m6/native-link-controls-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-link-controls-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-link-controls-01/scripts/read.ps1 b/corpus/m6/native-link-controls-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..ec9463bef5b3fc7be427a10f19c42c4338186945 --- /dev/null +++ b/corpus/m6/native-link-controls-01/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 3, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-link-controls-01/source.json b/corpus/m6/native-link-controls-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..e59dd6aa014a7d9b03ec4cb632922d8ab53f53fc --- /dev/null +++ b/corpus/m6/native-link-controls-01/source.json @@ -0,0 +1,20 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86", + "mtime_ns": 1788592288950419463 + }, + { + "path": "fixture.json", + "bytes": 2885, + "sha256": "d4b15f16ce04576d76e3c4d8f5471faec26b1f30c1755b9b10674f7181108648", + "mtime_ns": 1788662692523936849 + }, + { + "path": "synthetic.one", + "bytes": 3348, + "sha256": "b0662387c3fdc256d8dbe809e3b8f73b3586559696467fb1fff8f589095fa797", + "mtime_ns": 1788592288941514581 + } +] diff --git a/corpus/m6/native-link-controls-01/teardown.json b/corpus/m6/native-link-controls-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-link-controls-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-math-01/ORACLE.md b/corpus/m6/native-math-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..b08be51c50d839a27a6b422104839ae260d50e1f --- /dev/null +++ b/corpus/m6/native-math-01/ORACLE.md @@ -0,0 +1,20 @@ +# Native equation controls + +An isolated OneNote 14.0.4763.1000 clone authored a page through the equation UI +(Alt+=): `x^2+y^2=z^2`, `(a+b)/(c+d)`, and inline `\alpha+\beta`. +The UI showed superscripts and a stacked fraction; ordinary text follows the +first equation. `read/page-000.xml` exports three MathML expressions, including +their structure and display/inline distinction. The clone was deleted. + +The source contains mathematical Unicode plus FDD0/FDEE/FDEF structural controls. +MathFormatting is set on the equation style. The two structured expressions have +11 and 3 TextRunData property sets respectively. Their private properties remain +opaque, with a checked one-to-one association to the UTF-16 runs in the model. +The report identifies these equations and links to the native reference; it does +not display structural controls as ordinary prose. The inline Greek expression +contains no structural controls and remains readable. + +[A fresh-clone read](../native-math-cold-01/read/page-000.xml) exports identical +MathML. `tests/document.rs` verifies the stored text, run associations and math +flags; `tools/test_document_oracle.py` verifies native equation structure and its +preservation across caches. The public document fuzzer includes this source. diff --git a/corpus/m6/native-math-01/agent.py b/corpus/m6/native-math-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-math-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-math-01/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/m6/native-math-01/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/native-math-01/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/native-math-01/before-read/environment.json b/corpus/m6/native-math-01/before-read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..2e2cde8bff24e9933f6c76056b9152890bd424a9 --- /dev/null +++ b/corpus/m6/native-math-01/before-read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-FBE8C24F", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-math-01/before-read/hierarchy.xml b/corpus/m6/native-math-01/before-read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2dde7e53bb001518e57482a90cb9c01d13b71c57 --- /dev/null +++ b/corpus/m6/native-math-01/before-read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-math-01/before-read/page-000.pdf b/corpus/m6/native-math-01/before-read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0efe02df09025247405c35f02aef1348232ca5d5 Binary files /dev/null and b/corpus/m6/native-math-01/before-read/page-000.pdf differ diff --git a/corpus/m6/native-math-01/before-read/page-000.xml b/corpus/m6/native-math-01/before-read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..85ffa8e8a6608a055d888f3ef8bbeb1666529af2 --- /dev/null +++ b/corpus/m6/native-math-01/before-read/page-000.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/native-math-01/before-read/payloads.json b/corpus/m6/native-math-01/before-read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..b89c936820fed2a8cbc4ab7266b1999d5b6c808e --- /dev/null +++ b/corpus/m6/native-math-01/before-read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{277E0F35-AFF2-499E-A301-9497BB54C9A6}{11}{B0}", + "kind": "InsertedFile", + "page": "{AE310B73-7730-4A1D-A598-56CE38784F33}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/m6/native-math-01/commands.jsonl b/corpus/m6/native-math-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..1af545ceafa8243990a35eddcad8710dc049f01a --- /dev/null +++ b/corpus/m6/native-math-01/commands.jsonl @@ -0,0 +1,6 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-FBE8C24F -ExpectedPages 1 -Pdf -KeepOpen", "exit": 0, "stdout": "Read 2 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\read -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Rename-Item C:\\one-tests\\runs\\capture\\read before-read\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-FBE8C24F -UseCurrentCache -ExpectedPages -1 -Pdf", "exit": 0, "stdout": "Read 2 sections and 2 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-math-01/finish b/corpus/m6/native-math-01/finish new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/corpus/m6/native-math-01/health.json b/corpus/m6/native-math-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..e7688630ef11c298ca88ab7d50c13c2df693da50 --- /dev/null +++ b/corpus/m6/native-math-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-FBE8C24F", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-math-01/machine.json b/corpus/m6/native-math-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..fa6dbc8d9eaaa08dd59d19395038f219134e48bf --- /dev/null +++ b/corpus/m6/native-math-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-fbe8c24f", "hostname": "ONE-M6-FBE8C24F"} diff --git a/corpus/m6/native-math-01/model/assets.json b/corpus/m6/native-math-01/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..f05eb471475a6f09d82bd2202938dc604c69b31d --- /dev/null +++ b/corpus/m6/native-math-01/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/1.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}},{"path":"assets/2.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}}] \ No newline at end of file diff --git a/corpus/m6/native-math-01/model/assets/0.bin b/corpus/m6/native-math-01/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/native-math-01/model/assets/0.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/native-math-01/model/assets/1.bin b/corpus/m6/native-math-01/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/native-math-01/model/assets/1.bin differ diff --git a/corpus/m6/native-math-01/model/assets/2.bin b/corpus/m6/native-math-01/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/native-math-01/model/assets/2.bin differ diff --git a/corpus/m6/native-math-01/model/document.json b/corpus/m6/native-math-01/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..17fa68325c56f76eb8c4ab60244d2787440ec6af --- /dev/null +++ b/corpus/m6/native-math-01/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{CC260C17-7C87-0AF5-0A76-9C7DFAE0898B},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{B3C75306-06D3-02B8-3306-4E0FC24196A2},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{9AEC7F1C-E6DA-0B0A-21E7-B5B554142632},1"},"revisions":{"{B3C75306-06D3-02B8-3306-4E0FC24196A2},1":{"roots":{"1":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},10","2":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},11","4":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},26"},"nodes":{"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},10":{"jcid":393271,"children":[],"content":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Equation controls","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"8a3676b48983ce4d81a0f8ba18b4bd9b"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"d035570dbf3ddd01"}}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},12":{"jcid":393227,"children":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},28"],"content":[],"structure":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},13"],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139067,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"7600690072007400750061006c000000"}},{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},13":{"jcid":393260,"children":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},14","{9419695B-68DF-0FDF-3526-F0E2C1D0A141},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139066,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Title"},"extra":[[{"id":335551550,"value":{"Bytes":"0c000900"}},{"id":335551620,"value":{"Bytes":"00000000"}},{"id":335551729,"value":{"Bytes":"00000000"}}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},14":{"jcid":393228,"children":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},15"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139066,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708793,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"},{"id":2281708689,"value":"NoData"},{"id":335551724,"value":{"Bytes":"00009040"}},{"id":2281708799,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},15":{"jcid":393229,"children":[],"content":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},16"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473139067,"modified":1473139067,"original_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","latest_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708724,"value":"NoData"}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},16":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139067,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Equation controls","runs":[{"start":0,"end":17,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},27"}],"paragraph_style":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},19","boilerplate":false},"extra":[[{"id":2281708724,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":2281714909,"value":"NoData"}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},18":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageTitle"},"extra":[[]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},20":{"jcid":393228,"children":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},21","{9419695B-68DF-0FDF-3526-F0E2C1D0A141},24"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139066,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708725,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708722,"value":"NoData"},{"id":2281708766,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":335551550,"value":{"Bytes":"00000000"}},{"id":335551620,"value":{"Bytes":"0c000000"}}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},21":{"jcid":393229,"children":[],"content":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473139066,"modified":1473139066,"original_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","latest_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139066,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Saturday, September 05, 2026","runs":[{"start":0,"end":28,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},27"}],"paragraph_style":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}},{"id":2281714909,"value":"NoData"}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},23":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"PageDateTime"},"extra":[[]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},24":{"jcid":393229,"children":[],"content":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},25"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473139066,"modified":1473139066,"original_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","latest_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708722,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":134224948,"value":"NoData"}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},25":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139066,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"10:17 PM","runs":[{"start":0,"end":8,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},27"}],"paragraph_style":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},23","boilerplate":true},"extra":[[{"id":2281708766,"value":"NoData"},{"id":2281708544,"value":"NoData"},{"id":2281708812,"value":"NoData"},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769416,"value":{"Bytes":"0000000003"}},{"id":2281714909,"value":"NoData"}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},26":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134331454990000000},"extra":[[]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},27":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231041,"value":"NoData"},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},28":{"jcid":393228,"children":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},29","{9419695B-68DF-0FDF-3526-F0E2C1D0A141},33","{9419695B-68DF-0FDF-3526-F0E2C1D0A141},35","{9419695B-68DF-0FDF-3526-F0E2C1D0A141},38"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":126.0,"y":86.4,"max_width":262.8,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139098,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":335551620,"value":{"Bytes":"09000000"}}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},29":{"jcid":393229,"children":[],"content":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},30"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473139067,"modified":1473139084,"original_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","latest_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},30":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139084,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"﷐𝑥﷮2﷯+﷐𝑦﷮2﷯=﷐𝑧﷮2﷯","runs":[{"start":0,"end":1,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":1,"end":4,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":4,"end":6,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":6,"end":7,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":7,"end":8,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":8,"end":11,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":11,"end":13,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":13,"end":14,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":14,"end":15,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":15,"end":18,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":18,"end":20,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"}],"paragraph_style":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},18","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"7f00"}},{"id":1073755289,"value":{"Sets":{"start":1,"end":12}}},{"id":469769416,"value":{"Bytes":"0000000000"}}],[{"id":335557711,"value":{"Bytes":"1f000000"}},{"id":335557712,"value":{"Bytes":"02000000"}},{"id":268448851,"value":{"Bytes":"5e00"}}],[{"id":335557711,"value":{"Bytes":"1f000000"}}],[{"id":335557711,"value":{"Bytes":"1f000000"}},{"id":335557712,"value":{"Bytes":"01000000"}}],[{"id":335557711,"value":{"Bytes":"00000090"}}],[{"id":335557711,"value":{"Bytes":"1f000000"}},{"id":335557712,"value":{"Bytes":"02000000"}},{"id":268448851,"value":{"Bytes":"5e00"}}],[{"id":335557711,"value":{"Bytes":"1f000000"}}],[{"id":335557711,"value":{"Bytes":"1f000000"}},{"id":335557712,"value":{"Bytes":"01000000"}}],[{"id":335557711,"value":{"Bytes":"00000090"}}],[{"id":335557711,"value":{"Bytes":"1f000000"}},{"id":335557712,"value":{"Bytes":"02000000"}},{"id":268448851,"value":{"Bytes":"5e00"}}],[{"id":335557711,"value":{"Bytes":"1f000000"}}],[{"id":335557711,"value":{"Bytes":"1f000000"}},{"id":335557712,"value":{"Bytes":"01000000"}}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":true,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":null,"color":null,"highlight":null,"language":65663,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":2281714689,"value":"NoData"},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"},{"id":2281709090,"value":"NoData"}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},33":{"jcid":393229,"children":[],"content":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},34"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473139084,"modified":1473139084,"original_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","latest_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},34":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139084,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"After equation.","runs":[{"start":0,"end":15,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},27"}],"paragraph_style":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},18","boilerplate":false},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":2281714909,"value":"NoData"}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},35":{"jcid":393229,"children":[],"content":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},36"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473139098,"modified":1473139098,"original_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","latest_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},36":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139098,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"﷐𝑎+𝑏﷮𝑐+𝑑﷯","runs":[{"start":0,"end":1,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":1,"end":7,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"},{"start":7,"end":13,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"}],"paragraph_style":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},18","boilerplate":false},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"7f00"}},{"id":1073755289,"value":{"Sets":{"start":1,"end":4}}}],[{"id":335557711,"value":{"Bytes":"10000000"}},{"id":335557712,"value":{"Bytes":"02000000"}},{"id":268448851,"value":{"Bytes":"2f00"}}],[{"id":335557711,"value":{"Bytes":"10000000"}}],[{"id":335557711,"value":{"Bytes":"10000000"}},{"id":335557712,"value":{"Bytes":"01000000"}}]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},38":{"jcid":393229,"children":[],"content":["{9419695B-68DF-0FDF-3526-F0E2C1D0A141},39"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473139098,"modified":1473139099,"original_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","latest_author":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},17","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},39":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473139099,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Inline 𝛼+𝛽","runs":[{"start":0,"end":7,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},27"},{"start":7,"end":12,"format":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},31"}],"paragraph_style":"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},18","boilerplate":false},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}}]]}}},"{9AEC7F1C-E6DA-0B0A-21E7-B5B554142632},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}},"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{CE29543B-9E41-0DC2-1E3B-00FDCDF82019},1"},"revisions":{"{CE29543B-9E41-0DC2-1E3B-00FDCDF82019},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{EE8ECC26-4A87-481B-BD62-4BD120C4BC63},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Equation controls","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"8a3676b48983ce4d81a0f8ba18b4bd9b"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"d035570dbf3ddd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10","{411D5BF3-52F4-0FF8-3262-670DA9026E18},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Fictitious: café, 東京, مرحبا","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}}]]},"{411D5BF3-52F4-0FF8-3262-670DA9026E18},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{CC260C17-7C87-0AF5-0A76-9C7DFAE0898B},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"3d8951c1a05fd54d9c16111ec8b743ab"}},{"id":402660453,"value":{"Bytes":"d0c4540dbf3ddd01"}},{"id":603993154,"value":{"Objects":["{EE8ECC26-4A87-481B-BD62-4BD120C4BC63},1"]}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{74A71964-B70E-0589-3BB3-56F955273024},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{74A71964-B70E-0589-3BB3-56F955273024},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":36.0,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{57D959A7-EBAB-0B48-091B-646F994DD19F},18"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052015,"modified":1473052016,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},17":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":96.0,"max_width":260.0,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052017,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"c013e140"}}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{55644A5D-B639-0555-287F-86AC4C458A34},15"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052017,"modified":1473052017,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},15":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052017,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Fictitious positioned outline.","runs":[{"start":0,"end":30,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16"}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231041,"value":"NoData"},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},18":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052016,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Fictitious: café, 東京, مرحبا","runs":[{"start":0,"end":18,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},19"},{"start":18,"end":20,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},20"},{"start":20,"end":22,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},19"},{"start":22,"end":27,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},21"}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231041,"value":"NoData"},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"SimSun","font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":2281714858,"value":"NoData"},{"id":201334017,"value":{"Bytes":"86"}},{"id":134231041,"value":"NoData"},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},21":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Arial","font_size":null,"color":7949855,"highlight":null,"language":1025,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":2281714858,"value":"NoData"},{"id":201334017,"value":{"Bytes":"b2"}},{"id":134231041,"value":"NoData"},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":264.0,"y":192.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Fictitious: café, 東京, مرحبا","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},10","{55644A5D-B639-0555-287F-86AC4C458A34},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},20","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Fictitious: café, 東京, مرحبا","level":null,"width":753.984,"height":783.0,"margin_origin_x":36.0,"margin_origin_y":14.400001,"rtl":false},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":192.0,"max_width":96.000015,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"},{"id":335551707,"value":{"Bytes":"aaaa0640"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052018,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb01000000ab6180f822df4542b575c076ce6aaa0c000000000200000000001066000000010000200000002b59212af3023a32dd5b4c71bb1d072124be7a993933c762d8590536da9d37d2000000000e80000000020000200000000595329d755a96366351f1ec57dc25193cca79a8e4e438b31b7451415e4b0482200000003f639ba9e4652c47fc3d06fad88a6844861d447910d32e37fd078583e9a3b590400000006ea7ab72598677e78d2a6b888429c410bb3d31b48adbddfb607788d44d450a674407b51e4209dbf11dc5531e99f797214833a045b38073716b5876053ec85076"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},13":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},14"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},20":{"jcid":393228,"children":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},21"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":501.52203,"y":139.75984,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":335551620,"value":{"Bytes":"09000000"}},{"id":335551707,"value":{"Bytes":"456f0341"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},21":{"jcid":393229,"children":[],"content":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052301,"modified":1473052301,"original_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"","runs":[{"start":0,"end":0,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16"}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":0.0,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"01000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},19"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":144.0,"y":312.0,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},11":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},12":{"jcid":393250,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[39.14614,45.14567],"locked":[false,false],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},13":{"jcid":393251,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"046d6edc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16"}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},22":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e242dc0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052020,"modified":1473052020,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052020,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16"}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]}}},"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/native-math-01/model/text.json b/corpus/m6/native-math-01/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..18b06c7129b74322f289d1f32878909782deab3a --- /dev/null +++ b/corpus/m6/native-math-01/model/text.json @@ -0,0 +1 @@ +{"{CC260C17-7C87-0AF5-0A76-9C7DFAE0898B},1":{"{B3C75306-06D3-02B8-3306-4E0FC24196A2},1":{"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},16":[{"text":"Equation controls","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":17.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},22":[{"text":"Saturday, September 05, 2026","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},25":[{"text":"10:17 PM","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":10.0,"color":8421504,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},30":[{"text":"﷐","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"𝑥﷮","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"2﷯","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"+","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"﷐","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"𝑦﷮","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"2﷯","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"=","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"﷐","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"𝑧﷮","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"2﷯","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},34":[{"text":"After equation.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},36":[{"text":"﷐","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"𝑎+𝑏﷮","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"𝑐+𝑑﷯","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{9419695B-68DF-0FDF-3526-F0E2C1D0A141},39":[{"text":"Inline ","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"𝛼+𝛽","format":{"bold":false,"italic":true,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Cambria Math","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":65663,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{9AEC7F1C-E6DA-0B0A-21E7-B5B554142632},1":{}},"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{CE29543B-9E41-0DC2-1E3B-00FDCDF82019},1":{}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{74A71964-B70E-0589-3BB3-56F955273024},1":{"{55644A5D-B639-0555-287F-86AC4C458A34},15":[{"text":"Fictitious positioned outline.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{57D959A7-EBAB-0B48-091B-646F994DD19F},18":[{"text":"Fictitious: café, ","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"東京","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"SimSun","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":", ","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null},{"text":"مرحبا","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Arial","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1025,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},22":[{"text":"","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},21":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}],"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},29":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{}}} \ No newline at end of file diff --git a/corpus/m6/native-math-01/notebook/Open Notebook.one b/corpus/m6/native-math-01/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..f6c61e56f1d1e057db725efb3fc0a4b16c5a27bb Binary files /dev/null and b/corpus/m6/native-math-01/notebook/Open Notebook.one differ diff --git a/corpus/m6/native-math-01/notebook/Open Notebook.onetoc2 b/corpus/m6/native-math-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/native-math-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-math-01/notebook/synthetic.one b/corpus/m6/native-math-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..38030ad55ccb4e4206490bac57dfe3edfa644806 Binary files /dev/null and b/corpus/m6/native-math-01/notebook/synthetic.one differ diff --git a/corpus/m6/native-math-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/m6/native-math-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/native-math-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/native-math-01/read/environment.json b/corpus/m6/native-math-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..d3300883bbbc40e17cc00a5151c2e47433cdddf5 --- /dev/null +++ b/corpus/m6/native-math-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-FBE8C24F", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-math-01/read/hierarchy.xml b/corpus/m6/native-math-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..5249f43af461f07b0c179b3a63ed772a2f0d9f6c --- /dev/null +++ b/corpus/m6/native-math-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-math-01/read/page-000.pdf b/corpus/m6/native-math-01/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4f9f1355d2ae4271c48e0c0d30a0a49fb7ad7a6c Binary files /dev/null and b/corpus/m6/native-math-01/read/page-000.pdf differ diff --git a/corpus/m6/native-math-01/read/page-000.xml b/corpus/m6/native-math-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..d7c906cac32158efb1de5434e397f5b4ec4979eb --- /dev/null +++ b/corpus/m6/native-math-01/read/page-000.xml @@ -0,0 +1,3 @@ + +x2+y2=z2]]>a+bc+d]]>Inline ]]> diff --git a/corpus/m6/native-math-01/read/page-001.pdf b/corpus/m6/native-math-01/read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f19614173ef0ce6bdf5dcee00532ec78a8508cf0 Binary files /dev/null and b/corpus/m6/native-math-01/read/page-001.pdf differ diff --git a/corpus/m6/native-math-01/read/page-001.xml b/corpus/m6/native-math-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..960dd8e9f30673cd88ea7247620507a2f24a12fc --- /dev/null +++ b/corpus/m6/native-math-01/read/page-001.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/native-math-01/read/payloads.json b/corpus/m6/native-math-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..b89c936820fed2a8cbc4ab7266b1999d5b6c808e --- /dev/null +++ b/corpus/m6/native-math-01/read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{277E0F35-AFF2-499E-A301-9497BB54C9A6}{11}{B0}", + "kind": "InsertedFile", + "page": "{AE310B73-7730-4A1D-A598-56CE38784F33}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/m6/native-math-01/run.json b/corpus/m6/native-math-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..61ea5451f90b6ac7ee01589e5d102eb79af1ac61 --- /dev/null +++ b/corpus/m6/native-math-01/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/native-ink/cold-ui-ink/notebook", + "expected_pages": 1, + "author": null, + "author_timeout_seconds": 600, + "inspect": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/m6/native-math-01/scripts/cold.ps1 b/corpus/m6/native-math-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-math-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-math-01/scripts/read.ps1 b/corpus/m6/native-math-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/corpus/m6/native-math-01/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-math-01/source.json b/corpus/m6/native-math-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..6109769d947f41f931301ec4ed3a1b291ffb8c31 --- /dev/null +++ b/corpus/m6/native-math-01/source.json @@ -0,0 +1,20 @@ +[ + { + "path": "Open Notebook.one", + "bytes": 4016, + "sha256": "e2d9f3e4d3e8a57adaff7ba5af5f1e23bea4b3b590a012acd8d1c4f166556c88", + "mtime_ns": 1788585164197912114 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4944, + "sha256": "36274ad5cc077c6b1ad51ee4c4b90d3b6798a45ce446cbfd7c9d7ac504776b28", + "mtime_ns": 1788585164198018949 + }, + { + "path": "synthetic.one", + "bytes": 27808, + "sha256": "1326c475cc3a9f412ff4d072cf515c1482b3b9e07798921e582767b064401947", + "mtime_ns": 1788585164197723028 + } +] diff --git a/corpus/m6/native-math-01/teardown.json b/corpus/m6/native-math-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-math-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-math-cold-01/agent.py b/corpus/m6/native-math-cold-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-math-cold-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-math-cold-01/commands.jsonl b/corpus/m6/native-math-cold-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..6dd43552cae7acb3e4389660b54b6365b6799a55 --- /dev/null +++ b/corpus/m6/native-math-cold-01/commands.jsonl @@ -0,0 +1,3 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-37A0E999 -ExpectedPages 2 -Pdf", "exit": 0, "stdout": "Read 2 sections and 2 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\read -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-math-cold-01/health.json b/corpus/m6/native-math-cold-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..b4586f570f015ac07666b6d751565c7630908ae3 --- /dev/null +++ b/corpus/m6/native-math-cold-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-37A0E999", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-math-cold-01/machine.json b/corpus/m6/native-math-cold-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..818e93e73315e8984eaf8c9462d3d31621facfe3 --- /dev/null +++ b/corpus/m6/native-math-cold-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-37a0e999", "hostname": "ONE-M6-37A0E999"} diff --git a/corpus/m6/native-math-cold-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/m6/native-math-cold-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/native-math-cold-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/native-math-cold-01/read/environment.json b/corpus/m6/native-math-cold-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..2e298676a683e6951466404aed63e20462b12cc8 --- /dev/null +++ b/corpus/m6/native-math-cold-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-37A0E999", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-math-cold-01/read/hierarchy.xml b/corpus/m6/native-math-cold-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..38118d5a9afdc83e4b6b0a5b4aa06c5f740ccdbc --- /dev/null +++ b/corpus/m6/native-math-cold-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-math-cold-01/read/page-000.pdf b/corpus/m6/native-math-cold-01/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3bb8a4c913e1c673e020f6e94b0e7ed1defa020d Binary files /dev/null and b/corpus/m6/native-math-cold-01/read/page-000.pdf differ diff --git a/corpus/m6/native-math-cold-01/read/page-000.xml b/corpus/m6/native-math-cold-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..061b3965bb056b1c57369fb9da367424947e68ca --- /dev/null +++ b/corpus/m6/native-math-cold-01/read/page-000.xml @@ -0,0 +1,3 @@ + +x2+y2=z2]]>a+bc+d]]>Inline ]]> diff --git a/corpus/m6/native-math-cold-01/read/page-001.pdf b/corpus/m6/native-math-cold-01/read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e62d7ca32e78486fb51c431abde316e11ba359b2 Binary files /dev/null and b/corpus/m6/native-math-cold-01/read/page-001.pdf differ diff --git a/corpus/m6/native-math-cold-01/read/page-001.xml b/corpus/m6/native-math-cold-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..8b598c87aaa9ae8cd02e3fdce062ae08438e1c95 --- /dev/null +++ b/corpus/m6/native-math-cold-01/read/page-001.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/native-math-cold-01/read/payloads.json b/corpus/m6/native-math-cold-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..977fca91c58d0accebe78b68c061a3ab582558b4 --- /dev/null +++ b/corpus/m6/native-math-cold-01/read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{4C6A58FA-B3CE-4F79-8BFB-A8D67B96F557}{11}{B0}", + "kind": "InsertedFile", + "page": "{C5255CBC-6B0C-4CFA-8D62-6A8FF8BA73C2}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/m6/native-math-cold-01/run.json b/corpus/m6/native-math-cold-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..b046940b8673845b2ea9f15e7d72ca3561145be3 --- /dev/null +++ b/corpus/m6/native-math-cold-01/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/m6/native-math-01/notebook", + "expected_pages": 2, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/m6/native-math-cold-01/scripts/cold.ps1 b/corpus/m6/native-math-cold-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-math-cold-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-math-cold-01/scripts/read.ps1 b/corpus/m6/native-math-cold-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/corpus/m6/native-math-cold-01/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-math-cold-01/source.json b/corpus/m6/native-math-cold-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..e113a5bdbe6969a23b2fe6b581a29f7fa9c0702a --- /dev/null +++ b/corpus/m6/native-math-cold-01/source.json @@ -0,0 +1,20 @@ +[ + { + "path": "Open Notebook.one", + "bytes": 4016, + "sha256": "e2d9f3e4d3e8a57adaff7ba5af5f1e23bea4b3b590a012acd8d1c4f166556c88", + "mtime_ns": 1788671925794591240 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4944, + "sha256": "36274ad5cc077c6b1ad51ee4c4b90d3b6798a45ce446cbfd7c9d7ac504776b28", + "mtime_ns": 1788671925794729825 + }, + { + "path": "synthetic.one", + "bytes": 35448, + "sha256": "08c944fba245e5377933341c4f6dd3740f818189f0504896243c78d48137ecc4", + "mtime_ns": 1788671925794919452 + } +] diff --git a/corpus/m6/native-math-cold-01/teardown.json b/corpus/m6/native-math-cold-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-math-cold-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-origin-controls-01/ORACLE.md b/corpus/m6/native-origin-controls-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..4ac1694e058206bacbf164978daa87953907663f --- /dev/null +++ b/corpus/m6/native-origin-controls-01/ORACLE.md @@ -0,0 +1,16 @@ +# Native page-origin control + +The input starts from `corpus/native-ink/cold-ui-ink/notebook`. Rust scalar edits +change only PageMarginOriginX/Y to 3 and -1 half-inches (108 and -36 points). +`input/operations.json` records the input hash, object identities, and old/new +property bytes. A fresh OneNote 2010 clone opened that input; `read` contains its +independent XML/PDF view and `teardown.json` records cleanup. + +For non-ink page children, native XML positions equal stored positions plus +(36, 14.4) minus the stored origin. `origin-observations.json` records all observed +positions. Ink XML exports stroke bounds, which remain opaque in the model. +The fixture also contains a 1 by 1 PNG whose native XML omits Size; its stored +intrinsic size is 0.75 by 0.75 points and it has no explicit layout dimensions. + +Run `tools/verify-document.py input/notebook read` from this fixture directory +using the repository tool path to check every supported object and coordinate. diff --git a/corpus/m6/native-origin-controls-01/agent.py b/corpus/m6/native-origin-controls-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-origin-controls-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-origin-controls-01/commands.jsonl b/corpus/m6/native-origin-controls-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..7659f76fea52ce7aa0687f78996d7bf2810f8f2f --- /dev/null +++ b/corpus/m6/native-origin-controls-01/commands.jsonl @@ -0,0 +1,3 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-F3B0587A -ExpectedPages 1 -Pdf", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\read -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-origin-controls-01/format-differences.json b/corpus/m6/native-origin-controls-01/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-origin-controls-01/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-origin-controls-01/geometry-differences.json b/corpus/m6/native-origin-controls-01/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-origin-controls-01/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-origin-controls-01/health.json b/corpus/m6/native-origin-controls-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..64fd354d03a0bceaff67a0aa5f05638a037bf2ef --- /dev/null +++ b/corpus/m6/native-origin-controls-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-F3B0587A", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-origin-controls-01/input/notebook/Open Notebook.onetoc2 b/corpus/m6/native-origin-controls-01/input/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/native-origin-controls-01/input/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-origin-controls-01/input/notebook/synthetic.one b/corpus/m6/native-origin-controls-01/input/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..54b208d50078f891b0be45a22f73a1959148b78d Binary files /dev/null and b/corpus/m6/native-origin-controls-01/input/notebook/synthetic.one differ diff --git a/corpus/m6/native-origin-controls-01/input/operations.json b/corpus/m6/native-origin-controls-01/input/operations.json new file mode 100644 index 0000000000000000000000000000000000000000..f8123bc0e2b13bf9356dabbdcff302ad9609ca7e --- /dev/null +++ b/corpus/m6/native-origin-controls-01/input/operations.json @@ -0,0 +1,18 @@ +{ + "source": "corpus/native-ink/cold-ui-ink/notebook/synthetic.one", + "source_sha256": "1326c475cc3a9f412ff4d072cf515c1482b3b9e07798921e582767b064401947", + "space": "{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1", + "page": "{273DB6C4-A230-0679-389F-9DB750E092E4},12", + "steps": [ + { + "property": "0x14001d0f", + "old": "0000803f", + "new": "00004040" + }, + { + "property": "0x14001d10", + "old": "cdcccc3e", + "new": "000080bf" + } + ] +} \ No newline at end of file diff --git a/corpus/m6/native-origin-controls-01/input/x.one b/corpus/m6/native-origin-controls-01/input/x.one new file mode 100644 index 0000000000000000000000000000000000000000..8ac0cceb6d0da95438dd148ebb42e66b69073787 Binary files /dev/null and b/corpus/m6/native-origin-controls-01/input/x.one differ diff --git a/corpus/m6/native-origin-controls-01/machine.json b/corpus/m6/native-origin-controls-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..2262fef1af99a0127be1b7ee5f56c234da0236a8 --- /dev/null +++ b/corpus/m6/native-origin-controls-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-f3b0587a", "hostname": "ONE-M6-F3B0587A"} diff --git a/corpus/m6/native-origin-controls-01/origin-observations.json b/corpus/m6/native-origin-controls-01/origin-observations.json new file mode 100644 index 0000000000000000000000000000000000000000..8da5457f9a7a184ee7958c546479bccb49169cf2 --- /dev/null +++ b/corpus/m6/native-origin-controls-01/origin-observations.json @@ -0,0 +1,114 @@ +[ + { + "kind": "Outline", + "z": "0", + "axis": "x", + "stored": 36.0, + "projected": -36.0, + "native": -36.0 + }, + { + "kind": "Outline", + "z": "0", + "axis": "y", + "stored": 14.400001, + "projected": 64.80000100000001, + "native": 64.79999542236328 + }, + { + "kind": "Ink", + "z": "5", + "axis": "x", + "stored": 0.0, + "projected": -72.0, + "native": 349.5118103027344 + }, + { + "kind": "Ink", + "z": "5", + "axis": "y", + "stored": 0.0, + "projected": 50.4, + "native": 135.1558990478516 + }, + { + "kind": "Ink", + "z": "7", + "axis": "x", + "stored": 0.0, + "projected": -72.0, + "native": 432.0 + }, + { + "kind": "Ink", + "z": "7", + "axis": "y", + "stored": 0.0, + "projected": 50.4, + "native": 142.6393585205078 + }, + { + "kind": "Outline", + "z": "1", + "axis": "x", + "stored": 144.0, + "projected": 72.0, + "native": 72.0 + }, + { + "kind": "Outline", + "z": "1", + "axis": "y", + "stored": 96.0, + "projected": 146.4, + "native": 146.3999938964844 + }, + { + "kind": "Outline", + "z": "2", + "axis": "x", + "stored": 144.0, + "projected": 72.0, + "native": 72.0 + }, + { + "kind": "Outline", + "z": "2", + "axis": "y", + "stored": 192.0, + "projected": 242.4, + "native": 242.4000091552734 + }, + { + "kind": "Outline", + "z": "3", + "axis": "x", + "stored": 264.0, + "projected": 192.0, + "native": 192.0 + }, + { + "kind": "Outline", + "z": "3", + "axis": "y", + "stored": 192.0, + "projected": 242.4, + "native": 242.4000091552734 + }, + { + "kind": "Outline", + "z": "4", + "axis": "x", + "stored": 144.0, + "projected": 72.0, + "native": 72.0 + }, + { + "kind": "Outline", + "z": "4", + "axis": "y", + "stored": 312.0, + "projected": 362.4, + "native": 362.3999938964844 + } +] \ No newline at end of file diff --git a/corpus/m6/native-origin-controls-01/pdf-format-checks.json b/corpus/m6/native-origin-controls-01/pdf-format-checks.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-origin-controls-01/pdf-format-checks.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-origin-controls-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/m6/native-origin-controls-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/native-origin-controls-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/native-origin-controls-01/read/environment.json b/corpus/m6/native-origin-controls-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..394a225cd5edd3783bad16240061d8d7f59c766d --- /dev/null +++ b/corpus/m6/native-origin-controls-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-F3B0587A", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-origin-controls-01/read/hierarchy.xml b/corpus/m6/native-origin-controls-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..4dfd7e566aecb8b3dcb3babe35c53966d82d6ca8 --- /dev/null +++ b/corpus/m6/native-origin-controls-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-origin-controls-01/read/page-000.pdf b/corpus/m6/native-origin-controls-01/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9cff3f16373ffc5573d436a44a62f130636333df Binary files /dev/null and b/corpus/m6/native-origin-controls-01/read/page-000.pdf differ diff --git a/corpus/m6/native-origin-controls-01/read/page-000.xml b/corpus/m6/native-origin-controls-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..c18c8abbbde65902067c88017c339ab3a04e40e4 --- /dev/null +++ b/corpus/m6/native-origin-controls-01/read/page-000.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/native-origin-controls-01/read/payloads.json b/corpus/m6/native-origin-controls-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..623df52dd2c821df2be4daaf8e2a90121294df0b --- /dev/null +++ b/corpus/m6/native-origin-controls-01/read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{37D99BB8-B8B8-4799-AB15-AF53E47B19AB}{11}{B0}", + "kind": "InsertedFile", + "page": "{BE969FFE-607A-441A-AD8C-6D0A67579F3E}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/m6/native-origin-controls-01/run.json b/corpus/m6/native-origin-controls-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..abf7106c969d9e70711fdcb256f16d5571da2690 --- /dev/null +++ b/corpus/m6/native-origin-controls-01/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m6/origin-controls-input/notebook", + "expected_pages": 1, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/m6/native-origin-controls-01/scripts/cold.ps1 b/corpus/m6/native-origin-controls-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-origin-controls-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-origin-controls-01/scripts/read.ps1 b/corpus/m6/native-origin-controls-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/corpus/m6/native-origin-controls-01/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-origin-controls-01/source.json b/corpus/m6/native-origin-controls-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..3dc746a143a8b892ac3f020fa13f30058f44c9f5 --- /dev/null +++ b/corpus/m6/native-origin-controls-01/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 4944, + "sha256": "36274ad5cc077c6b1ad51ee4c4b90d3b6798a45ce446cbfd7c9d7ac504776b28", + "mtime_ns": 1788669502375289236 + }, + { + "path": "synthetic.one", + "bytes": 29264, + "sha256": "5403b858894d45969d1d28b0ae5747ad5e1bbc403fc5a7f859117475ceb2a77f", + "mtime_ns": 1788669502370041037 + } +] diff --git a/corpus/m6/native-origin-controls-01/teardown.json b/corpus/m6/native-origin-controls-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-origin-controls-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-page-direction-03/ORACLE.md b/corpus/m6/native-page-direction-03/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..8ddcc5c70408bd38368566e59908f1d262db06b5 --- /dev/null +++ b/corpus/m6/native-page-direction-03/ORACLE.md @@ -0,0 +1,17 @@ +# Native right-to-left page control + +`scripts/author.ps1` changes PageSettings RTL to true and locks the existing +table columns to 96 and 144 points through OneNote COM. `before.xml`, `after.xml` +and `read/page-000.xml` retain the native observations. The saved store uses +visual left-to-right column order [Right cell, Left cell], with widths [144, 96]. +COM exports cells in page direction [Left cell, Right cell], with widths [96, 144]. +The native PDF independently confirms the physical cell order. Default outline alignment anchors the right edge: +store x + LayoutMaxWidth - PageMarginOriginX - 36 equals native x + native width. +The native table outline measures wider than its stored suggested maximum width. +Vertical coordinates retain the 14.4-point canonical origin. + +The public fixture includes images, a file and two opaque ink objects. All +supported text, object order, payloads, formats and coordinates pass +`tools/verify-document.py`. Ink stroke bounds remain distinct from the stored +container position; the comparator checks ink count and excludes stroke geometry. +`teardown.json` records deletion of the authoring clone. diff --git a/corpus/m6/native-page-direction-03/after.xml b/corpus/m6/native-page-direction-03/after.xml new file mode 100644 index 0000000000000000000000000000000000000000..dfc06da5f34626eb5ebaac8080a7591f7599c6ba --- /dev/null +++ b/corpus/m6/native-page-direction-03/after.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/native-page-direction-03/agent.py b/corpus/m6/native-page-direction-03/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-page-direction-03/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-page-direction-03/before.xml b/corpus/m6/native-page-direction-03/before.xml new file mode 100644 index 0000000000000000000000000000000000000000..942dd0b966a841585fce0f6bcbd2a7452563f3bc --- /dev/null +++ b/corpus/m6/native-page-direction-03/before.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/native-page-direction-03/commands.jsonl b/corpus/m6/native-page-direction-03/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..e2d8defa14ee6a40cf0b3da7e02f92e78b4a08d9 --- /dev/null +++ b/corpus/m6/native-page-direction-03/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-70E6B408", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-70E6B408 -ExpectedPages 1 -UseCurrentCache -Pdf", "exit": 0, "stdout": "Read 2 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-page-direction-03/format-differences.json b/corpus/m6/native-page-direction-03/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-page-direction-03/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-page-direction-03/geometry-differences.json b/corpus/m6/native-page-direction-03/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-page-direction-03/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-page-direction-03/health.json b/corpus/m6/native-page-direction-03/health.json new file mode 100644 index 0000000000000000000000000000000000000000..26d086bdb30585c0c3937dd435527d5df6be37e3 --- /dev/null +++ b/corpus/m6/native-page-direction-03/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-70E6B408", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-page-direction-03/machine.json b/corpus/m6/native-page-direction-03/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..14e7f4669f6a6086903dcf2daa6c2f33be518301 --- /dev/null +++ b/corpus/m6/native-page-direction-03/machine.json @@ -0,0 +1 @@ +{"name": "m6-70e6b408", "hostname": "ONE-M6-70E6B408"} diff --git a/corpus/m6/native-page-direction-03/model/assets.json b/corpus/m6/native-page-direction-03/model/assets.json new file mode 100644 index 0000000000000000000000000000000000000000..b1137d2c8f93b856619ffc841a598840985718cf --- /dev/null +++ b/corpus/m6/native-page-direction-03/model/assets.json @@ -0,0 +1 @@ +[{"path":"assets/0.bin","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]}},{"path":"assets/1.bin","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]}},{"path":"assets/2.bin","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]}}] \ No newline at end of file diff --git a/corpus/m6/native-page-direction-03/model/assets/0.bin b/corpus/m6/native-page-direction-03/model/assets/0.bin new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/m6/native-page-direction-03/model/assets/0.bin differ diff --git a/corpus/m6/native-page-direction-03/model/assets/1.bin b/corpus/m6/native-page-direction-03/model/assets/1.bin new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/native-page-direction-03/model/assets/1.bin @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/native-page-direction-03/model/assets/2.bin b/corpus/m6/native-page-direction-03/model/assets/2.bin new file mode 100644 index 0000000000000000000000000000000000000000..986cf517fc98878a9ec8ee1176896f8008a121ef Binary files /dev/null and b/corpus/m6/native-page-direction-03/model/assets/2.bin differ diff --git a/corpus/m6/native-page-direction-03/model/document.json b/corpus/m6/native-page-direction-03/model/document.json new file mode 100644 index 0000000000000000000000000000000000000000..103a2094de83cc3a0856acfc81d35432b87b8fee --- /dev/null +++ b/corpus/m6/native-page-direction-03/model/document.json @@ -0,0 +1 @@ +{"file_id":[60,64,135,83,160,135,242,70,172,54,122,51,224,103,190,213],"root":"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1","spaces":{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{9E24424C-0CD9-0E62-29EE-A244369C13D7},1"},"revisions":{"{9E24424C-0CD9-0E62-29EE-A244369C13D7},1":{"roots":{"1":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10","2":"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11"},"nodes":{"{C7F40B04-17EF-07C8-0477-F2143775FC8E},10":{"jcid":393224,"children":[],"content":[],"structure":[],"spaces":["{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1"],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"PageSeries"},"extra":[[{"id":469769264,"value":{"Bytes":"8b3ac8fcf49f714db27dc2cf3ff433a8"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}},{"id":603993154,"value":{"Objects":["{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1"]}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},10":{"jcid":393223,"children":["{C7F40B04-17EF-07C8-0477-F2143775FC8E},10"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Section","default_template":null},"extra":[[{"id":469769264,"value":{"Bytes":"ad3e51bcb6d1bd448acde95750378bfa"}},{"id":402660453,"value":{"Bytes":"b0804d5df43cdd01"}}]]},"{3E291957-EF19-4BA0-BA98-4A7D238730F0},11":{"jcid":131121,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"SectionMetadata","name":null,"color":14985354},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]},"{46B0FEC5-7819-4E50-8A2F-5F53CDF1BEF4},1":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Fictitious: café, 東京, مرحبا","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}}]]}}}}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"contexts":{"{00000000-0000-0000-0000-000000000000},0":"{A79B9913-4E0E-02D3-3A7E-62CBA31DDFFF},1","{7111497F-1B6B-4209-9491-C98B04CF4C5A},1":"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1"},"revisions":{"{A79B9913-4E0E-02D3-3A7E-62CBA31DDFFF},1":{"roots":{"1":"{273DB6C4-A230-0679-389F-9DB750E092E4},10","2":"{273DB6C4-A230-0679-389F-9DB750E092E4},11","4":"{273DB6C4-A230-0679-389F-9DB750E092E4},13"},"nodes":{"{03D49648-056C-0F08-32C9-0424E8496E7D},10":{"jcid":393228,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":10835.251,"y":14.400001,"max_width":127.513695,"max_height":14.3},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},11":{"jcid":393229,"children":[],"content":["{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},19"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052015,"modified":1473137903,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708596,"value":"NoData"}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},13":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{03D49648-056C-0F08-32C9-0424E8496E7D},17":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{55644A5D-B639-0555-287F-86AC4C458A34},10":{"jcid":393228,"children":["{55644A5D-B639-0555-287F-86AC4C458A34},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":10943.251,"y":96.0,"max_width":167.04492,"max_height":13.427716},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},11":{"jcid":393229,"children":[],"content":["{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},31"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473137903,"modified":1473137903,"original_author":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},15","latest_author":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708596,"value":"NoData"}]]},"{55644A5D-B639-0555-287F-86AC4C458A34},16":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231041,"value":"NoData"},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{57D959A7-EBAB-0B48-091B-646F994DD19F},19":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":null,"font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231041,"value":"NoData"},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},15":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"virtual"},"extra":[[{"id":469769720,"value":{"Bytes":"56000000"}}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},19":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Fictitious: café, 東京, مرحبا","runs":[{"start":0,"end":18,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},19"},{"start":18,"end":20,"format":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},20"},{"start":20,"end":22,"format":"{57D959A7-EBAB-0B48-091B-646F994DD19F},19"},{"start":22,"end":27,"format":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},21"}],"paragraph_style":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},22","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},20":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"SimSun","font_size":null,"color":7949855,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"00"}},{"id":134231041,"value":"NoData"},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},21":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":true,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Arial","font_size":null,"color":7949855,"highlight":null,"language":1025,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":null},"extra":[[{"id":134231210,"value":"NoData"},{"id":201334017,"value":{"Bytes":"b2"}},{"id":134231041,"value":"NoData"},{"id":134231045,"value":"NoData"},{"id":134231046,"value":"NoData"}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},22":{"jcid":1179725,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":null,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Style","name":"p"},"extra":[[]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},31":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Fictitious positioned outline.","runs":[{"start":0,"end":30,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16"}],"paragraph_style":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},22","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},37":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[40,25,99,246,88,78,104,75,184,93,54,210,220,114,16,236]},"extension":".png"},"extra":[]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},48":{"jcid":393229,"children":[],"content":["{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},49"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473137903,"modified":1473137903,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708596,"value":"NoData"}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},49":{"jcid":393250,"children":["{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},50"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Table","rows":1,"columns":2,"widths":[144.0,96.0],"locked":[true,true],"borders":true},"extra":[[{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},50":{"jcid":393251,"children":["{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},58","{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},51"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Row"},"extra":[[]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},51":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"04e944eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},57":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Left cell","runs":[{"start":0,"end":9,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16"}],"paragraph_style":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},22","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},58":{"jcid":393252,"children":["{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Cell","shading":null},"extra":[[{"id":469769234,"value":{"Bytes":"040418eb0000003f000000000000403f0000403f"}},{"id":201333779,"value":{"Bytes":"00"}},{"id":2281708689,"value":"NoData"}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},64":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"Right cell","runs":[{"start":0,"end":10,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16"}],"paragraph_style":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},22","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},65":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"f407f0f801346a36346a36346a343634363436343600343634003436003436003400363400363400360034360034340036003436003400000000000000000000000000006b6b35356b37356b373537353735353700353735003735003735003700353700353500370035370035370035003735000000000000000000000000000000006b6b35376b35376b35353735373537350037353700353700353500370035370035370035003735003735003700353500000000000000000000000000000000346a34366a34366a34363434363436340036343600343600343600340034360034360034003634003634003600343400360000000000000000000000000000dc2e346a36346a34366a34363436343634340036343600343600343600340036003400003600340000340000360000340000360000340036000034000036000034366a346a3436346a36343634343634360034363400363400363400340036003400003600340000360000340000360000340000360034000036000034000034696b37356b37356b373535373537353700353735003735003537003500370035000037003500003700003500003700003500003500370000350000370000006b6b35376b35356b37353735373537350037353500373500373500370035003700003500370000350000350000370000350000370035000037000035000000"}},{"id":335557657,"value":{"Bytes":"01000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"5e14feeb9973fc488f8bef1216f8ea08"}},{"id":469775389,"value":{"Bytes":"3030bf06f53cdd01"}},{"id":469775451,"value":{"Bytes":"d91f3b410ad21540"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}}]]},"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},66":{"jcid":131143,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775371,"value":{"Bytes":"ac02e89502346a36346a36346a363434363436343600343634003634003436003400363400363400360034360034340036003436003400000000000000000000000000000000000000000000000000ec326a6a6a9e016a6a366a6a6a346a346a3634366a3436343436343634003634360034360034340036003400360000340036000034000036000034000036000034003400003600003400003600"}},{"id":335557657,"value":{"Bytes":"02000000"}},{"id":268448795,"value":{"Bytes":"0904"}},{"id":201339932,"value":{"Bytes":"00"}},{"id":469775386,"value":{"Bytes":"cf4d0e31c086724ea43c1550db1f178a"}},{"id":469775389,"value":{"Bytes":"b066de08f53cdd01"}},{"id":469775451,"value":{"Bytes":"2cc95f41d91f2340"}},{"id":536884233,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13"]}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10":{"jcid":393228,"children":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":11063.251,"y":192.0,"max_width":72.0,"max_height":63.0},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},11":{"jcid":393229,"children":[],"content":["{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052019,"modified":1473052019,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708596,"value":"NoData"}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},12":{"jcid":393269,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052019,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Attachment","container":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13","preview":"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14","filename":"fictitious-attachment.txt","source_path":"C:\\one-tests\\runs\\20260905-05\\assets\\fictitious-attachment.txt","recording_id":null,"recording_type":null},"extra":[[{"id":335557837,"value":{"Bytes":"abaa2a3f"}},{"id":335557838,"value":{"Bytes":"abaa2a3f"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"66006900630074006900740069006f00750073002d006100740074006100630068006d0065006e0074002e007400780074000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}}]]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},13":{"jcid":524342,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[216,1,128,69,30,15,31,69,129,203,98,24,40,252,11,57]},"extension":".txt"},"extra":[]},"{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},14":{"jcid":524345,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"File","reference":{"Internal":[49,101,250,55,234,213,176,67,129,74,74,108,231,56,36,178]},"extension":".png"},"extra":[]},"{273DB6C4-A230-0679-389F-9DB750E092E4},10":{"jcid":393271,"children":[],"content":["{273DB6C4-A230-0679-389F-9DB750E092E4},12"],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Manifest","history":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},1"},"extra":[[]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},11":{"jcid":131120,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Metadata","title":"Fictitious: café, 東京, مرحبا","level":1},"extra":[[{"id":469769264,"value":{"Bytes":"364029688329ad48b125c64be4a25f7f"}},{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}},{"id":402660453,"value":{"Bytes":"50955b5ef43cdd01"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},12":{"jcid":393227,"children":["{03D49648-056C-0F08-32C9-0424E8496E7D},10","{55644A5D-B639-0555-287F-86AC4C458A34},10","{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10","{ED573AB2-96DB-0F3D-3BA2-4AA694F90D89},10","{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23","{2139BADA-5D84-01BB-2F51-A6AC28C903A9},20"],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Page","alternate_title":"Fictitious: café, 東京, مرحبا","level":null,"width":753.984,"height":783.0,"margin_origin_x":10763.251,"margin_origin_y":14.400001,"rtl":true},"extra":[[{"id":2281708764,"value":"NoData"},{"id":2281708686,"value":"NoData"},{"id":335551564,"value":{"Bytes":"0000803f"}},{"id":335551565,"value":{"Bytes":"0000803f"}},{"id":335551566,"value":{"Bytes":"00000040"}},{"id":335551567,"value":{"Bytes":"00000040"}},{"id":335551646,"value":{"Bytes":"0000003f"}},{"id":335551647,"value":{"Bytes":"0000003f"}},{"id":335551648,"value":{"Bytes":"0000803e"}},{"id":335551649,"value":{"Bytes":"0000803e"}},{"id":469769589,"value":{"Bytes":"73006e006f0077000000"}},{"id":469769720,"value":{"Bytes":"53000000"}},{"id":335551836,"value":{"Bytes":"02000000"}},{"id":469769565,"value":{"Bytes":"0310e65e416b931f400000000000000000"}}]]},"{273DB6C4-A230-0679-389F-9DB750E092E4},13":{"jcid":131140,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RevisionMetadata","modified_filetime":134330587010000000},"extra":[[]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},10":{"jcid":393228,"children":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":10943.251,"y":192.0,"max_width":72.0,"max_height":0.74999994},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},11":{"jcid":393229,"children":[],"content":["{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052018,"modified":1473052018,"original_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","latest_author":"{03D49648-056C-0F08-32C9-0424E8496E7D},13","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708596,"value":"NoData"}]]},"{684D22D2-50A3-0CFB-1E0F-2D58A028C2BA},12":{"jcid":393233,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":1033,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Image","container":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},37","filename":null,"alt":null,"picture_width":0.75,"picture_height":0.75,"background":null,"printout":false,"link":null},"extra":[[{"id":469769723,"value":{"Bytes":"01000000d08c9ddf0115d1118c7a00c04fc297eb010000003086c74d139ec244ae8bc4516d2b8c65000000000200000000001066000000010000200000000dbfd60c8911709580f3ab510eef06f2f74d89501ef114f256cc212c06644316000000000e800000000200002000000084e1a39cf7f21885ffc3a62dc460b23b2930b85ed02a0ccd15729eddfca8b334200000008667910a519cef36b4169e7b24119f204c2c95a0b44f39125479ab8f9e536cac40000000db47d149a4812de527c42cc4cd959203b33e114eeb642066e836fec530ca82b067d852204060c312c1f5bf926251ac7f3755797657f4477bc9a5d5c340949a4e"}},{"id":469769724,"value":{"Bytes":"f402c1d94636be45d97fa7ab7fbf2c127166c53e"}},{"id":335551993,"value":{"Bytes":"00000000"}},{"id":335551550,"value":{"Bytes":"01000000"}},{"id":335551620,"value":{"Bytes":"01000000"}},{"id":268442878,"value":{"Bytes":"0904"}},{"id":469769679,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769250,"value":{"Bytes":"0000000000000000000000000000000000000000000000000000000000000000"}},{"id":469769569,"value":{"Bytes":"1000000001000000000000000000000000000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10":{"jcid":1179649,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Author","name":"snow"},"extra":[[{"id":469769720,"value":{"Bytes":"53000000"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},13":{"jcid":1179720,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":469775370,"value":{"Bytes":"8f6a8a59c052a04b93afaf357411a56100000000800700000200000021e2e241759f3fb5e0049844a7eec30dbb5a90110000000038040000020000008bc5e241"}},{"id":335557644,"value":{"Bytes":"00000c42"}},{"id":335557645,"value":{"Bytes":"00000c42"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},15":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":10799.25,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052300,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16"]}},{"id":335551822,"value":{"Bytes":"02000000"}},{"id":335551558,"value":{"Bytes":"0a00803f"}},{"id":335551559,"value":{"Bytes":"0000803f"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},16":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},65"]}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},20":{"jcid":393228,"children":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},21"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":501.52203,"y":139.75984,"max_width":468.0,"max_height":21.6},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":335551620,"value":{"Bytes":"09000000"}},{"id":335551707,"value":{"Bytes":"456f0341"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},21":{"jcid":393229,"children":[],"content":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},22"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473052301,"modified":1473052301,"original_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","latest_author":"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},10","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},22":{"jcid":393230,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"RichText","text":"","runs":[{"start":0,"end":0,"format":"{55644A5D-B639-0555-287F-86AC4C458A34},16"}],"paragraph_style":"{03D49648-056C-0F08-32C9-0424E8496E7D},17","boilerplate":false},"extra":[[{"id":268442878,"value":{"Bytes":"0904"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},23":{"jcid":393236,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":10799.248,"y":0.0,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473052301,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Ink"},"extra":[[{"id":536884245,"value":{"Objects":["{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24"]}},{"id":335551822,"value":{"Bytes":"02000000"}},{"id":335551558,"value":{"Bytes":"2600803f"}},{"id":335551559,"value":{"Bytes":"0000803f"}}]]},"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},24":{"jcid":131131,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Unknown"},"extra":[[{"id":603993110,"value":{"Objects":["{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},66"]}}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},10":{"jcid":393228,"children":["{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},48"],"content":[],"structure":[],"spaces":[],"child_level":1,"layout":{"x":10567.672,"y":312.0,"max_width":248.13002,"max_height":21.947718},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":1473137903,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Outline","indents":[18.0,0.0,27.0,27.0]},"extra":[[{"id":201333779,"value":{"Bytes":"00"}},{"id":134225085,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},17":{"jcid":393229,"children":[],"content":["{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},57"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473137903,"modified":1473137903,"original_author":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},15","latest_author":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708596,"value":"NoData"}]]},"{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},25":{"jcid":393229,"children":[],"content":["{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},64"],"structure":[],"spaces":[],"child_level":1,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":1473137903,"modified":1473137903,"original_author":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},15","latest_author":"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},15","media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"Paragraph","lists":[],"paragraph_style":null},"extra":[[{"id":2281708596,"value":"NoData"}]]}}},"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{"roots":{"1":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2","2":"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3"},"nodes":{"{7111497F-1B6B-4209-9491-C98B04CF4C5A},2":{"jcid":393276,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistory"},"extra":[[]]},"{7111497F-1B6B-4209-9491-C98B04CF4C5A},3":{"jcid":131142,"children":[],"content":[],"structure":[],"spaces":[],"child_level":null,"layout":{"x":null,"y":null,"max_width":null,"max_height":null},"format":{"bold":null,"italic":null,"underline":null,"strike":null,"superscript":null,"subscript":null,"hidden":null,"hyperlink":null,"hyperlink_label":null,"font":null,"font_size":null,"color":null,"highlight":null,"language":null,"alignment":null,"rtl":null,"space_before":null,"space_after":null,"line_spacing":null},"created":null,"modified":null,"original_author":null,"latest_author":null,"media_ids":[],"media_time_ms":null,"tags":[],"kind":{"type":"VersionHistoryMetadata"},"extra":[[{"id":335551874,"value":{"Bytes":"28000000"}},{"id":335557771,"value":{"Bytes":"28000000"}}]]}}}}}}} \ No newline at end of file diff --git a/corpus/m6/native-page-direction-03/model/text.json b/corpus/m6/native-page-direction-03/model/text.json new file mode 100644 index 0000000000000000000000000000000000000000..6ad30f8dd67e5b35be7b82705e82ae30d8c03024 --- /dev/null +++ b/corpus/m6/native-page-direction-03/model/text.json @@ -0,0 +1 @@ +{"{4851CD72-C7D2-4FAF-BA5C-206EEBED9703},1":{"{9E24424C-0CD9-0E62-29EE-A244369C13D7},1":{}},"{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1":{"{A79B9913-4E0E-02D3-3A7E-62CBA31DDFFF},1":{"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},19":[{"text":"Fictitious: café, ","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null},{"text":"東京","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"SimSun","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null},{"text":", ","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null},{"text":"مرحبا","format":{"bold":true,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Arial","font_size":11.0,"color":7949855,"highlight":4278190080,"language":1025,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},31":[{"text":"Fictitious positioned outline.","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},57":[{"text":"Left cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{B17110AB-D0A4-0897-2D00-5D11FA95F7EB},64":[{"text":"Right cell","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":null},"link":null}],"{2139BADA-5D84-01BB-2F51-A6AC28C903A9},22":[{"text":"","format":{"bold":false,"italic":false,"underline":false,"strike":false,"superscript":false,"subscript":false,"hidden":false,"hyperlink":false,"hyperlink_label":null,"font":"Calibri","font_size":11.0,"color":4278190080,"highlight":4278190080,"language":1033,"alignment":null,"rtl":null,"space_before":0.0,"space_after":0.0,"line_spacing":0.0},"link":null}]},"{56182BB7-150A-08D6-12B2-98C836D1A7C5},1":{}}} \ No newline at end of file diff --git a/corpus/m6/native-page-direction-03/notebook/Open Notebook.one b/corpus/m6/native-page-direction-03/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..f6c61e56f1d1e057db725efb3fc0a4b16c5a27bb Binary files /dev/null and b/corpus/m6/native-page-direction-03/notebook/Open Notebook.one differ diff --git a/corpus/m6/native-page-direction-03/notebook/Open Notebook.onetoc2 b/corpus/m6/native-page-direction-03/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/m6/native-page-direction-03/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-page-direction-03/notebook/synthetic.one b/corpus/m6/native-page-direction-03/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..1268c417d566469978f89885878e9ad6852a118c Binary files /dev/null and b/corpus/m6/native-page-direction-03/notebook/synthetic.one differ diff --git a/corpus/m6/native-page-direction-03/pdf-format-checks.json b/corpus/m6/native-page-direction-03/pdf-format-checks.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-page-direction-03/pdf-format-checks.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-page-direction-03/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/m6/native-page-direction-03/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/m6/native-page-direction-03/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/m6/native-page-direction-03/read/environment.json b/corpus/m6/native-page-direction-03/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..ef16c5d5ccd8af07f35563bb5be2d3f224bd18a7 --- /dev/null +++ b/corpus/m6/native-page-direction-03/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-70E6B408", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-page-direction-03/read/hierarchy.xml b/corpus/m6/native-page-direction-03/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..7aaf6c8038520da560d54554173d4972796f4c9c --- /dev/null +++ b/corpus/m6/native-page-direction-03/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-page-direction-03/read/page-000.pdf b/corpus/m6/native-page-direction-03/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a58108ba2c703e08cf66f279673ea882e6c534b1 Binary files /dev/null and b/corpus/m6/native-page-direction-03/read/page-000.pdf differ diff --git a/corpus/m6/native-page-direction-03/read/page-000.xml b/corpus/m6/native-page-direction-03/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..3a0515cd0e12f81b7efaaa64d32d9cf6b89fb1f1 --- /dev/null +++ b/corpus/m6/native-page-direction-03/read/page-000.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/m6/native-page-direction-03/read/payloads.json b/corpus/m6/native-page-direction-03/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..d5971dca2eb27ef56c94b81ac6ec9956f1b74296 --- /dev/null +++ b/corpus/m6/native-page-direction-03/read/payloads.json @@ -0,0 +1,10 @@ +[ + { + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7", + "name": "fictitious-attachment.txt", + "object": "{032CDCB4-64C6-4BD0-AF8B-369B96786F77}{11}{B0}", + "kind": "InsertedFile", + "page": "{8A63D8F2-BC04-4853-A912-F4C21554E9E2}{1}{B0}", + "bytes": 43 + } +] \ No newline at end of file diff --git a/corpus/m6/native-page-direction-03/run.json b/corpus/m6/native-page-direction-03/run.json new file mode 100644 index 0000000000000000000000000000000000000000..141b7f2d08c9b0ebb78f0b7f175aebb5222d3adb --- /dev/null +++ b/corpus/m6/native-page-direction-03/run.json @@ -0,0 +1,18 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/native-ink/cold-ui-ink/notebook", + "expected_pages": 1, + "author": "tools/native/page-direction.ps1", + "author_timeout_seconds": 600, + "inspect": false, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "fcb431bb45554e664061765116cf182d7ae87c00b0b62de7d89d7ebf933fb815", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/m6/native-page-direction-03/scripts/author.ps1 b/corpus/m6/native-page-direction-03/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..6747f5550f6ba4ce077c225c27cb0e3eb5b58383 --- /dev/null +++ b/corpus/m6/native-page-direction-03/scripts/author.ps1 @@ -0,0 +1,45 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + $deadline = [DateTime]::UtcNow.AddSeconds(60) + do { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$tree = $hierarchy + $pages = @($tree.SelectNodes('//*[local-name()="Page"]')) + if ($pages.Count -gt 0) { break } + Start-Sleep -Milliseconds 100 + } while ([DateTime]::UtcNow -lt $deadline) + if ($pages.Count -ne 1) { throw 'The direction fixture requires one page.' } + $content = '' + $app.GetPageContent($pages[0].GetAttribute('ID'), [ref]$content, 1, 1) + [IO.File]::WriteAllText("$Root\before.xml", $content, [Text.Encoding]::UTF8) + [xml]$page = $content + $settings = $page.SelectSingleNode('//*[local-name()="PageSettings"]') + $settings.SetAttribute('RTL', 'true') + $columns = @($page.SelectNodes('//*[local-name()="Column"]')) + for ($i = 0; $i -lt $columns.Count; $i++) { + $columns[$i].SetAttribute('width', (96 + 48 * $i).ToString()) + $columns[$i].SetAttribute('isLocked', 'true') + } + $app.UpdatePageContent($page.OuterXml, [DateTime]::MinValue, 1, $true) + $app.GetPageContent($pages[0].GetAttribute('ID'), [ref]$content, 1, 1) + [IO.File]::WriteAllText("$Root\after.xml", $content, [Text.Encoding]::UTF8) + [xml]$after = $content + if ($after.SelectSingleNode('//*[local-name()="PageSettings"]').GetAttribute('RTL') -ne 'true') { throw 'Native page direction did not change.' } + $app.SyncHierarchy($notebook) + $app.CloseNotebook($notebook, $false) + $notebook = '' +} finally { + if ($notebook) { $app.CloseNotebook($notebook, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/corpus/m6/native-page-direction-03/scripts/cold.ps1 b/corpus/m6/native-page-direction-03/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-page-direction-03/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-page-direction-03/scripts/read.ps1 b/corpus/m6/native-page-direction-03/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/corpus/m6/native-page-direction-03/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-page-direction-03/source.json b/corpus/m6/native-page-direction-03/source.json new file mode 100644 index 0000000000000000000000000000000000000000..6109769d947f41f931301ec4ed3a1b291ffb8c31 --- /dev/null +++ b/corpus/m6/native-page-direction-03/source.json @@ -0,0 +1,20 @@ +[ + { + "path": "Open Notebook.one", + "bytes": 4016, + "sha256": "e2d9f3e4d3e8a57adaff7ba5af5f1e23bea4b3b590a012acd8d1c4f166556c88", + "mtime_ns": 1788585164197912114 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 4944, + "sha256": "36274ad5cc077c6b1ad51ee4c4b90d3b6798a45ce446cbfd7c9d7ac504776b28", + "mtime_ns": 1788585164198018949 + }, + { + "path": "synthetic.one", + "bytes": 27808, + "sha256": "1326c475cc3a9f412ff4d072cf515c1482b3b9e07798921e582767b064401947", + "mtime_ns": 1788585164197723028 + } +] diff --git a/corpus/m6/native-page-direction-03/teardown.json b/corpus/m6/native-page-direction-03/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-page-direction-03/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-probes-01/ORACLE.md b/corpus/m6/native-probes-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..ca43014d71cada892aff183000e31876ba063630 --- /dev/null +++ b/corpus/m6/native-probes-01/ORACLE.md @@ -0,0 +1,27 @@ +# Partial black highlighting is missing from native XML + +OneNote 14.0.4763.1000 displays black highlighting on the word `middle` in +`Before middle after`. The application stores `Highlight = 0x00000000` on that +text run. `GetPageContent(piAll, xs2010)` omits the highlight from the returned +HTML. Whole-paragraph black highlighting is returned correctly in the same page. + +The authored input is [inputs/format-probes.xml](inputs/format-probes.xml). +The stored file is [notebook/synthetic.one](notebook/synthetic.one); the native +XML and screenshot are [read/page-001.xml](read/page-001.xml) and +[read/page-001.png](read/page-001.png). The screenshot shows the black rectangle +between `Before` and `after`. Text, run boundaries, and other formatting agree. + +This is an XML-oracle limitation. A reader must retain and render the black +highlight. It must not remove the highlight to match the XML. Four partial-black +runs in the copied personal notebook exhibit the same XML omission, including +on a fresh cache. Their visual checks belong to the personal report acceptance. + +Reproduce with the current scripts: + +```sh +python3 tools/native_runner.py corpus/writer/create-notebook-01/notebook NEW_OUTPUT \ + --author tools/native/features.ps1 --expected-pages 2 --screenshots +``` + +This capture's exact author/read/cache scripts are retained in `scripts/` and +hashed in `run.json`. The clone's successful deletion is in `teardown.json`. diff --git a/corpus/m6/native-probes-01/commands.jsonl b/corpus/m6/native-probes-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..0f4616487bc019425e23b9d8459486f94679f5a3 --- /dev/null +++ b/corpus/m6/native-probes-01/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-4528C40D", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-4528C40D -ExpectedPages 2 -UseCurrentCache", "exit": 0, "stdout": "Read 1 sections and 2 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-probes-01/expected.json b/corpus/m6/native-probes-01/expected.json new file mode 100644 index 0000000000000000000000000000000000000000..c54f9498921f2b436e3d303b3a090ca4435f86e8 --- /dev/null +++ b/corpus/m6/native-probes-01/expected.json @@ -0,0 +1,34 @@ +[ + { + "html": "\u003cspan style=\"background:black\"\u003eBlack highlight, automatic text\u003c/span\u003e", + "name": "Black highlight control" + }, + { + "html": "\u003cspan style=\"background:black;color:white\"\u003eWhite text on black highlight\u003c/span\u003e", + "name": "White on black" + }, + { + "html": "\u003cspan style=\"background:black;color:black\"\u003eBlack text on black highlight\u003c/span\u003e", + "name": "Black on black" + }, + { + "html": "\u003cb\u003eBefore \u003cspan style=\"background:black\"\u003emiddle\u003c/span\u003e after\u003c/b\u003e", + "name": "Partial black highlight" + }, + { + "html": "\u003cspan style=\"background:yellow\"\u003eYellow highlight, automatic text\u003c/span\u003e", + "name": "Yellow control" + }, + { + "html": "Plain \u003cb\u003ebold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e \u003cu\u003eunderline\u003c/u\u003e \u003cs\u003estrike\u003c/s\u003e \u003csup\u003esuper\u003c/sup\u003e \u003csub\u003esub\u003c/sub\u003e \u003cspan style=\"font-family:Consolas;font-size:18pt;color:#804020;background:#00ffff\"\u003efont and color\u003c/span\u003e", + "name": "Character styles" + }, + { + "html": "BMP \u003cb\u003e😀é\u003c/b\u003e 東京 \u003ci\u003eمرحبا\u003c/i\u003e", + "name": "Unicode runs" + }, + { + "html": "Before \u003ca href=\"https://example.invalid/fixture?x=1\u0026amp;y=2\"\u003e\u003cb\u003eLink label\u003c/b\u003e\u003c/a\u003e after", + "name": "Link runs" + } +] diff --git a/corpus/m6/native-probes-01/health.json b/corpus/m6/native-probes-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..8825851751b201af95e146c1cb3ffa649dbeeadf --- /dev/null +++ b/corpus/m6/native-probes-01/health.json @@ -0,0 +1,8 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-4528C40D", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe" +} diff --git a/corpus/m6/native-probes-01/inputs/format-probes.xml b/corpus/m6/native-probes-01/inputs/format-probes.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6c4e9f0196b640897efd99019f5cd3711ba2925 --- /dev/null +++ b/corpus/m6/native-probes-01/inputs/format-probes.xml @@ -0,0 +1 @@ +Black highlight, automatic text]]>White text on black highlight]]>Black text on black highlight]]>Before middle after
]]>Yellow highlight, automatic text]]>bold
italic underline strike super sub font and color]]>😀é 東京 مرحبا]]>Link label after]]> \ No newline at end of file diff --git a/corpus/m6/native-probes-01/machine.json b/corpus/m6/native-probes-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..24fd475dd30e721cbe8279499dfb202ffa8ea7dc --- /dev/null +++ b/corpus/m6/native-probes-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-4528c40d", "hostname": "ONE-M6-4528C40D"} diff --git a/corpus/m6/native-probes-01/notebook/Open Notebook.onetoc2 b/corpus/m6/native-probes-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..1a3b5b21ddb9c7d536dc19c789971d42e7dd13b7 Binary files /dev/null and b/corpus/m6/native-probes-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-probes-01/notebook/synthetic.one b/corpus/m6/native-probes-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..ed010905ae1554d87cd44a78ca0fad840e9c5303 Binary files /dev/null and b/corpus/m6/native-probes-01/notebook/synthetic.one differ diff --git a/corpus/m6/native-probes-01/read/environment.json b/corpus/m6/native-probes-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..522d40995c2ad9ebe5a89f98bbbdccc94b0663f5 --- /dev/null +++ b/corpus/m6/native-probes-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-4528C40D", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-probes-01/read/hierarchy.xml b/corpus/m6/native-probes-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..0bd5dfa87ae76656cbd6f1c20a6a3e7203387b57 --- /dev/null +++ b/corpus/m6/native-probes-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-probes-01/read/page-000.png b/corpus/m6/native-probes-01/read/page-000.png new file mode 100644 index 0000000000000000000000000000000000000000..3fcab1957147eae20207c3424447de7265ee99b9 Binary files /dev/null and b/corpus/m6/native-probes-01/read/page-000.png differ diff --git a/corpus/m6/native-probes-01/read/page-000.xml b/corpus/m6/native-probes-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..f6775d99803db82d70b75b3c8680c8b819130942 --- /dev/null +++ b/corpus/m6/native-probes-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-probes-01/read/page-001.png b/corpus/m6/native-probes-01/read/page-001.png new file mode 100644 index 0000000000000000000000000000000000000000..b1b0206d755c3a44103e1b9fbcffd847f704add7 Binary files /dev/null and b/corpus/m6/native-probes-01/read/page-001.png differ diff --git a/corpus/m6/native-probes-01/read/page-001.xml b/corpus/m6/native-probes-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..90281ef7663f3c474d7b1ee2580610b2fa4f28a6 --- /dev/null +++ b/corpus/m6/native-probes-01/read/page-001.xml @@ -0,0 +1,27 @@ + +Black highlight, automatic text]]>White text on black highlight]]>Black text on black highlight]]>Before middle after]]>Yellow highlight, automatic text]]>Plain bold italic underline strike super sub font and color]]>BMP 😀é 東京 مرحبا]]>Link label after]]> diff --git a/corpus/m6/native-probes-01/run.json b/corpus/m6/native-probes-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..e5e82bc1f4a41ff12f3e2b7183cefe88985cbb57 --- /dev/null +++ b/corpus/m6/native-probes-01/run.json @@ -0,0 +1,16 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/writer/create-notebook-01/notebook", + "expected_pages": 2, + "author": "tools/native/features.ps1", + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "24595a13dd04c47aba39b13cf1d05fbc162cd915eac2a1363f51665ef3d8721d", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "cad23c59e6a6d89d6c2700f50e23a5ae2c0df8df7d9390e02bfba9315bf54b57" + } +} diff --git a/corpus/m6/native-probes-01/scripts/author.ps1 b/corpus/m6/native-probes-01/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..553a2584a12ab2c8eee110835ceae685f32effba --- /dev/null +++ b/corpus/m6/native-probes-01/scripts/author.ps1 @@ -0,0 +1,42 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$namespace = 'http://schemas.microsoft.com/office/onenote/2010/onenote' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sectionId = '' + $app.OpenHierarchy('synthetic.one', $notebookId, [ref]$sectionId, 0) + $cases = @( + @{ name = 'Black highlight control'; html = 'Black highlight, automatic text' }, + @{ name = 'White on black'; html = 'White text on black highlight' }, + @{ name = 'Black on black'; html = 'Black text on black highlight' }, + @{ name = 'Partial black highlight'; html = 'Before middle after' }, + @{ name = 'Yellow control'; html = 'Yellow highlight, automatic text' }, + @{ name = 'Character styles'; html = 'Plain bold italic underline strike super sub font and color' }, + @{ name = 'Unicode runs'; html = 'BMP ' + [char]::ConvertFromUtf32(0x1F600) + 'e' + [char]0x0301 + ' ' + [char]0x6771 + [char]0x4EAC + ' ' + [char]0x0645 + [char]0x0631 + [char]0x062D + [char]0x0628 + [char]0x0627 + '' }, + @{ name = 'Link runs'; html = 'Before Link label after' } + ) + $pageId = '' + $app.CreateNewPage($sectionId, [ref]$pageId, 0) + $body = '' + foreach ($case in $cases) { $body += '' } + $body += '' + $xml = '' + $body + '' + [IO.File]::WriteAllText((Join-Path $inputs 'format-probes.xml'), $xml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $true) + $cases | ConvertTo-Json -Depth 8 | Set-Content (Join-Path $Root 'expected.json') -Encoding UTF8 + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/corpus/m6/native-probes-01/scripts/cold.ps1 b/corpus/m6/native-probes-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-probes-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-probes-01/scripts/read.ps1 b/corpus/m6/native-probes-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..5159015fcb15e52b000dfe928f19a7a59bc59b21 --- /dev/null +++ b/corpus/m6/native-probes-01/scripts/read.ps1 @@ -0,0 +1,105 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(45) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 3, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + } + $index++ + } + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} finally { + try { + if ($notebookId -and -not $UseCurrentCache) { $app.CloseNotebook($notebookId, $false) } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-probes-01/source.json b/corpus/m6/native-probes-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..d2d5ea6713b67d9a5b303a6ca34ff393a4aee722 --- /dev/null +++ b/corpus/m6/native-probes-01/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86", + "mtime_ns": 1788592288950419463 + }, + { + "path": "synthetic.one", + "bytes": 3348, + "sha256": "b0662387c3fdc256d8dbe809e3b8f73b3586559696467fb1fff8f589095fa797", + "mtime_ns": 1788592288941514581 + } +] diff --git a/corpus/m6/native-probes-01/teardown.json b/corpus/m6/native-probes-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-probes-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-structure-01/ORACLE.md b/corpus/m6/native-structure-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..0183934db730e381456cb367deb81b8c73306316 --- /dev/null +++ b/corpus/m6/native-structure-01/ORACLE.md @@ -0,0 +1,33 @@ +# Native document structure controls + +OneNote 14.0.4763.1000 authored the second page from the frozen +[scripts/author.ps1](scripts/author.ps1). The fixture includes named paragraph +styles, alignment and spacing, two associated tags, nested bullets, Roman +numbering restarted at III, and a 3-by-2 table with one locked column. + +The locked column remains 120 points wide. The unlocked column contracts from +the authored 180 points to approximately 37.116 points to fit its contents. +The native PDF shows both the text formatting and table on separate sheets. +[Tests](../../../tests/document.rs) assert the model's corresponding semantics. +The [partial black highlight XML omission](../native-probes-01/ORACLE.md) also +occurs here; the PDF preserves the highlight. + +The [table controls](../native-table-controls-01/expected.json) isolate a native +XML limitation: adding `shadingColor` to a cell causes `UpdatePageContent` to +return `0x80042001`. Removing that attribute succeeds with locked or unlocked +columns. This does not establish whether OneNote 2010 renders the storage-level +CellShadingColor property. + +## TOC transaction fragment boundary + +The Rust-created TOC began with a 44-byte transaction-log fragment containing +three list-count entries, a sentinel, and a 12-byte next-fragment reference. +OneNote appended another fragment. Its next CRC is `0x68f09d29`; including the +preceding fragment's final sentinel incorrectly produces `0x548e8f73`. + +MS-ONESTORE 2.3.3.2 product behavior note 8 specifies exclusion of bytes flushed +at the end of a TOC transaction-log fragment. This fixture establishes that the +final entry is excluded from the running CRC, while its own checksum is still +validated. The storage regression also corrupts the native checksum and verifies +that the damage is detected. Writer regressions cross fragment and transaction +counter boundaries through 260 successive edits. diff --git a/corpus/m6/native-structure-01/agent.py b/corpus/m6/native-structure-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-structure-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-structure-01/commands.jsonl b/corpus/m6/native-structure-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..1c518a203496284c831be3ceba1399386cb9988b --- /dev/null +++ b/corpus/m6/native-structure-01/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-28BC2DAE", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-28BC2DAE -ExpectedPages 2 -UseCurrentCache -Pdf -KeepOpen", "exit": 0, "stdout": "Read 1 sections and 2 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-structure-01/expected.json b/corpus/m6/native-structure-01/expected.json new file mode 100644 index 0000000000000000000000000000000000000000..c54f9498921f2b436e3d303b3a090ca4435f86e8 --- /dev/null +++ b/corpus/m6/native-structure-01/expected.json @@ -0,0 +1,34 @@ +[ + { + "html": "\u003cspan style=\"background:black\"\u003eBlack highlight, automatic text\u003c/span\u003e", + "name": "Black highlight control" + }, + { + "html": "\u003cspan style=\"background:black;color:white\"\u003eWhite text on black highlight\u003c/span\u003e", + "name": "White on black" + }, + { + "html": "\u003cspan style=\"background:black;color:black\"\u003eBlack text on black highlight\u003c/span\u003e", + "name": "Black on black" + }, + { + "html": "\u003cb\u003eBefore \u003cspan style=\"background:black\"\u003emiddle\u003c/span\u003e after\u003c/b\u003e", + "name": "Partial black highlight" + }, + { + "html": "\u003cspan style=\"background:yellow\"\u003eYellow highlight, automatic text\u003c/span\u003e", + "name": "Yellow control" + }, + { + "html": "Plain \u003cb\u003ebold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e \u003cu\u003eunderline\u003c/u\u003e \u003cs\u003estrike\u003c/s\u003e \u003csup\u003esuper\u003c/sup\u003e \u003csub\u003esub\u003c/sub\u003e \u003cspan style=\"font-family:Consolas;font-size:18pt;color:#804020;background:#00ffff\"\u003efont and color\u003c/span\u003e", + "name": "Character styles" + }, + { + "html": "BMP \u003cb\u003e😀é\u003c/b\u003e 東京 \u003ci\u003eمرحبا\u003c/i\u003e", + "name": "Unicode runs" + }, + { + "html": "Before \u003ca href=\"https://example.invalid/fixture?x=1\u0026amp;y=2\"\u003e\u003cb\u003eLink label\u003c/b\u003e\u003c/a\u003e after", + "name": "Link runs" + } +] diff --git a/corpus/m6/native-structure-01/format-differences.json b/corpus/m6/native-structure-01/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..003623534f52ccfecd96f3dde42e672f720b42e5 --- /dev/null +++ b/corpus/m6/native-structure-01/format-differences.json @@ -0,0 +1,11 @@ +[ + { + "file": "synthetic.one", + "page": 1, + "paragraph": 4, + "field": "highlight", + "stored": "#000000", + "native": "automatic", + "characters": 6 + } +] \ No newline at end of file diff --git a/corpus/m6/native-structure-01/geometry-differences.json b/corpus/m6/native-structure-01/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-structure-01/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-structure-01/health.json b/corpus/m6/native-structure-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..402388abb65a705e8f5e03cadb5a41db61ac639e --- /dev/null +++ b/corpus/m6/native-structure-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-28BC2DAE", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-structure-01/inputs/format-probes.xml b/corpus/m6/native-structure-01/inputs/format-probes.xml new file mode 100644 index 0000000000000000000000000000000000000000..d101d80d2bb5f0554e5a9152029420134bafef4b --- /dev/null +++ b/corpus/m6/native-structure-01/inputs/format-probes.xml @@ -0,0 +1 @@ +Black highlight, automatic text]]>White text on black highlight]]>Black text on black highlight]]>Before middle after]]>Yellow highlight, automatic text]]>bold italic underline strike super sub font and color]]>😀é 東京 مرحبا]]>Link label after]]> \ No newline at end of file diff --git a/corpus/m6/native-structure-01/machine.json b/corpus/m6/native-structure-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..1940adddc6929ef6172cf509c2deca8e6aaa2f9e --- /dev/null +++ b/corpus/m6/native-structure-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-28bc2dae", "hostname": "ONE-M6-28BC2DAE"} diff --git a/corpus/m6/native-structure-01/notebook/Open Notebook.onetoc2 b/corpus/m6/native-structure-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..2621561a6b4ea3e884def0a24a12a0307334f4e7 Binary files /dev/null and b/corpus/m6/native-structure-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-structure-01/notebook/synthetic.one b/corpus/m6/native-structure-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..33f620e50d39a37607494f1e073df1d6d2ecb54a Binary files /dev/null and b/corpus/m6/native-structure-01/notebook/synthetic.one differ diff --git a/corpus/m6/native-structure-01/read/environment.json b/corpus/m6/native-structure-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..756560ba069ed6a50184a9dc67387fa120e08413 --- /dev/null +++ b/corpus/m6/native-structure-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-28BC2DAE", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-structure-01/read/hierarchy.xml b/corpus/m6/native-structure-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..1b454522377e5324e213f85135e26842fc1d8da4 --- /dev/null +++ b/corpus/m6/native-structure-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-structure-01/read/page-000.navigation.json b/corpus/m6/native-structure-01/read/page-000.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..002a1c45a5ba0121a28f35c11466c61b8a2aac13 --- /dev/null +++ b/corpus/m6/native-structure-01/read/page-000.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "A notebook created in Rust. - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/m6/native-structure-01/read/page-000.pdf b/corpus/m6/native-structure-01/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..514cfa923a4b8ef153bfb0c189ea21a11dcc4ee5 Binary files /dev/null and b/corpus/m6/native-structure-01/read/page-000.pdf differ diff --git a/corpus/m6/native-structure-01/read/page-000.png b/corpus/m6/native-structure-01/read/page-000.png new file mode 100644 index 0000000000000000000000000000000000000000..7d55de94fa987371c66de8e6c2a7703af871c321 Binary files /dev/null and b/corpus/m6/native-structure-01/read/page-000.png differ diff --git a/corpus/m6/native-structure-01/read/page-000.xml b/corpus/m6/native-structure-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..6f1ff6e0eb808dcd906ae74acde36744f7f9e024 --- /dev/null +++ b/corpus/m6/native-structure-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-structure-01/read/page-001.navigation.json b/corpus/m6/native-structure-01/read/page-001.navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..6f3d6cd35cebebdb19565c66e8b41d67a0618d4c --- /dev/null +++ b/corpus/m6/native-structure-01/read/page-001.navigation.json @@ -0,0 +1,13 @@ +{ + "exit": 0, + "stdout": "", + "stderr": "", + "w": 800, + "h": 600, + "error": null, + "win": { + "title": "Native feature probes - Microsoft OneNote", + "class": "Framework::CFrame", + "dialog": false + } +} \ No newline at end of file diff --git a/corpus/m6/native-structure-01/read/page-001.pdf b/corpus/m6/native-structure-01/read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ce77ec439dec104e0ae0be7fad43d6def03ac924 Binary files /dev/null and b/corpus/m6/native-structure-01/read/page-001.pdf differ diff --git a/corpus/m6/native-structure-01/read/page-001.png b/corpus/m6/native-structure-01/read/page-001.png new file mode 100644 index 0000000000000000000000000000000000000000..333aa407ddc35e1da5ab41f4cd515dcf00e694dd Binary files /dev/null and b/corpus/m6/native-structure-01/read/page-001.png differ diff --git a/corpus/m6/native-structure-01/read/page-001.xml b/corpus/m6/native-structure-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..2d4158118a5de54555588648358a8bd124446e40 --- /dev/null +++ b/corpus/m6/native-structure-01/read/page-001.xml @@ -0,0 +1,28 @@ + +Black highlight, automatic text]]>White text on black highlight]]>Black text on black highlight]]>Before middle after]]>Yellow highlight, automatic text]]>Plain bold italic underline strike super sub font and color]]>BMP 😀é 東京 مرحبا]]>Link label after]]>Named paragraph style]]> diff --git a/corpus/m6/native-structure-01/read/payloads.json b/corpus/m6/native-structure-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/m6/native-structure-01/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/m6/native-structure-01/run.json b/corpus/m6/native-structure-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..1a2b31bf09bd2b270fd46f7c4f205fffb1b3dd47 --- /dev/null +++ b/corpus/m6/native-structure-01/run.json @@ -0,0 +1,16 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/writer/create-notebook-01/notebook", + "expected_pages": 2, + "author": "tools/native/features.ps1", + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "08eb8c83bd250d5a440e3957166c3cf32d623dbce23e1670f2cace29d45d2511", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "bec4953cc49b9ccb57041be00d7d7ce8bb88f2c0446c664b0a631e91f0007b45" + } +} diff --git a/corpus/m6/native-structure-01/scripts/author.ps1 b/corpus/m6/native-structure-01/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..e80700176b8dc71e8dd0fef31e29e2e1fa37c2be --- /dev/null +++ b/corpus/m6/native-structure-01/scripts/author.ps1 @@ -0,0 +1,58 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$namespace = 'http://schemas.microsoft.com/office/onenote/2010/onenote' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sectionId = '' + $app.OpenHierarchy('synthetic.one', $notebookId, [ref]$sectionId, 0) + $cases = @( + @{ name = 'Black highlight control'; html = 'Black highlight, automatic text' }, + @{ name = 'White on black'; html = 'White text on black highlight' }, + @{ name = 'Black on black'; html = 'Black text on black highlight' }, + @{ name = 'Partial black highlight'; html = 'Before middle after' }, + @{ name = 'Yellow control'; html = 'Yellow highlight, automatic text' }, + @{ name = 'Character styles'; html = 'Plain bold italic underline strike super sub font and color' }, + @{ name = 'Unicode runs'; html = 'BMP ' + [char]::ConvertFromUtf32(0x1F600) + 'e' + [char]0x0301 + ' ' + [char]0x6771 + [char]0x4EAC + ' ' + [char]0x0645 + [char]0x0631 + [char]0x062D + [char]0x0628 + [char]0x0627 + '' }, + @{ name = 'Link runs'; html = 'Before Link label after' } + ) + $pageId = '' + $app.CreateNewPage($sectionId, [ref]$pageId, 0) + $body = '' + foreach ($case in $cases) { $body += '' } + $body += '' + $body = '' + $body + $body += '' + $body += '' + $body += '' + $body += '' + $body += '' + $body += '' + foreach ($row in 0..2) { + $body += '' + foreach ($column in 0..1) { + $body += '' + } + $body += '' + } + $body += '' + + $xml = '' + $body + '' + [IO.File]::WriteAllText((Join-Path $inputs 'format-probes.xml'), $xml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $true) + $cases | ConvertTo-Json -Depth 8 | Set-Content (Join-Path $Root 'expected.json') -Encoding UTF8 + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/corpus/m6/native-structure-01/scripts/cold.ps1 b/corpus/m6/native-structure-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-structure-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-structure-01/scripts/read.ps1 b/corpus/m6/native-structure-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..2c36d388f08430730e32fb5f44655a10caecde80 --- /dev/null +++ b/corpus/m6/native-structure-01/scripts/read.ps1 @@ -0,0 +1,131 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(45) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 3, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-structure-01/source.json b/corpus/m6/native-structure-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..d2d5ea6713b67d9a5b303a6ca34ff393a4aee722 --- /dev/null +++ b/corpus/m6/native-structure-01/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86", + "mtime_ns": 1788592288950419463 + }, + { + "path": "synthetic.one", + "bytes": 3348, + "sha256": "b0662387c3fdc256d8dbe809e3b8f73b3586559696467fb1fff8f589095fa797", + "mtime_ns": 1788592288941514581 + } +] diff --git a/corpus/m6/native-structure-01/teardown.json b/corpus/m6/native-structure-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-structure-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-table-controls-01/agent.py b/corpus/m6/native-table-controls-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-table-controls-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-table-controls-01/commands.jsonl b/corpus/m6/native-table-controls-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..6f3e810207f79ad05640143d8b28e112ba390d3e --- /dev/null +++ b/corpus/m6/native-table-controls-01/commands.jsonl @@ -0,0 +1,4 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-4BDDDDFD", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-4BDDDDFD -ExpectedPages -1 -UseCurrentCache", "exit": 0, "stdout": "Read 1 sections and 6 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-table-controls-01/expected.json b/corpus/m6/native-table-controls-01/expected.json new file mode 100644 index 0000000000000000000000000000000000000000..451938c756d8588eb6d0275f42ad69c9062042b5 --- /dev/null +++ b/corpus/m6/native-table-controls-01/expected.json @@ -0,0 +1,18 @@ +[ + { + "probe": 0, + "result": "Exception calling \"UpdatePageContent\" with \"4\" argument(s): \"Exception from HRESULT: 0x80042001\"" + }, + { + "probe": 1, + "result": "accepted" + }, + { + "probe": 2, + "result": "accepted" + }, + { + "probe": 3, + "result": "Exception calling \"UpdatePageContent\" with \"4\" argument(s): \"Exception from HRESULT: 0x80042001\"" + } +] diff --git a/corpus/m6/native-table-controls-01/health.json b/corpus/m6/native-table-controls-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..775e790037b477cf7262cdcddc51ecbcc80372ec --- /dev/null +++ b/corpus/m6/native-table-controls-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-4BDDDDFD", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-table-controls-01/inputs/format-probes.xml b/corpus/m6/native-table-controls-01/inputs/format-probes.xml new file mode 100644 index 0000000000000000000000000000000000000000..b2d3974b25264ecd306376345c53b5dc32f543cc --- /dev/null +++ b/corpus/m6/native-table-controls-01/inputs/format-probes.xml @@ -0,0 +1 @@ +Black highlight, automatic text]]>White text on black highlight]]>Black text on black highlight]]>Before middle after]]>Yellow highlight, automatic text]]>bold italic underline strike super sub font and color]]>😀é 東京 مرحبا]]>Link label after]]> \ No newline at end of file diff --git a/corpus/m6/native-table-controls-01/inputs/probe-0.xml b/corpus/m6/native-table-controls-01/inputs/probe-0.xml new file mode 100644 index 0000000000000000000000000000000000000000..83a357574147ca1bc234f2b18ebfd28e2f294705 --- /dev/null +++ b/corpus/m6/native-table-controls-01/inputs/probe-0.xml @@ -0,0 +1 @@ + Probe 0 \ No newline at end of file diff --git a/corpus/m6/native-table-controls-01/inputs/probe-1.xml b/corpus/m6/native-table-controls-01/inputs/probe-1.xml new file mode 100644 index 0000000000000000000000000000000000000000..0e0ab19854e4a5bed83ae05f2b8018027a8b5f07 --- /dev/null +++ b/corpus/m6/native-table-controls-01/inputs/probe-1.xml @@ -0,0 +1 @@ + Probe 1 \ No newline at end of file diff --git a/corpus/m6/native-table-controls-01/inputs/probe-2.xml b/corpus/m6/native-table-controls-01/inputs/probe-2.xml new file mode 100644 index 0000000000000000000000000000000000000000..065c0ed19479fb08fe2625eb641c12a05841ee82 --- /dev/null +++ b/corpus/m6/native-table-controls-01/inputs/probe-2.xml @@ -0,0 +1 @@ + Probe 2 \ No newline at end of file diff --git a/corpus/m6/native-table-controls-01/inputs/probe-3.xml b/corpus/m6/native-table-controls-01/inputs/probe-3.xml new file mode 100644 index 0000000000000000000000000000000000000000..32c69089c7c1576c433f7934a1444f8a805ae7c0 --- /dev/null +++ b/corpus/m6/native-table-controls-01/inputs/probe-3.xml @@ -0,0 +1 @@ + Probe 3 \ No newline at end of file diff --git a/corpus/m6/native-table-controls-01/machine.json b/corpus/m6/native-table-controls-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..5cf4c3fcbe56f4610441918620222df25d569bad --- /dev/null +++ b/corpus/m6/native-table-controls-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-4bddddfd", "hostname": "ONE-M6-4BDDDDFD"} diff --git a/corpus/m6/native-table-controls-01/notebook/Open Notebook.onetoc2 b/corpus/m6/native-table-controls-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..a33d3bfd210f844e3db618e648ac898adeee09c6 Binary files /dev/null and b/corpus/m6/native-table-controls-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-table-controls-01/notebook/synthetic.one b/corpus/m6/native-table-controls-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..27c1686927373dda8ff2f0387334e37a2085bcf4 Binary files /dev/null and b/corpus/m6/native-table-controls-01/notebook/synthetic.one differ diff --git a/corpus/m6/native-table-controls-01/read/environment.json b/corpus/m6/native-table-controls-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..13fe6d2f33d7e7287602a3b173eed50e827f8492 --- /dev/null +++ b/corpus/m6/native-table-controls-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-4BDDDDFD", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-table-controls-01/read/hierarchy.xml b/corpus/m6/native-table-controls-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..e3b86f3b8c3e21c3601445201562d8d505e4432f --- /dev/null +++ b/corpus/m6/native-table-controls-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-table-controls-01/read/page-000.xml b/corpus/m6/native-table-controls-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..285d0428b9942eca0d6641347e37b8605c1d0262 --- /dev/null +++ b/corpus/m6/native-table-controls-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-table-controls-01/read/page-001.xml b/corpus/m6/native-table-controls-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..32bcc3379307f81ef50277069b2c8d734ddb9f90 --- /dev/null +++ b/corpus/m6/native-table-controls-01/read/page-001.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-table-controls-01/read/page-002.xml b/corpus/m6/native-table-controls-01/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..3d7cbf2fe213c2b76417923003fe08496895c01b --- /dev/null +++ b/corpus/m6/native-table-controls-01/read/page-002.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-table-controls-01/read/page-003.xml b/corpus/m6/native-table-controls-01/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..d1eddee459dfda4a0e5c7b393b35315c71e883a1 --- /dev/null +++ b/corpus/m6/native-table-controls-01/read/page-003.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-table-controls-01/read/page-004.xml b/corpus/m6/native-table-controls-01/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..b337e7f97a0357b902c8ce6328db9ade9420278d --- /dev/null +++ b/corpus/m6/native-table-controls-01/read/page-004.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-table-controls-01/read/page-005.xml b/corpus/m6/native-table-controls-01/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..cdb2048296a4c15d9f4681970b31a5bace388bb7 --- /dev/null +++ b/corpus/m6/native-table-controls-01/read/page-005.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-table-controls-01/read/payloads.json b/corpus/m6/native-table-controls-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/m6/native-table-controls-01/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/m6/native-table-controls-01/run.json b/corpus/m6/native-table-controls-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..4c1b295801c03ab3db247d6a3d51846dac295f28 --- /dev/null +++ b/corpus/m6/native-table-controls-01/run.json @@ -0,0 +1,16 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/m6/ansi/notebook", + "expected_pages": -1, + "author": "evidence/m6/table-probe.ps1", + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "author.ps1": "aad63ba4d55396152d8254de38f1d28d6cedaab39d1eaa5e8eb09dc052919790", + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "bec4953cc49b9ccb57041be00d7d7ce8bb88f2c0446c664b0a631e91f0007b45" + } +} diff --git a/corpus/m6/native-table-controls-01/scripts/author.ps1 b/corpus/m6/native-table-controls-01/scripts/author.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..bbfd3b9b2960aee835f47b3aa2c40410a5fc5132 --- /dev/null +++ b/corpus/m6/native-table-controls-01/scripts/author.ps1 @@ -0,0 +1,74 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$namespace = 'http://schemas.microsoft.com/office/onenote/2010/onenote' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sectionId = '' + $app.OpenHierarchy('synthetic.one', $notebookId, [ref]$sectionId, 0) + $cases = @( + @{ name = 'Black highlight control'; html = 'Black highlight, automatic text' }, + @{ name = 'White on black'; html = 'White text on black highlight' }, + @{ name = 'Black on black'; html = 'Black text on black highlight' }, + @{ name = 'Partial black highlight'; html = 'Before middle after' }, + @{ name = 'Yellow control'; html = 'Yellow highlight, automatic text' }, + @{ name = 'Character styles'; html = 'Plain bold italic underline strike super sub font and color' }, + @{ name = 'Unicode runs'; html = 'BMP ' + [char]::ConvertFromUtf32(0x1F600) + 'e' + [char]0x0301 + ' ' + [char]0x6771 + [char]0x4EAC + ' ' + [char]0x0645 + [char]0x0631 + [char]0x062D + [char]0x0628 + [char]0x0627 + '' }, + @{ name = 'Link runs'; html = 'Before Link label after' } + ) + $pageId = '' + $app.CreateNewPage($sectionId, [ref]$pageId, 0) + $body = '' + foreach ($case in $cases) { $body += '' } + $body += '' + $body = '' + $body + $body += '' + $body += '' + $body += '' + $body += '' + $body += '' + $body += '' + foreach ($row in 0..2) { + $body += '' + foreach ($column in 0..1) { + $body += '' + } + $body += '' + } + $body += '' + + $xml = '' + $body + '' + [IO.File]::WriteAllText((Join-Path $inputs 'format-probes.xml'), $xml, [Text.Encoding]::UTF8) + [xml]$doc = $xml + $results = @() + $n = 0 + $table = $doc.Page.Outline[1].OEChildren.OE[-1].OuterXml + $variants = @($table, $table.Replace(' shadingColor="#ffff00"', ''), $table.Replace(' isLocked="true"', '').Replace(' shadingColor="#ffff00"', ''), $table.Replace(' isLocked="true"', '')) + $parts = @($variants | ForEach-Object { '' + $_ + '' }) + foreach ($part in $parts) { + $testId = '' + $app.CreateNewPage($sectionId, [ref]$testId, 0) + $testXml = '' + ($doc.Page.TagDef | ForEach-Object { $_.OuterXml }) + $doc.Page.QuickStyleDef.OuterXml + 'Probe ' + $n + '' + $part + '' + [IO.File]::WriteAllText((Join-Path $inputs ('probe-' + $n + '.xml')), $testXml, [Text.Encoding]::UTF8) + try { + $app.UpdatePageContent($testXml, [DateTime]::MinValue, 1, $true) + $results += @{ probe = $n; result = 'accepted' } + } catch { $results += @{ probe = $n; result = $_.Exception.Message } } + $n++ + } + $results | ConvertTo-Json -Depth 8 | Set-Content (Join-Path $Root 'expected.json') -Encoding UTF8 + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/corpus/m6/native-table-controls-01/scripts/cold.ps1 b/corpus/m6/native-table-controls-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-table-controls-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-table-controls-01/scripts/read.ps1 b/corpus/m6/native-table-controls-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..2c36d388f08430730e32fb5f44655a10caecde80 --- /dev/null +++ b/corpus/m6/native-table-controls-01/scripts/read.ps1 @@ -0,0 +1,131 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(45) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 3, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-table-controls-01/source.json b/corpus/m6/native-table-controls-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..6cb370c3148e4d57ec4313c2508b6feb8e51ba6b --- /dev/null +++ b/corpus/m6/native-table-controls-01/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa", + "mtime_ns": 1788585005062916740 + }, + { + "path": "synthetic.one", + "bytes": 12456, + "sha256": "aa6f1188773f1cc41cc5c619f213ce04b30592320c6b2e32b2b4c91639423ab4", + "mtime_ns": 1788649421839788185 + } +] diff --git a/corpus/m6/native-table-controls-01/teardown.json b/corpus/m6/native-table-controls-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-table-controls-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-template-controls-01/ORACLE.md b/corpus/m6/native-template-controls-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..1398b8768f069f10b066deef297000096e66ef90 --- /dev/null +++ b/corpus/m6/native-template-controls-01/ORACLE.md @@ -0,0 +1,7 @@ +# Native default page template and unaligned image container + +The captured UI operations selected Hearts from the native Templates pane, selected Hearts - Decorative as the section default, and created a new page. The default background appeared automatically; `default-template.png` and `ui-operations.json` record that result. `read/` contains the three native page exports and PDFs. The clone was deleted. + +The section property 0x2c001d62 refers to a separate page object space whose role-2 metadata has JCID 0x2003e. Property 0x1c001ca5 contains the UTF-16 template name Hearts. These native template fields are not in the published MS-ONE object list; the typed model identifies them as observed native metadata. The original personal notebook uses the same relationship with the name Ivy. + +The embedded image object starts at byte 11396, four bytes past an eight-byte file boundary. Its payload is 10056 bytes; the footer begins at 21492 after four padding bytes. Native XML exports the same image bytes (SHA-256 2035407a0540e1c4f7934db08ba4add750fcb9a62863ddd9553e7871c81a99e3). MS-ONESTORE 2.6.13 pads the object length, independent of its file position. This fixture exposed the reader's incorrect absolute-offset alignment. The regression relocates the object through all eight offsets and separately corrupts its footer. diff --git a/corpus/m6/native-template-controls-01/agent.py b/corpus/m6/native-template-controls-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/native-template-controls-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/native-template-controls-01/before-read/environment.json b/corpus/m6/native-template-controls-01/before-read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..a09ccc95f291067dc58b97efd2c96cf5ed346543 --- /dev/null +++ b/corpus/m6/native-template-controls-01/before-read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-A33C1CD2", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-template-controls-01/before-read/hierarchy.xml b/corpus/m6/native-template-controls-01/before-read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..e6ab59691f367b5c395ed96406671975ea9f0b20 --- /dev/null +++ b/corpus/m6/native-template-controls-01/before-read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-template-controls-01/before-read/page-000.pdf b/corpus/m6/native-template-controls-01/before-read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..208aecfbbf8029b69e7c0db60eb69d86b15eb453 Binary files /dev/null and b/corpus/m6/native-template-controls-01/before-read/page-000.pdf differ diff --git a/corpus/m6/native-template-controls-01/before-read/page-000.xml b/corpus/m6/native-template-controls-01/before-read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..6ec25a9c085ca9154d7b8f950045693e4091e03d --- /dev/null +++ b/corpus/m6/native-template-controls-01/before-read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-template-controls-01/before-read/payloads.json b/corpus/m6/native-template-controls-01/before-read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/m6/native-template-controls-01/before-read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/m6/native-template-controls-01/commands.jsonl b/corpus/m6/native-template-controls-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..ea014ef4ea13a95731746ff6408594cb4b2b2f8e --- /dev/null +++ b/corpus/m6/native-template-controls-01/commands.jsonl @@ -0,0 +1,6 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-A33C1CD2 -ExpectedPages 1 -Pdf -KeepOpen", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\read -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Rename-Item C:\\one-tests\\runs\\capture\\read before-read\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-A33C1CD2 -UseCurrentCache -ExpectedPages -1 -Pdf", "exit": 0, "stdout": "Read 1 sections and 3 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/native-template-controls-01/default-template.png b/corpus/m6/native-template-controls-01/default-template.png new file mode 100644 index 0000000000000000000000000000000000000000..5536583b5eb35c440f64ecd7632cd17633e71e74 Binary files /dev/null and b/corpus/m6/native-template-controls-01/default-template.png differ diff --git a/corpus/m6/native-template-controls-01/finish b/corpus/m6/native-template-controls-01/finish new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/corpus/m6/native-template-controls-01/format-differences.json b/corpus/m6/native-template-controls-01/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-template-controls-01/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-template-controls-01/geometry-differences.json b/corpus/m6/native-template-controls-01/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-template-controls-01/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-template-controls-01/health.json b/corpus/m6/native-template-controls-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..487380d8cb9d1cf49bde306c6e9dc6edb962270a --- /dev/null +++ b/corpus/m6/native-template-controls-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-A33C1CD2", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/native-template-controls-01/machine.json b/corpus/m6/native-template-controls-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..5f8624d7681ac6abd19b3ac5f18f40f13c95df80 --- /dev/null +++ b/corpus/m6/native-template-controls-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-a33c1cd2", "hostname": "ONE-M6-A33C1CD2"} diff --git a/corpus/m6/native-template-controls-01/notebook/Open Notebook.onetoc2 b/corpus/m6/native-template-controls-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..3b7f27dd688313c2ca62c7e85527a32e906310e5 Binary files /dev/null and b/corpus/m6/native-template-controls-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/native-template-controls-01/notebook/synthetic.one b/corpus/m6/native-template-controls-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..cebce593d432621558945ae7b5a7c38df5f0edd9 Binary files /dev/null and b/corpus/m6/native-template-controls-01/notebook/synthetic.one differ diff --git a/corpus/m6/native-template-controls-01/pdf-format-checks.json b/corpus/m6/native-template-controls-01/pdf-format-checks.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/native-template-controls-01/pdf-format-checks.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/native-template-controls-01/read/environment.json b/corpus/m6/native-template-controls-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..00b1c91c33877bb34f0dc2cf539d0a5a33ea3403 --- /dev/null +++ b/corpus/m6/native-template-controls-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-A33C1CD2", + "cold": false, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/native-template-controls-01/read/hierarchy.xml b/corpus/m6/native-template-controls-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..ec464dcc8c5f9366feae4ca0516afde08819b5fc --- /dev/null +++ b/corpus/m6/native-template-controls-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-template-controls-01/read/page-000.pdf b/corpus/m6/native-template-controls-01/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6de9701a0cc8f7ec5a0296425c0521a3b8b0db5b Binary files /dev/null and b/corpus/m6/native-template-controls-01/read/page-000.pdf differ diff --git a/corpus/m6/native-template-controls-01/read/page-000.xml b/corpus/m6/native-template-controls-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..f790c5cdcb93e85fafeaa6348f8119a9e748dfbf --- /dev/null +++ b/corpus/m6/native-template-controls-01/read/page-000.xml @@ -0,0 +1,179 @@ + +iVBORw0KGgoAAAANSUhEUgAAAKsAAAIoCAMAAAAhjet0AAADAFBMVEX////d0dncvM/S6+W+4qyw +3t7akbqZ06ir2qrewNLB5OHcxtTr9/fp1eH9+/z9+fvcmL7tyN274avlzdu44d/cvc/jydjP6uTE +5ub25O779/n58/bbscncw9Lbuc2f1q3Y7++03quy3t6i1qncztez3r7gxNXm9Oq14ODu3ufbpsTJ +5+Pcz9jak7v6/f327vPcwdHcydXam7/F5uLjrcvy5u35/PrcvtDcy9bL6OPO6uq/5OT1+/vczdf7 +8ve24N/cv9D46/L06vDcxdPw4uqf1aiq0rS84uDbtsyb06jfn8Os27jw+fm64uLhpsew3KrM6dTa +lrzaocHD5eGm2Knamb20397outTZ79/x1uXbq8fbs8vs9+/n0d7z+vTi8/Pqwdjr2eTcytXcwtK/ +5MnN6eTT7Ozd8fHansCy3aq64uC54Kvcx9S336um2bPao8Ok16n03erbrsjbqcWp2anG5s7H5uK7 +0sDJ6Oid1Kjf8eTp9fLn9fW+4+Gt26q54cPvz+HmtNDM0cyd0qvZvs/U0dLJobXQ0c+y293Y0dW/ +0cPOxtOu0rey0rr0+vnTpbbA0djYlrnd8OzT7NnRnLfLyNS12dy419u71drH0cni8u7SwtHRxNKh +0q7Gzda20r3m9PDY7ujD0cb8/v22yK7h1t3KvrLg8vDWwNDDz9el0rG9rbLNnbb7/frexNTIw7HP +r7TMubPV7Of7+fq909m2yLnq4uepzbHPpMPWm7i/3Ky6srHFza/d2eSxuq6dzqnn9OC+17LGyLDb +79Du4Oju5+vKsMi8yrzIytXL6Mru+PW1tq/Gq7Ot267A47r9/P273cTewtPk0dzf1Nvh4uDfq8Xy +7vHp2OLy6e7M6eiq1Kr6/fzFytXQ6sXz+vDr9vTVqsbZ3dm02KvS7OnY1+HD0q7B16339PbBqbPa +7+rCxMDXm77T7Oeu3LjYydLL6ejQpLvKuc3G5snXp7za1dfx+ffgzdne0dq94rCy2dvE2t+lxqvA +ysDRqrXNtLPU7OkRzzSdAAAAAWJLR0QAiAUdSAAAAAxjbVBQSkNtcDA3MTIAAAADSABzvAAAI95J +REFUeF7NnXdgFMe9x/eW050k1AtCgBoCgYSECiAJ05Gw6YhmejXVgOk2YGxckzixndhOc3p7qS8v +eekvyeu9l7zee++9vzd9Z+vM7MzsZf4B3e3dfva33/m1mbtzHJujZrC3urHCJWPGkcnZNs+m8d7r +T/RQSu/fnt5ZGm9p56Wzq5k5g8AnauycMuW7DjaGLeo9UrE+5dtaeNnsRFLIfMLCWVO9ZW+STclz +1ane2fSLamZIoLrutwPs7NgpFbiEXtNGUn4/aVTXLbWrVUB1ZygbwugLaiKcf7x6lxk9t+qbCX2V +D7xH9e1NHj8p5QG8g0po2BpZF8ByGZOGUnuvakWzum7J0phZyqjupJoxzB2tbla30dzZld6pJs6s +Q0PT4ZgYGgsfoXQGcwdHOYG1Eyfn5bzRf7ItgDto7vwq7xRKWcYu8pyEuH96M49bGsEGZ9bQOGdQ +/r/zhjjY0uSxy3x3dyyOFFJP9w4tzeQ6wrNOxNiUPDzMji1N/sJlLc0nk1FzuQkGqzIjTB3LybV5 +lQg1l2OaNXV+7n1mD072wjE5GJMhDzJLyaDm5lFvYJZ19mS13x3NOBFRMnv14LDYqtz8Msg6GNU6 +cd2K6qATP0HtKphW9EL6iWFNsdb0JqT5M/zJJ82yx/qlzJrLkQhmhrWmV5COzuBtS1mT/KrvKlbh +G2GEdb1E4lztNaaIpIckrQoOw5mMAdYauQSvh5mWyFXarFQE+qySvRMASJMPzDomb9YcDl7arPKo +rNeDWS8qsM6DL9COsSqoFBazRiSB8fTwBdq5C/OVLBYl/gd10ZQlgOPsEU0NeOFSjhW1/NChknGA +mBqy6jbglPo8iBHAon/lwitVBUy2NOuC9ZLW5A9b5iBvLJFgcfKFKbdmveVLmgPcQxPD43j+zBu/ +2MbVpbjrruAFSPqit8oRWzqPTYQc/byLFLcHxq21yqwVelMrRgIPxeT6J7lKTyHAkrJL02VFLkwM +JTjOYSaFh5TtqlnGRrRQBfVTP62epiuzaq5zhVnXCqPRSZw4q7Nq9glDHmutRPa8CsEqsg65uo3t +IKsMai7XvzYNq+4aV5BV0r9DWEW7rnV1e/CBCCt9flBFSx+L56B+W9s/t5olxEpm/6pmNdZ52nJ1 +/KwqmdOwysG53Lj+Yrc/FkiqFZtW2Mby+d/prqZ3dRxfjG1W8+5KR7dpJgMglfD1fBUjvBLrWl2P +BWB5R6A2W5RQc/oScBy+M2CRdVxfAn7BWmSdbkACDi5H8LDIOqRZvuAsnROBRVbdvAWzzvbsqubd +VebWSd1qm1Q/Xhvbns9q00xdaaHmLVXZiwW/plcVeq/2XKywJFC579yxq4zMLEjsGVatkyIP/kum +zMrFrjb50ysd+evmWJlhLQn2W+ZQHYe5ArU8T9a2v2qSlfU1FfsTcrDf+nmTrA7rwJnyBC+8/hgY +r78Ar+YrRlEdttfKTOh6/qUiGS8+k8t90Swrqw8UqsN4AXzkWYoK/r3/DwyjOkwFBvIXZlRCfNM0 +LFVBs7ZiP8gZFf93y1HDtNQX6MaDj4RQi8WOw4ZhafmtsHAZIdnnea162PsNw5K+hmJvPcB7f4RZ +4UOGYek2YZ3p9UwMqnFYuv1aqf3it+v7Y1mLhjVLujDpVfB6PGqxw7A3IBlX6ugVp1bsugzPLwKb +Mt96PsGs4CnTQQGX4FK7rsIe67Fk1uICw5bFsHLrBkFafmZtKAfjyiYfvWkVkOZGmvnFSaD7Qh6N +hh23eVrDXtZx8OaHFLH2zQzrSUyKRjkH+4hhEdDCVh32RUq1g0PN5y9tsBdrU8NSpHIfKhBCN4M1 +rljQ5ELdQ0XLvpEQbQiggj/3MFjD0QtqahYqbdVgqVwvhVk9WNM+FsLirXBKsCTJ3hOBms9fIZY1 +P7tQ6wjqYEh+dS5HAizxVkHN0glmOCsgjmU22ikin3ThLLs70qz5/AUSFoy7WEILSwXx1nESvV7A +d/l8DGt+B37ehmBx0xuaVjL3xmn2pjjUfB57rvnGwwF7w0mgWvFWDWhazBo9s9AFXEAH2JlcmBc6 +hGaZHZmPIRR/yPIbGXtZ3q5HX7v3CDL2zTujRuwNd45JTDHM2hCvAWJYj2n/FixhNDpOmfEQg0C2 +EyLvhVhvJ6ASxdLIdQdZlB+nzNh2WY9QCChzSZAruArkCnDCPXovSApte8eIEJz1je5Y4noCCgV8 +Mhg2cQNjXdARgQoeOmUG1hmsTqRFrF2JGsjD4AXtuj+aFDy6xYwOQEbT2zM2HKdbxBodYNkF3ACH +ANRTsagGYcG6+JHmiehWImJNNmv+ScSahGq2UVezrHEoyriQNSJ19dF3QdZkVBAtTMkAaX/W5Iy2 +UAsBssYlLhQYhK75ryEB3L7RBV3xpR00WeRkYUyzZKKGcWVY8+AWQ6hubg42lPsLc/C0+ZwhgAtZ +g5VWSL7IepsCuVhDyLY2krHZ1d5Mg8sEUqxXwnH4fNC0hoKC31uDz1I9hNPxxyRZI6/nkq/lAZRi +dH4x5FlH3DbocyVZYxKxBq6JAHViQwW4MhsDpoVlrEgDl+JzxiCsmawrHLJBO2EY5doi1q6EfKHB +LwNTmUGIFnxW6aQMa1J2m7/kn2C2DAsaNc2rJOyaHILP+9KEKUMpV/htBt21oOa+IcgHBE/D1IYN +i4VZr/tVcYwVsPola82uYHPHl7VZaQ8B29Yi6+BfisotCYHwvsAiq/PPwBYSOImHkOaMbbs6s8AZ +BHWB8FJQRUaGTbs684X1lpCVNJKs29W5KQ5cQlhuJcSqXe+I+gNC0nyeiwdWWUfFBZeQFlZkWejV +Af0pIYzggMxYgWAFzQzhpXisHVY14CzQn1yeXk0nhbWt9ceX4lF/tdZxOoRVt8iwnh8wuih+9fjm +gm883QqafyIYwfNsidHgCmNtfQAUUf/9f8WvbUhdhBe3zJm1vs5vUvbX9+mlsCwfMNbOWLc9hhQ8 +/DNS9os7iOZZxjbyHIgnBc98XAOWmdXUil0yaqHwzdSwDbQ6NOWvRKiF70nNSvtapnzAukQBoCc/ +lxIWdpLhMNXTrI1yVQH8lIalYjWF6hwXm7VQ+KE0hqWo80213VbLoBY+n4KVopqaVo6zT4r1FXVW +kgd0mHJWjlMrhVoo/IkiLO1sbzG4decpP+veywfnbAQ7DNrnHNw1wD+lGA9oW9toC2spBzRysJ3/ +RoD2gxzt/6rY9QJxq/ONdgY5CYwc4kHR/9vPsSt5qzwrXYZ5xFxihQqKqxRm4FqIFD6wiz4vzcpI +zc0pUvrUE5a9vrvPYTNYObte2IMTgPkpl13WHahfuhRmp6AsObDaX58Rucaiuu07ydVIlIgNO/By +RsfNdDq9ui+QQ29/ClRRbOC0dSDOqsDAcwiraOHgUjkBPZXOpKuPRyb7+zzjYpA5kVolD+7Fx+yJ +F8Gl8+WkqNpyM+V8qo0tS+rqqWERxq4kVPcgZmWLyF1Pwr3QZOzp7iYZ6iP3phakjvtJZUlhOzYt +Tgeh848f7TxrF/Kc833j3tTUnZTmJCZbF1fr4VPXXYXHtYrN6rpIBG+HdgWB895+g0FTDhWc/QBl +DccAv5EvQ9Y3AL1e2DCV+i4ntIdqk62KTAtgoV13JioAPIkE+4byfMPfpHNFoi6WVKZ3ALFeFrEi +r/WZroZ/FJ003fNyCXRhHWSNDq7cBRyCrN/I/2Q6FOGros26d1cfGudoLKqDfkAkV9eFrB/7HeFJ +Ux4QVuvOy7zD33gd48IQK5IAZv3Bz6ZEEb0sVEWPhG/0QWJc4dRCrK/8gOicaZ9nmR72pQPXI23X +h54ckbLrr6RFEb6OZnoYdW+cIg/BvF/MuhEcxYKy8NyqB/hYd8YnUe0gJIlZoc9qVUWQPt7HmjTP +AawcK59HSmNIHcizJrv69p1i1uvAX0idNtVBfOMvOYlyD50Tzi0wB+3JFadPeAhRxKFgpFBYl8pk +ci/yWPuEZhMeMFDYLHfWdEd53f/E8kSICQ8ALut4Ogq5V3l9Sn3Wa3YlwAlWn/WyXQk4Dkte9Fl3 +2vQCUCZMBMLsVKRZINdA/0NOhvJHsWRb2w9ctxkI8AU9LetfRXY9V0AVr81Bw8GAiEXwfLvtmQWN +QJvAmoK9jmpzy4PWBrv0DLu3zl6K5VmA1IdJPUDxZRyy7bAwL21nHBQTxR+xKxOzOg5ZYpEo/mJZ +2wcsZoO+SUCml4Zh+zIyq+OsxpE2oeASOayBpyx7AO/tSe2dOnYdtJq4BsxA0gJx7h9p4PYBe+Vr +xP3Ckt2bzhX0Pe2srFqZmQrIRoZUKmj/sf8sg2PFmYx4SSs+RRr7lnciUjTuy4YWww4ISu+QSJ57 +m0cK/9eZiRRwxhW/Mhip5efe5UcFSsjEtLizIe6vcNBh1LKyhVuzMG0rkoFKwhUQALbxwmNZwGLN +ysP+RFAA5O9sYNEeLFnYT74phrUsExnUok7MuYT1bE6t745DzUizuAqX8gbvi0UFml2chWadq1C0 +AxKpARcDwtQrMmF1VqPkQBhu35Jg1syCguMcgKYdEYSweLXii6jKxrJOLSwYBxJN+95ks5aVbcuI +FexugELYmZDKRIYBH382qQGySCv0tSNxtM9xvvWBR6eBsfyJB/2mzsgX4Nt3IIH2HYyr6TQkRWPJ +XB/tfZmpANkWKmEkqsD9EqV6gJGC/7Q87IPNxskyi6yG+7Z2Xg75hEhUQLubh81QsaQvcwD2Pfde +9+FS5+qzKtYBB5udK/DUtvopmCbsve6lCZ/CRGtaeAUQ0XKwdzNVLD0Zxj1H3QIpBxaFUX2WzXZ2 +cYZBO/nw7tfnsO3CCkDsnmYXlsSunheD0QzLdW6EAhDsA0wGmSSycQYBS+MgFf8AgqmMUgB8rGUN +hT1bQsOC4FsHdmrhvMULAkHo5ZS1ZIIlPmx74RoKsDFqRdyVBHZmSe0KW6B/hUginQCxcAvNDUrM +6rR+DaI+GKdWX0goNavzx5D1iUTWacSwJXUE0FCdkHV5MitxsllVB7H37xZ0rsmo01rw7Co560wA +8bCAdRpOD/2sK6uOdXZWZcq/AkDsFrHihIvjOnZrIXW7M89mltpKyHXatNM+1pWdDBQDZ9RWduC5 +RGadhj0B7sYuDpLCp7LJxMGJmsSsSLAI9e42evN9/67IwKGtBGcUeFcaZ2FSuPhMJCl4MINObZXM +1MI5N8gHVsKZGDes52GQNSkZIPJYBGeQszUwpwLUthMxyBqfDzIhQ9azx5JRrc8wyCqeWtOQXRPu +P3nKbsNegRXzzH24chEYj1ayeoG/BKvFLmCVcFnIrnA0LfFuwulKfxsJPm91kUmJtSkwC1u8wpEa +d4XFgLtYzq6PwrsfkTYsCpn2jMWMPLnWoncc1FxrIt2FV+ZSy1rMvBLKbc4/PFD2QEwDoaUp4B62 +2VOBHGtTbP9g2rSgQ7CXx8yMb2NwduWmf8gbB2Ww0NrquBxrYrhgRTlRg7VYe0bKrsmhbXnAG9hS +bGdiz0Ui/MJD+KYyzBws+a27UnFLxOxfW7C1KFplhLXFrwJbs8sIq38dxJoItok6GaL7j5/3Ld7d +siTYmTL5q5jXN71sCbZTpi4Qs07zKdaSXY/J1FsSrE/weYEl1q3iFpEE6TSWjiNkS6zOwoS8RIqS +HJSBXZ2ZMkWMBDSfHNqya2dyB16CEh/CFTTW1u2qyuLW4aQx0YF0vQZowd6SjSFHwLFaTLfNTC6O +1V7N1SnswUuJwWO1uNdgq5mMwPMD9iTgOAsFa0ZSZuWCrK2UEHrC+3bL0SQexdaYy2y2M5xjJgTL +8gG7e7kWm0gLWQJrtVfoOLfQbjetwfJXaxU3idtnJZY3kq+EFVy20myWYazUTgloMmCzp0lwV2h6 +LaqADFCdTr0wSxsvWaA6W9foTCyKestWc8ifDm+TWDiKuxyKajO08rQaoetRXMFus5dcBaqM9KGL +pFdnsrn/EJvmWsslFjx5LZzG2dXMzIwKYfH+nJakTWUResVLXNvsrheGCs0VS1B9pxRsl6AcIGtS +x5kJPeyjKvELk97K9O5jE98HuwRN0ons6UpIuu2szbQ6tsnQCViXS1bfLUtgH3tFZwb7RiJ5zwDW +J2Ry7uW7wdRfceZudj4qxDsTzK0HoQRe/dDjcLzn1b8IzftFSyqbts08c7YEEuV5P/rXcBfW8i88 +/lH+0Zdffvn3EPnjn/jEJ85WVVWV0JiM66e+AIy4pOxDPlJbDbSk962q6uz8u9/4o/9bsmgRTlM/ +/Oqr73n88X95+bfwq17+0IfRw5UWexDi615c1XlrW1lT5aLY7tqHX/VUWWmvZSZC3doJdlPNVYhE +TSVivXsf3KCkAAo1UArWlWfgpr+5lYp91RKwVsGtwmUPolxEaSzJem5VwY3C6jaFF7Xc2vJJ5NTC +pGXcZ/FULJvNZ7cx+GK8jS5qc5IU8sPZ5cx38d7ENan7Ertt96KoFohRIz/fJmVVkBBkNLm2km20 +igWT/yoezCR1riJ7U/XWAJ+wtVOFdwTHyGJo1AccJQWAvFYGkYuizk09rcgFzbWeoMINt2hIl3Zx +tn7AttdaSfdRazX7EP6jtnaqUMGyjfSK/Z0I47ZYW6HGsOgTWChdUZhFcYc2WV1FgZ+8MKRWcAF2 +QxfOVuDQaPcyMy+3Gbo8s5pZAZ5rsZnifUJBL2RRyz5sMXR5n/uQafCIZ5/FQoaFAbl912LWRfaK +A+awTLG22Pu4pucFzOwNBQ24TlHjIe3z3Ie/zMytafY6Gsy5gv+IxShzRKW1MMuz6iaE+EqWWKtm +eVbtTQCIdVGZrbyQ/1ididwFLHFZ21vD+QGpDzlKKNbabkDfhwDNeII1tibXWV6wZjYxNpVZKrq2 ++lj1ixigkSZrkcv/8Wrt4hCwVlpzBP4PWGsX3YjVVpT1cm2kBs1mBnQTlWXWilmf15L7pGOy46q0 +5rQcLoNFlk3cvdQiUZNVWvyKv4Bhy5bEm61FxlGADSxpsz7h6wKKLYuHbVlTalavmUF9bYxlwT4q +mZoM2NViLRv6toXIjAtuTpLZigeOs7joHv6+hfCawSL0kdvSszq0/8oF3Cd8i4anyZ5PmW1CYNuF +RbuCnTW+tAD/wRZjT+9mH2OW6STaZnWCjgvjrmkCg35gDapahhVcmFW7OouTvs0Eca+4K8kKDrPL +KoRdsRimuhJ6hV9AZZlVAHvfYgdmZBJ+AH41hm3WRFjY/IOSlmCFW6+tszrIclFjG4pDMCuXqMjg +5y8yYHXI6nGAtxPXT/BRibIcbmjNgjXqe5jYF3GhKxBvK4FHCfMlMwesPMO3N7Zxv5uBWBMSRpxK +oo8LmUGReZeqzpnQ28685dtICb7JBQzhMjj6fj+Zs9g8BlfnwgUQuFs0gxVkwZXiGScSAYzI3y6s +Aq8Fv8zHWs0tLxviyZLTF5Q7/kMWv2uWCE46NMmGRUnZ156Wt4CdI2namJS/4M82/X5hnx0E6Xel +EfjBhHiAPoXxJndvqWFZ+zPex55GZn23u3GgsNTyr1wmm9hrf8b6LVyVfcB1D+0s1GX1s3GR1Cz4 +xnUTycdx3wK+dbv9XKGwub50/sArIGMkSz6R/Rz63Zg54DePC/us/zBnjBa4yjyy9Um+6vdd9Cdu +Nl4Gvz9fVyJcLgOLgKUfxfsU93M813aB33Sv25fpb8hhS/NdhNBXzbGvF3uv/9e5EO7m+qzdgq+j +ONcfbBnqm0I/JNZ+EPwGfeHpjI3r73jwbaTlrDXztqgfPZsD3EJhcwY/1epNtUAPfO5uEsJauO+6 +gB4rYmzclTUt2iLPj4crweC/VSwsAQqOnNjm7JTAth4GmdnfvBcImvca8GEZBl9uf0w07ieTfm+y +/TL82anMwll0Q5FxR84sDn8ONG1WQhCo4H2in/Fsh3OscDybTAG2NmPHl0So4PnrEHb7Oum8WedA +/zK+HztRrcwhgEBWqMvG2cZ/STLIXGXGIQhbOK5jMOnXxsG+E2eD4oFhsynKYmADWUsCM4bdnskM +i4R9h9ig7IgsYSMmmAoqqMigYTOybFXwu/3VUF33YIaw/q/3f6cwCIQEguJtIaMWzUr0WU84/uO3 +ZT0ATwwz8Ky8AfBxdztvgZby96b7/XnQ8YDjKWlfaeLAzSl/fh5F20Ihu5TWcepT/u6468LsG4Tb +7OrG2rqUZnXdjdiwS03cXKn3OJ5OrWiWYV9QyKr1tbqQ2qyg7YWnVyGbDNHZN6AQWkOH9mHW7VJ3 +UPeg1eJf7U26FqLYbBzXvoLqz8770WGTA/qCDFKu1YVzOhJw3WuYNYvMu15nZqGrJKwF6062tq4g +91vj8cYnIrBfJRzQlYDrEk9gX7HbtSXgzqEisJzDrCtoegEgDca6Wdd9Jr/+eCF12sIE3E7tajl4 +wd8O1R6M1WrD4GqhcE0bFReJ1gMt+PV2vaAFL5TptVCwGbvqCuK8Reh+qc8ClrVYIAAvMCKUwGUR +LK4Q0bDotfBvCAtGn+AQmmhBVospN/jla/jjzMmjT3AMLrnwsMdaC95dXBIAOV5PuBpSymJWe32N +VvDu9PfE42ng1ImXAW4U2bcrkKsEK1oeGImZYJwPsKqBz/6TFCvW40CUDtDiHD+steV/+BUF1kJh +58GAbQ8GSe1Vs7/7h9AiYr2Cg45j2w3sOoh+gB5U2nP6aIbNm9VWojX67x+TYoXus5XAIq6REdIS +CNx/8Kcll3X05/I/LcUKS79W5+kwWPgRS6Xs4Z/Nd30Dni3JdaLbDd1Aq1MLwoZwWDHr6NSefP7J +P4cnF6avcPkVpCQSsDYacEenOm7k8/nyNyD1CSIsSvhg+lQrkoH++tHoAt/YP3VqS7G7C6DmryBW +UcWNpjtO9WDoiB9LNXLXo3em7s3vKIZG9w1EyliT6wKcR5O0tHVzPGpqrS6YIpS3u8vLu7oIHEZk +o/w70ZmTO0TY3dOOSm19XTTtvnQ9l9H997Atu8u7GgJ4flZy2qQihiRRXi0cRbv5eCpSCrppz/lE +TgjdhfWaZFjSVvOHo6v7OCnULa1P1yU+egrrs3tHkj3Zc4Q1vpKdQwJUyBnVtrbWg3G1Ne18WjAf +3/s9F6RI8/m3EhEMkCAf9F4si049b2L6KJS0XHjv2ZVQ1sJAVAKz0cuizG4rPUpsekXWphD4u705 +3RdMpdEmNzrS3ukos45O4bt/O9o5xUni4xzOQB/nDub0cWW02SJqwSMY9Yb87Uf43/T7yp0jl/v6 ++i6P+DjhIQaTfWLUTeclp5R3WFLI9J6rM9apHN1C7v8lZdT8/0jBGvMCh0nE36B4/9GFfU6G1VgC +rYWa/zosDkXDlFop6qY0VgWG/bwI1NwKNkUtptAqEsGfCg272ZBvZajl6tOKvIILB5EmrkuXmIQ8 +B/UAxQ2pUb2cIFoMplCdUzTlV4tW/gv7+tsTJKtTlvhMu4CidmuYNZ//TVwdRAyDHzMigbVYlEtW +4y7o/Pd/Jho1ZVkSFeT2s6JPy6z5hmLxx5eGaLc/ZWj+I3RmVj0J5PPdxQ5n3XGurbJ934FU9VNs +2nCHmTW9w8I3pLxYPAxP0wrqkqutrWYxET+pVQHxk3oayHcVi1PGMqnIN/KaFDoeC11msbjFLqvX +TtFm3VAsjlqF9Vh1NZDfUyzeyYhVd27lnywWb2bEquuz4OSanxFrUdMPwGhQrLEJy7Uq1WvCwNWB +9/rljFi1RdBdLP63TcPyLWBdrwVYv1xt0bA8q65hbxSLX3UH7cGy1AVCayoWZATF5h57KrjJG3aT +Ssct7DYg69+6R6wZ9jDPqlVxoUyr+Eyba0+ypIlJkPckONkGkUQg6+s5i7BeAotw42EbNoj8xHnw ++sdyAPaILc36DRubxjbsKUqy5oabeyx5A79i4yzbADI+ESvUwIs5MOYBHcyyMsV8rgDKIKKpdQmg +FkVeArLeD1kt0pLOK/MIG0JtrR2b4JOixhzHmsv1D689st68bY+GVlv9XfgLIHjCIaMBYlds3Ivf +VW0cd4HPycI/Nt1gtj1/BT7QAaagKqsdXK+h4VHfvlJeXn6jG939YsdhCVZoft6uRLoXf9GsdaNg +OWN3HHaAqEVVTjQrIB5vqzgx25x2E2EBqgPIbwgqB3gLwnZF1u2/ODZj0liESICFqJBV1J+FNyKG +FeAOj7nVpoy7IGLvBZLBFtT6ETstUBsmsSLaRkN+ga7FBpzCKdyggI8mdz1BzZ3Mimh7lpkR7lTY +tI/Q9gQEuZIoWNDLELHmctObTdEeZf14bNyOKdb1QX8nRi4YhhP0ij1Yrr/NdQ2lNqOveRH33n7u +diHWJK91AR0BckLRGB9z3UZDs2x0wRQYry3w6wqljklrdTtkWXP9E2DnxgljHiysf5zmJhgWheLi +R0RWRc+PN7tuhSGXEDFVyYp97Moi7BCB8YwUa65/CJi20U6O6zgkVsTGAyyB4vNyrMAhANiKSTP+ +K/guRzFLbKBFXqBYlEUFvhbowFZlRrse0QEBBS0Jl8VdyyoI22PIIfhNm7wUStLxl+TtmsshWNeG +DlhxvilifhG1Ft+swprrXwthbfQ+vNZXSAYNOCMvFt+oxEpgZ5h3tcRrRblZMrGKz6qhgoiLLDvD +uPMa5TKbbj4zAG0OMlB3QGlgzVYYn2GcYYubvCWmC9SqRUW5oouyBMsblpW6l5hRVSIBZ/txtK3T +uGVfo/ea/nvbMyl86NNKt58ePGwHNtihCbCreSx2YSCjtWBZtuMoaGD89wup7EqcgVth2BskluZK +QYu/rHnIGbim/WywqcgbWDEQcLRYsu4Mw2lXoCLjWONbA2JpPIRhTYfb2PklnbpGoPdjFZhOZEa9 +bSe+GSZRFSbY9yJmNb6UFymDT6d0ApQfJQYgJpjOY/hgS2z7bPqJhWlx+AJFmOH55YR6X9qouRyZ +XqYl6zijv+DTqgHU3DxiWNd4zvUdz9zv0b6oqVWsAmpY0172z8B7P//BT0Pc97+kK1UyvahiTavg +K2L3rn4EcQWGE4MvqoNIvIJEWsPh60clzqx+SD+dXSYjQs2/qYPIvILOLpNO9kdkTpziGCYCg4b9 +1xQcMi9hLtacYZetkjlxmmNItmUwh2lMgyH1GtiVxcPQDp9ZE1LnTXMQbMqSYab4OnEyDYbUazjW +E0byrQqp06Y66KRn1x4TrOuHUmFIvYilBIDZRLpVPV3qtKkO4lkNiKDGHU+FIfUiWnVBKRgQwTK3 +X+q0qQ7i5pbr6nuCI2tTUci9iCUE0LD6a3XuQ3KnTXWUF7cAa6+uJ1jvqk2ti/MUoFd5LstERVut +OLWmr1WQN25u0qFdd/W4aonLdLdN2rBemoVxNTUwy3WlT40OBF5IGtY3s/RZl6myQu8uCetl2kQF +mnatdhUjLIpEUrD+iWVAAz2qrDgSPSSeYHD7Q2Do2RXIVdGuJBKtFc1IProS5Ao91vXARGpzi0XN +RLc8zysIPNtqdgx7XcVQgLZf4DE2HHeVYMt01NBMtBqVWaEf6mG0UbIdDroqyq2ZD1Qos8KbWzFJ +T9/cNuyLueMX40DBKzQ73HBKq+kVUTpHuHvcPNQ2HY6JIdpri1SA7prMIHhXNT+Aw6ZTMyOaJ+lR +zY8ogKilyHoSszqzgHrUhm6DALgBd0xJA3A3HkpCZivCai/OnoAnVmIF2xwxqyqs9i5Z4LJcpZyQ +xHgUgJQsq+lbwekQa6xLjzA4lgBJRGfJTzAD67LoZCrdLJKPkMBew7uupJlmYnsZen+FyUUzUpaE +TMrMMDO7jrEt5Ks9PLP4YmQWklHi6NWMV8Qw+BzShSzNW3xF3mAyrbHPfWFWWRGQnSGh5eB4WoMf +7XDIvZP0BCzch2b1rMmwS6g4MqnfFOKyc8IqZ1gvKY1qoNSs7z1C1dDY2LvMRAfTV0fQOSGjWC5/ +1kxE05Uy7M6J25p8qm/03sqSsyncLCj1+vkUWrPGk4ULHOe5m2RY+MkMb+hmd+lgYU5IRnO8DOYF +6hLtlCkVLMy12WiL7k+Mh4rSksjVgTUMZ9qJULQdn/DdfXSsZpmfyqjwRcFAPjYxTLSwavziRFRD +wnVLIwGSwCanHsFnS+MFgF25ySVLrN31TyuC2bKE7Djje+7k0Wm7R5q5ZGZVF4GBxT95QwaOrJE2 +KD7QePqkQl6tBFtCBYCLqpGp7uj1GCidVewYOpb1J8UG1l5M0wKFLxZXouQqGs0UpDrAsiootQDk +G1MVpUoDArdBootm7aOvyoqoEWi2pyTVYNxlJDWmGr9Nbj9jr+mNdrQ9J0pTBiRro2bZkQDujOpl +NkH/HxtpiBH77U/NAAAAAElFTkSuQmCC + diff --git a/corpus/m6/native-template-controls-01/read/page-001.pdf b/corpus/m6/native-template-controls-01/read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0ac8ed808bfd97720ab024f2ebba2dee3cfb7589 Binary files /dev/null and b/corpus/m6/native-template-controls-01/read/page-001.pdf differ diff --git a/corpus/m6/native-template-controls-01/read/page-001.xml b/corpus/m6/native-template-controls-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..ac17667115fd7991586c55deaa29fafb18625258 --- /dev/null +++ b/corpus/m6/native-template-controls-01/read/page-001.xml @@ -0,0 +1,179 @@ + +iVBORw0KGgoAAAANSUhEUgAAAKsAAAIoCAMAAAAhjet0AAADAFBMVEX////d0dncvM/S6+W+4qyw +3t7akbqZ06ir2qrewNLB5OHcxtTr9/fp1eH9+/z9+fvcmL7tyN274avlzdu44d/cvc/jydjP6uTE +5ub25O779/n58/bbscncw9Lbuc2f1q3Y7++03quy3t6i1qncztez3r7gxNXm9Oq14ODu3ufbpsTJ +5+Pcz9jak7v6/f327vPcwdHcydXam7/F5uLjrcvy5u35/PrcvtDcy9bL6OPO6uq/5OT1+/vczdf7 +8ve24N/cv9D46/L06vDcxdPw4uqf1aiq0rS84uDbtsyb06jfn8Os27jw+fm64uLhpsew3KrM6dTa +lrzaocHD5eGm2Knamb20397outTZ79/x1uXbq8fbs8vs9+/n0d7z+vTi8/Pqwdjr2eTcytXcwtK/ +5MnN6eTT7Ozd8fHansCy3aq64uC54Kvcx9S336um2bPao8Ok16n03erbrsjbqcWp2anG5s7H5uK7 +0sDJ6Oid1Kjf8eTp9fLn9fW+4+Gt26q54cPvz+HmtNDM0cyd0qvZvs/U0dLJobXQ0c+y293Y0dW/ +0cPOxtOu0rey0rr0+vnTpbbA0djYlrnd8OzT7NnRnLfLyNS12dy419u71drH0cni8u7SwtHRxNKh +0q7Gzda20r3m9PDY7ujD0cb8/v22yK7h1t3KvrLg8vDWwNDDz9el0rG9rbLNnbb7/frexNTIw7HP +r7TMubPV7Of7+fq909m2yLnq4uepzbHPpMPWm7i/3Ky6srHFza/d2eSxuq6dzqnn9OC+17LGyLDb +79Du4Oju5+vKsMi8yrzIytXL6Mru+PW1tq/Gq7Ot267A47r9/P273cTewtPk0dzf1Nvh4uDfq8Xy +7vHp2OLy6e7M6eiq1Kr6/fzFytXQ6sXz+vDr9vTVqsbZ3dm02KvS7OnY1+HD0q7B16339PbBqbPa +7+rCxMDXm77T7Oeu3LjYydLL6ejQpLvKuc3G5snXp7za1dfx+ffgzdne0dq94rCy2dvE2t+lxqvA +ysDRqrXNtLPU7OkRzzSdAAAAAWJLR0QAiAUdSAAAAAxjbVBQSkNtcDA3MTIAAAADSABzvAAAI95J +REFUeF7NnXdgFMe9x/eW050k1AtCgBoCgYSECiAJ05Gw6YhmejXVgOk2YGxckzixndhOc3p7qS8v +eekvyeu9l7zee++9vzd9Z+vM7MzsZf4B3e3dfva33/m1mbtzHJujZrC3urHCJWPGkcnZNs+m8d7r +T/RQSu/fnt5ZGm9p56Wzq5k5g8AnauycMuW7DjaGLeo9UrE+5dtaeNnsRFLIfMLCWVO9ZW+STclz +1ane2fSLamZIoLrutwPs7NgpFbiEXtNGUn4/aVTXLbWrVUB1ZygbwugLaiKcf7x6lxk9t+qbCX2V +D7xH9e1NHj8p5QG8g0po2BpZF8ByGZOGUnuvakWzum7J0phZyqjupJoxzB2tbla30dzZld6pJs6s +Q0PT4ZgYGgsfoXQGcwdHOYG1Eyfn5bzRf7ItgDto7vwq7xRKWcYu8pyEuH96M49bGsEGZ9bQOGdQ +/r/zhjjY0uSxy3x3dyyOFFJP9w4tzeQ6wrNOxNiUPDzMji1N/sJlLc0nk1FzuQkGqzIjTB3LybV5 +lQg1l2OaNXV+7n1mD072wjE5GJMhDzJLyaDm5lFvYJZ19mS13x3NOBFRMnv14LDYqtz8Msg6GNU6 +cd2K6qATP0HtKphW9EL6iWFNsdb0JqT5M/zJJ82yx/qlzJrLkQhmhrWmV5COzuBtS1mT/KrvKlbh +G2GEdb1E4lztNaaIpIckrQoOw5mMAdYauQSvh5mWyFXarFQE+qySvRMASJMPzDomb9YcDl7arPKo +rNeDWS8qsM6DL9COsSqoFBazRiSB8fTwBdq5C/OVLBYl/gd10ZQlgOPsEU0NeOFSjhW1/NChknGA +mBqy6jbglPo8iBHAon/lwitVBUy2NOuC9ZLW5A9b5iBvLJFgcfKFKbdmveVLmgPcQxPD43j+zBu/ +2MbVpbjrruAFSPqit8oRWzqPTYQc/byLFLcHxq21yqwVelMrRgIPxeT6J7lKTyHAkrJL02VFLkwM +JTjOYSaFh5TtqlnGRrRQBfVTP62epiuzaq5zhVnXCqPRSZw4q7Nq9glDHmutRPa8CsEqsg65uo3t +IKsMai7XvzYNq+4aV5BV0r9DWEW7rnV1e/CBCCt9flBFSx+L56B+W9s/t5olxEpm/6pmNdZ52nJ1 +/KwqmdOwysG53Lj+Yrc/FkiqFZtW2Mby+d/prqZ3dRxfjG1W8+5KR7dpJgMglfD1fBUjvBLrWl2P +BWB5R6A2W5RQc/oScBy+M2CRdVxfAn7BWmSdbkACDi5H8LDIOqRZvuAsnROBRVbdvAWzzvbsqubd +VebWSd1qm1Q/Xhvbns9q00xdaaHmLVXZiwW/plcVeq/2XKywJFC579yxq4zMLEjsGVatkyIP/kum +zMrFrjb50ysd+evmWJlhLQn2W+ZQHYe5ArU8T9a2v2qSlfU1FfsTcrDf+nmTrA7rwJnyBC+8/hgY +r78Ar+YrRlEdttfKTOh6/qUiGS8+k8t90Swrqw8UqsN4AXzkWYoK/r3/DwyjOkwFBvIXZlRCfNM0 +LFVBs7ZiP8gZFf93y1HDtNQX6MaDj4RQi8WOw4ZhafmtsHAZIdnnea162PsNw5K+hmJvPcB7f4RZ +4UOGYek2YZ3p9UwMqnFYuv1aqf3it+v7Y1mLhjVLujDpVfB6PGqxw7A3IBlX6ugVp1bsugzPLwKb +Mt96PsGs4CnTQQGX4FK7rsIe67Fk1uICw5bFsHLrBkFafmZtKAfjyiYfvWkVkOZGmvnFSaD7Qh6N +hh23eVrDXtZx8OaHFLH2zQzrSUyKRjkH+4hhEdDCVh32RUq1g0PN5y9tsBdrU8NSpHIfKhBCN4M1 +rljQ5ELdQ0XLvpEQbQiggj/3MFjD0QtqahYqbdVgqVwvhVk9WNM+FsLirXBKsCTJ3hOBms9fIZY1 +P7tQ6wjqYEh+dS5HAizxVkHN0glmOCsgjmU22ikin3ThLLs70qz5/AUSFoy7WEILSwXx1nESvV7A +d/l8DGt+B37ehmBx0xuaVjL3xmn2pjjUfB57rvnGwwF7w0mgWvFWDWhazBo9s9AFXEAH2JlcmBc6 +hGaZHZmPIRR/yPIbGXtZ3q5HX7v3CDL2zTujRuwNd45JTDHM2hCvAWJYj2n/FixhNDpOmfEQg0C2 +EyLvhVhvJ6ASxdLIdQdZlB+nzNh2WY9QCChzSZAruArkCnDCPXovSApte8eIEJz1je5Y4noCCgV8 +Mhg2cQNjXdARgQoeOmUG1hmsTqRFrF2JGsjD4AXtuj+aFDy6xYwOQEbT2zM2HKdbxBodYNkF3ACH +ANRTsagGYcG6+JHmiehWImJNNmv+ScSahGq2UVezrHEoyriQNSJ19dF3QdZkVBAtTMkAaX/W5Iy2 +UAsBssYlLhQYhK75ryEB3L7RBV3xpR00WeRkYUyzZKKGcWVY8+AWQ6hubg42lPsLc/C0+ZwhgAtZ +g5VWSL7IepsCuVhDyLY2krHZ1d5Mg8sEUqxXwnH4fNC0hoKC31uDz1I9hNPxxyRZI6/nkq/lAZRi +dH4x5FlH3DbocyVZYxKxBq6JAHViQwW4MhsDpoVlrEgDl+JzxiCsmawrHLJBO2EY5doi1q6EfKHB +LwNTmUGIFnxW6aQMa1J2m7/kn2C2DAsaNc2rJOyaHILP+9KEKUMpV/htBt21oOa+IcgHBE/D1IYN +i4VZr/tVcYwVsPola82uYHPHl7VZaQ8B29Yi6+BfisotCYHwvsAiq/PPwBYSOImHkOaMbbs6s8AZ +BHWB8FJQRUaGTbs684X1lpCVNJKs29W5KQ5cQlhuJcSqXe+I+gNC0nyeiwdWWUfFBZeQFlZkWejV +Af0pIYzggMxYgWAFzQzhpXisHVY14CzQn1yeXk0nhbWt9ceX4lF/tdZxOoRVt8iwnh8wuih+9fjm +gm883QqafyIYwfNsidHgCmNtfQAUUf/9f8WvbUhdhBe3zJm1vs5vUvbX9+mlsCwfMNbOWLc9hhQ8 +/DNS9os7iOZZxjbyHIgnBc98XAOWmdXUil0yaqHwzdSwDbQ6NOWvRKiF70nNSvtapnzAukQBoCc/ +lxIWdpLhMNXTrI1yVQH8lIalYjWF6hwXm7VQ+KE0hqWo80213VbLoBY+n4KVopqaVo6zT4r1FXVW +kgd0mHJWjlMrhVoo/IkiLO1sbzG4decpP+veywfnbAQ7DNrnHNw1wD+lGA9oW9toC2spBzRysJ3/ +RoD2gxzt/6rY9QJxq/ONdgY5CYwc4kHR/9vPsSt5qzwrXYZ5xFxihQqKqxRm4FqIFD6wiz4vzcpI +zc0pUvrUE5a9vrvPYTNYObte2IMTgPkpl13WHahfuhRmp6AsObDaX58Rucaiuu07ydVIlIgNO/By +RsfNdDq9ui+QQ29/ClRRbOC0dSDOqsDAcwiraOHgUjkBPZXOpKuPRyb7+zzjYpA5kVolD+7Fx+yJ +F8Gl8+WkqNpyM+V8qo0tS+rqqWERxq4kVPcgZmWLyF1Pwr3QZOzp7iYZ6iP3phakjvtJZUlhOzYt +Tgeh848f7TxrF/Kc833j3tTUnZTmJCZbF1fr4VPXXYXHtYrN6rpIBG+HdgWB895+g0FTDhWc/QBl +DccAv5EvQ9Y3AL1e2DCV+i4ntIdqk62KTAtgoV13JioAPIkE+4byfMPfpHNFoi6WVKZ3ALFeFrEi +r/WZroZ/FJ003fNyCXRhHWSNDq7cBRyCrN/I/2Q6FOGros26d1cfGudoLKqDfkAkV9eFrB/7HeFJ +Ux4QVuvOy7zD33gd48IQK5IAZv3Bz6ZEEb0sVEWPhG/0QWJc4dRCrK/8gOicaZ9nmR72pQPXI23X +h54ckbLrr6RFEb6OZnoYdW+cIg/BvF/MuhEcxYKy8NyqB/hYd8YnUe0gJIlZoc9qVUWQPt7HmjTP +AawcK59HSmNIHcizJrv69p1i1uvAX0idNtVBfOMvOYlyD50Tzi0wB+3JFadPeAhRxKFgpFBYl8pk +ci/yWPuEZhMeMFDYLHfWdEd53f/E8kSICQ8ALut4Ogq5V3l9Sn3Wa3YlwAlWn/WyXQk4Dkte9Fl3 +2vQCUCZMBMLsVKRZINdA/0NOhvJHsWRb2w9ctxkI8AU9LetfRXY9V0AVr81Bw8GAiEXwfLvtmQWN +QJvAmoK9jmpzy4PWBrv0DLu3zl6K5VmA1IdJPUDxZRyy7bAwL21nHBQTxR+xKxOzOg5ZYpEo/mJZ +2wcsZoO+SUCml4Zh+zIyq+OsxpE2oeASOayBpyx7AO/tSe2dOnYdtJq4BsxA0gJx7h9p4PYBe+Vr +xP3Ckt2bzhX0Pe2srFqZmQrIRoZUKmj/sf8sg2PFmYx4SSs+RRr7lnciUjTuy4YWww4ISu+QSJ57 +m0cK/9eZiRRwxhW/Mhip5efe5UcFSsjEtLizIe6vcNBh1LKyhVuzMG0rkoFKwhUQALbxwmNZwGLN +ysP+RFAA5O9sYNEeLFnYT74phrUsExnUok7MuYT1bE6t745DzUizuAqX8gbvi0UFml2chWadq1C0 +AxKpARcDwtQrMmF1VqPkQBhu35Jg1syCguMcgKYdEYSweLXii6jKxrJOLSwYBxJN+95ks5aVbcuI +FexugELYmZDKRIYBH382qQGySCv0tSNxtM9xvvWBR6eBsfyJB/2mzsgX4Nt3IIH2HYyr6TQkRWPJ +XB/tfZmpANkWKmEkqsD9EqV6gJGC/7Q87IPNxskyi6yG+7Z2Xg75hEhUQLubh81QsaQvcwD2Pfde +9+FS5+qzKtYBB5udK/DUtvopmCbsve6lCZ/CRGtaeAUQ0XKwdzNVLD0Zxj1H3QIpBxaFUX2WzXZ2 +cYZBO/nw7tfnsO3CCkDsnmYXlsSunheD0QzLdW6EAhDsA0wGmSSycQYBS+MgFf8AgqmMUgB8rGUN +hT1bQsOC4FsHdmrhvMULAkHo5ZS1ZIIlPmx74RoKsDFqRdyVBHZmSe0KW6B/hUginQCxcAvNDUrM +6rR+DaI+GKdWX0goNavzx5D1iUTWacSwJXUE0FCdkHV5MitxsllVB7H37xZ0rsmo01rw7Co560wA +8bCAdRpOD/2sK6uOdXZWZcq/AkDsFrHihIvjOnZrIXW7M89mltpKyHXatNM+1pWdDBQDZ9RWduC5 +RGadhj0B7sYuDpLCp7LJxMGJmsSsSLAI9e42evN9/67IwKGtBGcUeFcaZ2FSuPhMJCl4MINObZXM +1MI5N8gHVsKZGDes52GQNSkZIPJYBGeQszUwpwLUthMxyBqfDzIhQ9azx5JRrc8wyCqeWtOQXRPu +P3nKbsNegRXzzH24chEYj1ayeoG/BKvFLmCVcFnIrnA0LfFuwulKfxsJPm91kUmJtSkwC1u8wpEa +d4XFgLtYzq6PwrsfkTYsCpn2jMWMPLnWoncc1FxrIt2FV+ZSy1rMvBLKbc4/PFD2QEwDoaUp4B62 +2VOBHGtTbP9g2rSgQ7CXx8yMb2NwduWmf8gbB2Ww0NrquBxrYrhgRTlRg7VYe0bKrsmhbXnAG9hS +bGdiz0Ui/MJD+KYyzBws+a27UnFLxOxfW7C1KFplhLXFrwJbs8sIq38dxJoItok6GaL7j5/3Ld7d +siTYmTL5q5jXN71sCbZTpi4Qs07zKdaSXY/J1FsSrE/weYEl1q3iFpEE6TSWjiNkS6zOwoS8RIqS +HJSBXZ2ZMkWMBDSfHNqya2dyB16CEh/CFTTW1u2qyuLW4aQx0YF0vQZowd6SjSFHwLFaTLfNTC6O +1V7N1SnswUuJwWO1uNdgq5mMwPMD9iTgOAsFa0ZSZuWCrK2UEHrC+3bL0SQexdaYy2y2M5xjJgTL +8gG7e7kWm0gLWQJrtVfoOLfQbjetwfJXaxU3idtnJZY3kq+EFVy20myWYazUTgloMmCzp0lwV2h6 +LaqADFCdTr0wSxsvWaA6W9foTCyKestWc8ifDm+TWDiKuxyKajO08rQaoetRXMFus5dcBaqM9KGL +pFdnsrn/EJvmWsslFjx5LZzG2dXMzIwKYfH+nJakTWUResVLXNvsrheGCs0VS1B9pxRsl6AcIGtS +x5kJPeyjKvELk97K9O5jE98HuwRN0ons6UpIuu2szbQ6tsnQCViXS1bfLUtgH3tFZwb7RiJ5zwDW +J2Ry7uW7wdRfceZudj4qxDsTzK0HoQRe/dDjcLzn1b8IzftFSyqbts08c7YEEuV5P/rXcBfW8i88 +/lH+0Zdffvn3EPnjn/jEJ85WVVWV0JiM66e+AIy4pOxDPlJbDbSk962q6uz8u9/4o/9bsmgRTlM/ +/Oqr73n88X95+bfwq17+0IfRw5UWexDi615c1XlrW1lT5aLY7tqHX/VUWWmvZSZC3doJdlPNVYhE +TSVivXsf3KCkAAo1UArWlWfgpr+5lYp91RKwVsGtwmUPolxEaSzJem5VwY3C6jaFF7Xc2vJJ5NTC +pGXcZ/FULJvNZ7cx+GK8jS5qc5IU8sPZ5cx38d7ENan7Ertt96KoFohRIz/fJmVVkBBkNLm2km20 +igWT/yoezCR1riJ7U/XWAJ+wtVOFdwTHyGJo1AccJQWAvFYGkYuizk09rcgFzbWeoMINt2hIl3Zx +tn7AttdaSfdRazX7EP6jtnaqUMGyjfSK/Z0I47ZYW6HGsOgTWChdUZhFcYc2WV1FgZ+8MKRWcAF2 +QxfOVuDQaPcyMy+3Gbo8s5pZAZ5rsZnifUJBL2RRyz5sMXR5n/uQafCIZ5/FQoaFAbl912LWRfaK +A+awTLG22Pu4pucFzOwNBQ24TlHjIe3z3Ie/zMytafY6Gsy5gv+IxShzRKW1MMuz6iaE+EqWWKtm +eVbtTQCIdVGZrbyQ/1ididwFLHFZ21vD+QGpDzlKKNbabkDfhwDNeII1tibXWV6wZjYxNpVZKrq2 ++lj1ixigkSZrkcv/8Wrt4hCwVlpzBP4PWGsX3YjVVpT1cm2kBs1mBnQTlWXWilmf15L7pGOy46q0 +5rQcLoNFlk3cvdQiUZNVWvyKv4Bhy5bEm61FxlGADSxpsz7h6wKKLYuHbVlTalavmUF9bYxlwT4q +mZoM2NViLRv6toXIjAtuTpLZigeOs7joHv6+hfCawSL0kdvSszq0/8oF3Cd8i4anyZ5PmW1CYNuF +RbuCnTW+tAD/wRZjT+9mH2OW6STaZnWCjgvjrmkCg35gDapahhVcmFW7OouTvs0Eca+4K8kKDrPL +KoRdsRimuhJ6hV9AZZlVAHvfYgdmZBJ+AH41hm3WRFjY/IOSlmCFW6+tszrIclFjG4pDMCuXqMjg +5y8yYHXI6nGAtxPXT/BRibIcbmjNgjXqe5jYF3GhKxBvK4FHCfMlMwesPMO3N7Zxv5uBWBMSRpxK +oo8LmUGReZeqzpnQ28685dtICb7JBQzhMjj6fj+Zs9g8BlfnwgUQuFs0gxVkwZXiGScSAYzI3y6s +Aq8Fv8zHWs0tLxviyZLTF5Q7/kMWv2uWCE46NMmGRUnZ156Wt4CdI2namJS/4M82/X5hnx0E6Xel +EfjBhHiAPoXxJndvqWFZ+zPex55GZn23u3GgsNTyr1wmm9hrf8b6LVyVfcB1D+0s1GX1s3GR1Cz4 +xnUTycdx3wK+dbv9XKGwub50/sArIGMkSz6R/Rz63Zg54DePC/us/zBnjBa4yjyy9Um+6vdd9Cdu +Nl4Gvz9fVyJcLgOLgKUfxfsU93M813aB33Sv25fpb8hhS/NdhNBXzbGvF3uv/9e5EO7m+qzdgq+j +ONcfbBnqm0I/JNZ+EPwGfeHpjI3r73jwbaTlrDXztqgfPZsD3EJhcwY/1epNtUAPfO5uEsJauO+6 +gB4rYmzclTUt2iLPj4crweC/VSwsAQqOnNjm7JTAth4GmdnfvBcImvca8GEZBl9uf0w07ieTfm+y +/TL82anMwll0Q5FxR84sDn8ONG1WQhCo4H2in/Fsh3OscDybTAG2NmPHl0So4PnrEHb7Oum8WedA +/zK+HztRrcwhgEBWqMvG2cZ/STLIXGXGIQhbOK5jMOnXxsG+E2eD4oFhsynKYmADWUsCM4bdnskM +i4R9h9ig7IgsYSMmmAoqqMigYTOybFXwu/3VUF33YIaw/q/3f6cwCIQEguJtIaMWzUr0WU84/uO3 +ZT0ATwwz8Ky8AfBxdztvgZby96b7/XnQ8YDjKWlfaeLAzSl/fh5F20Ihu5TWcepT/u6468LsG4Tb +7OrG2rqUZnXdjdiwS03cXKn3OJ5OrWiWYV9QyKr1tbqQ2qyg7YWnVyGbDNHZN6AQWkOH9mHW7VJ3 +UPeg1eJf7U26FqLYbBzXvoLqz8770WGTA/qCDFKu1YVzOhJw3WuYNYvMu15nZqGrJKwF6062tq4g +91vj8cYnIrBfJRzQlYDrEk9gX7HbtSXgzqEisJzDrCtoegEgDca6Wdd9Jr/+eCF12sIE3E7tajl4 +wd8O1R6M1WrD4GqhcE0bFReJ1gMt+PV2vaAFL5TptVCwGbvqCuK8Reh+qc8ClrVYIAAvMCKUwGUR +LK4Q0bDotfBvCAtGn+AQmmhBVospN/jla/jjzMmjT3AMLrnwsMdaC95dXBIAOV5PuBpSymJWe32N +VvDu9PfE42ng1ImXAW4U2bcrkKsEK1oeGImZYJwPsKqBz/6TFCvW40CUDtDiHD+steV/+BUF1kJh +58GAbQ8GSe1Vs7/7h9AiYr2Cg45j2w3sOoh+gB5U2nP6aIbNm9VWojX67x+TYoXus5XAIq6REdIS +CNx/8Kcll3X05/I/LcUKS79W5+kwWPgRS6Xs4Z/Nd30Dni3JdaLbDd1Aq1MLwoZwWDHr6NSefP7J +P4cnF6avcPkVpCQSsDYacEenOm7k8/nyNyD1CSIsSvhg+lQrkoH++tHoAt/YP3VqS7G7C6DmryBW +UcWNpjtO9WDoiB9LNXLXo3em7s3vKIZG9w1EyliT6wKcR5O0tHVzPGpqrS6YIpS3u8vLu7oIHEZk +o/w70ZmTO0TY3dOOSm19XTTtvnQ9l9H997Atu8u7GgJ4flZy2qQihiRRXi0cRbv5eCpSCrppz/lE +TgjdhfWaZFjSVvOHo6v7OCnULa1P1yU+egrrs3tHkj3Zc4Q1vpKdQwJUyBnVtrbWg3G1Ne18WjAf +3/s9F6RI8/m3EhEMkCAf9F4si049b2L6KJS0XHjv2ZVQ1sJAVAKz0cuizG4rPUpsekXWphD4u705 +3RdMpdEmNzrS3ukos45O4bt/O9o5xUni4xzOQB/nDub0cWW02SJqwSMY9Yb87Uf43/T7yp0jl/v6 ++i6P+DjhIQaTfWLUTeclp5R3WFLI9J6rM9apHN1C7v8lZdT8/0jBGvMCh0nE36B4/9GFfU6G1VgC +rYWa/zosDkXDlFop6qY0VgWG/bwI1NwKNkUtptAqEsGfCg272ZBvZajl6tOKvIILB5EmrkuXmIQ8 +B/UAxQ2pUb2cIFoMplCdUzTlV4tW/gv7+tsTJKtTlvhMu4CidmuYNZ//TVwdRAyDHzMigbVYlEtW +4y7o/Pd/Jho1ZVkSFeT2s6JPy6z5hmLxx5eGaLc/ZWj+I3RmVj0J5PPdxQ5n3XGurbJ934FU9VNs +2nCHmTW9w8I3pLxYPAxP0wrqkqutrWYxET+pVQHxk3oayHcVi1PGMqnIN/KaFDoeC11msbjFLqvX +TtFm3VAsjlqF9Vh1NZDfUyzeyYhVd27lnywWb2bEquuz4OSanxFrUdMPwGhQrLEJy7Uq1WvCwNWB +9/rljFi1RdBdLP63TcPyLWBdrwVYv1xt0bA8q65hbxSLX3UH7cGy1AVCayoWZATF5h57KrjJG3aT +Ssct7DYg69+6R6wZ9jDPqlVxoUyr+Eyba0+ypIlJkPckONkGkUQg6+s5i7BeAotw42EbNoj8xHnw ++sdyAPaILc36DRubxjbsKUqy5oabeyx5A79i4yzbADI+ESvUwIs5MOYBHcyyMsV8rgDKIKKpdQmg +FkVeArLeD1kt0pLOK/MIG0JtrR2b4JOixhzHmsv1D689st68bY+GVlv9XfgLIHjCIaMBYlds3Ivf +VW0cd4HPycI/Nt1gtj1/BT7QAaagKqsdXK+h4VHfvlJeXn6jG939YsdhCVZoft6uRLoXf9GsdaNg +OWN3HHaAqEVVTjQrIB5vqzgx25x2E2EBqgPIbwgqB3gLwnZF1u2/ODZj0liESICFqJBV1J+FNyKG +FeAOj7nVpoy7IGLvBZLBFtT6ETstUBsmsSLaRkN+ga7FBpzCKdyggI8mdz1BzZ3Mimh7lpkR7lTY +tI/Q9gQEuZIoWNDLELHmctObTdEeZf14bNyOKdb1QX8nRi4YhhP0ij1Yrr/NdQ2lNqOveRH33n7u +diHWJK91AR0BckLRGB9z3UZDs2x0wRQYry3w6wqljklrdTtkWXP9E2DnxgljHiysf5zmJhgWheLi +R0RWRc+PN7tuhSGXEDFVyYp97Moi7BCB8YwUa65/CJi20U6O6zgkVsTGAyyB4vNyrMAhANiKSTP+ +K/guRzFLbKBFXqBYlEUFvhbowFZlRrse0QEBBS0Jl8VdyyoI22PIIfhNm7wUStLxl+TtmsshWNeG +DlhxvilifhG1Ft+swprrXwthbfQ+vNZXSAYNOCMvFt+oxEpgZ5h3tcRrRblZMrGKz6qhgoiLLDvD +uPMa5TKbbj4zAG0OMlB3QGlgzVYYn2GcYYubvCWmC9SqRUW5oouyBMsblpW6l5hRVSIBZ/txtK3T +uGVfo/ea/nvbMyl86NNKt58ePGwHNtihCbCreSx2YSCjtWBZtuMoaGD89wup7EqcgVth2BskluZK +QYu/rHnIGbim/WywqcgbWDEQcLRYsu4Mw2lXoCLjWONbA2JpPIRhTYfb2PklnbpGoPdjFZhOZEa9 +bSe+GSZRFSbY9yJmNb6UFymDT6d0ApQfJQYgJpjOY/hgS2z7bPqJhWlx+AJFmOH55YR6X9qouRyZ +XqYl6zijv+DTqgHU3DxiWNd4zvUdz9zv0b6oqVWsAmpY0172z8B7P//BT0Pc97+kK1UyvahiTavg +K2L3rn4EcQWGE4MvqoNIvIJEWsPh60clzqx+SD+dXSYjQs2/qYPIvILOLpNO9kdkTpziGCYCg4b9 +1xQcMi9hLtacYZetkjlxmmNItmUwh2lMgyH1GtiVxcPQDp9ZE1LnTXMQbMqSYab4OnEyDYbUazjW +E0byrQqp06Y66KRn1x4TrOuHUmFIvYilBIDZRLpVPV3qtKkO4lkNiKDGHU+FIfUiWnVBKRgQwTK3 +X+q0qQ7i5pbr6nuCI2tTUci9iCUE0LD6a3XuQ3KnTXWUF7cAa6+uJ1jvqk2ti/MUoFd5LstERVut +OLWmr1WQN25u0qFdd/W4aonLdLdN2rBemoVxNTUwy3WlT40OBF5IGtY3s/RZl6myQu8uCetl2kQF +mnatdhUjLIpEUrD+iWVAAz2qrDgSPSSeYHD7Q2Do2RXIVdGuJBKtFc1IProS5Ao91vXARGpzi0XN +RLc8zysIPNtqdgx7XcVQgLZf4DE2HHeVYMt01NBMtBqVWaEf6mG0UbIdDroqyq2ZD1Qos8KbWzFJ +T9/cNuyLueMX40DBKzQ73HBKq+kVUTpHuHvcPNQ2HY6JIdpri1SA7prMIHhXNT+Aw6ZTMyOaJ+lR +zY8ogKilyHoSszqzgHrUhm6DALgBd0xJA3A3HkpCZivCai/OnoAnVmIF2xwxqyqs9i5Z4LJcpZyQ +xHgUgJQsq+lbwekQa6xLjzA4lgBJRGfJTzAD67LoZCrdLJKPkMBew7uupJlmYnsZen+FyUUzUpaE +TMrMMDO7jrEt5Ks9PLP4YmQWklHi6NWMV8Qw+BzShSzNW3xF3mAyrbHPfWFWWRGQnSGh5eB4WoMf +7XDIvZP0BCzch2b1rMmwS6g4MqnfFOKyc8IqZ1gvKY1qoNSs7z1C1dDY2LvMRAfTV0fQOSGjWC5/ +1kxE05Uy7M6J25p8qm/03sqSsyncLCj1+vkUWrPGk4ULHOe5m2RY+MkMb+hmd+lgYU5IRnO8DOYF +6hLtlCkVLMy12WiL7k+Mh4rSksjVgTUMZ9qJULQdn/DdfXSsZpmfyqjwRcFAPjYxTLSwavziRFRD +wnVLIwGSwCanHsFnS+MFgF25ySVLrN31TyuC2bKE7Djje+7k0Wm7R5q5ZGZVF4GBxT95QwaOrJE2 +KD7QePqkQl6tBFtCBYCLqpGp7uj1GCidVewYOpb1J8UG1l5M0wKFLxZXouQqGs0UpDrAsiootQDk +G1MVpUoDArdBootm7aOvyoqoEWi2pyTVYNxlJDWmGr9Nbj9jr+mNdrQ9J0pTBiRro2bZkQDujOpl +NkH/HxtpiBH77U/NAAAAAElFTkSuQmCC + diff --git a/corpus/m6/native-template-controls-01/read/page-002.pdf b/corpus/m6/native-template-controls-01/read/page-002.pdf new file mode 100644 index 0000000000000000000000000000000000000000..89fb7d27fbbdb4a03794effd961c4b799aec3ba8 Binary files /dev/null and b/corpus/m6/native-template-controls-01/read/page-002.pdf differ diff --git a/corpus/m6/native-template-controls-01/read/page-002.xml b/corpus/m6/native-template-controls-01/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..e44203ad99d6e09579fd00769eadf953830dd469 --- /dev/null +++ b/corpus/m6/native-template-controls-01/read/page-002.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/native-template-controls-01/read/payloads.json b/corpus/m6/native-template-controls-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..1ce91a413d6fff4d58765187b76756f0e97ae843 --- /dev/null +++ b/corpus/m6/native-template-controls-01/read/payloads.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/corpus/m6/native-template-controls-01/run.json b/corpus/m6/native-template-controls-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..b4bc0c0190f0169867b30356effd49c65efe1e00 --- /dev/null +++ b/corpus/m6/native-template-controls-01/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/corpus/writer/create-notebook-01/notebook", + "expected_pages": 1, + "author": null, + "author_timeout_seconds": 600, + "inspect": true, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/m6/native-template-controls-01/scripts/cold.ps1 b/corpus/m6/native-template-controls-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/native-template-controls-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/native-template-controls-01/scripts/read.ps1 b/corpus/m6/native-template-controls-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/corpus/m6/native-template-controls-01/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/native-template-controls-01/source.json b/corpus/m6/native-template-controls-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..d2d5ea6713b67d9a5b303a6ca34ff393a4aee722 --- /dev/null +++ b/corpus/m6/native-template-controls-01/source.json @@ -0,0 +1,14 @@ +[ + { + "path": "Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86", + "mtime_ns": 1788592288950419463 + }, + { + "path": "synthetic.one", + "bytes": 3348, + "sha256": "b0662387c3fdc256d8dbe809e3b8f73b3586559696467fb1fff8f589095fa797", + "mtime_ns": 1788592288941514581 + } +] diff --git a/corpus/m6/native-template-controls-01/teardown.json b/corpus/m6/native-template-controls-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/native-template-controls-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m6/native-template-controls-01/ui-operations.json b/corpus/m6/native-template-controls-01/ui-operations.json new file mode 100644 index 0000000000000000000000000000000000000000..0cf3985686f18fae2efdd280de315e3b47c70cb9 --- /dev/null +++ b/corpus/m6/native-template-controls-01/ui-operations.json @@ -0,0 +1,11 @@ +{ + "operations": [ + "New Page dropdown > Page Templates > Decorative > Hearts", + "Set title to Hearts template control", + "Choose default template > Hearts - Decorative (mouse selection verified)", + "New Page: visually verified the Hearts background appeared automatically", + "Set title to Default template page" + ], + "expected_pages": 3, + "template": "Hearts" +} \ No newline at end of file diff --git a/corpus/m6/rust-collapse-control-01/ORACLE.md b/corpus/m6/rust-collapse-control-01/ORACLE.md new file mode 100644 index 0000000000000000000000000000000000000000..b1f6fd290c843019482ae491c96e0a3e0893a784 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/ORACLE.md @@ -0,0 +1,17 @@ +# Saved paragraph collapse default + +The Rust scalar writer changed only property `0x0c001c11` on the paragraph +containing `Collapsed parent` from byte `01` to `00`, starting from +`../native-features-01/notebook`. The mutated input is `input/notebook`. +A fresh OneNote 14.0.4763.1000 clone opened it without further editing. + +The original native fixture reports `collapsed="1"` and hides both descendants +in its PDF. This control omits `collapsed` from XML and shows both descendants +in its PDF. Both versions retain the same child/grandchild structure. +`tests/document.rs` and `tools/test_document_oracle.py` assert these facts. +The model exposes the byte as `collapse_state`: 0 means expanded and 1 collapsed; +other values remain uninterpreted. The report folds state 1 while retaining +expandable descendant content. + +The separate `../native-expanded-control-ui-01` demonstrates that a client can +expand its transient view without changing the notebook or its PDF output. diff --git a/corpus/m6/rust-collapse-control-01/agent.py b/corpus/m6/rust-collapse-control-01/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..b6615772c2221ab33c5c06869101e5c438b6c895 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/agent.py @@ -0,0 +1,439 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/corpus/m6/rust-collapse-control-01/commands.jsonl b/corpus/m6/rust-collapse-control-01/commands.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..0437e40fe388cb78bd703f40767c4f9f930c015c --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/commands.jsonl @@ -0,0 +1,3 @@ +{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null} +{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-2129FECA -ExpectedPages 20 -Pdf", "exit": 0, "stdout": "Read 5 sections and 20 pages.\r\n", "stderr": "", "error": null} +{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\read -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null} diff --git a/corpus/m6/rust-collapse-control-01/format-differences.json b/corpus/m6/rust-collapse-control-01/format-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/format-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/rust-collapse-control-01/geometry-differences.json b/corpus/m6/rust-collapse-control-01/geometry-differences.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/geometry-differences.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/rust-collapse-control-01/health.json b/corpus/m6/rust-collapse-control-01/health.json new file mode 100644 index 0000000000000000000000000000000000000000..6fa8df77a3d4beb1d1368b280d6904c9c22da904 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/health.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "w": 800, + "h": 600, + "hostname": "ONE-M6-2129FECA", + "ahk": "C:\\win7-agent\\vendor\\ahk\\AutoHotkey64.exe", + "python": "C:\\win7-agent\\vendor\\python\\python.exe", + "agent_sha256": "ef7ca89be026695cf4412460a2eec308b0ed253fb9245597a7fe5d6938e49f89" +} diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/Empty.one b/corpus/m6/rust-collapse-control-01/input/notebook/Empty.one new file mode 100644 index 0000000000000000000000000000000000000000..a4b1251f3d66bcd7c58bb49839082be7f8d348a5 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/Empty.one differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/Features.one b/corpus/m6/rust-collapse-control-01/input/notebook/Features.one new file mode 100644 index 0000000000000000000000000000000000000000..d7a4948ee08592152bd630dd134faa472616c15b Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/Features.one differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/Group A/Duplicate.one b/corpus/m6/rust-collapse-control-01/input/notebook/Group A/Duplicate.one new file mode 100644 index 0000000000000000000000000000000000000000..6687d7a552e7054af2dcb9e6adcd41dd158210db Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/Group A/Duplicate.one differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/Group A/Open Notebook.onetoc2 b/corpus/m6/rust-collapse-control-01/input/notebook/Group A/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..e3eb690e5b29e3c79ef46ead9727827143802024 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/Group A/Open Notebook.onetoc2 differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/Group B/Nested/Duplicate.one b/corpus/m6/rust-collapse-control-01/input/notebook/Group B/Nested/Duplicate.one new file mode 100644 index 0000000000000000000000000000000000000000..8fe7d5960c7df1b1a50bbd97fff7374dba2b64bb Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/Group B/Nested/Duplicate.one differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/Group B/Nested/Open Notebook.onetoc2 b/corpus/m6/rust-collapse-control-01/input/notebook/Group B/Nested/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..f29696488a6dffa27deb01e77fa60d41987d41d9 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/Group B/Nested/Open Notebook.onetoc2 differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/Group B/Open Notebook.onetoc2 b/corpus/m6/rust-collapse-control-01/input/notebook/Group B/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..bbb2ebe0fafacfee8a7e7e7f798012ea9eb6171b Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/Group B/Open Notebook.onetoc2 differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/Open Notebook.onetoc2 b/corpus/m6/rust-collapse-control-01/input/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..55b1d2a96ef4e952bbeb0628401b622064e4c6b0 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/Open Notebook.onetoc2 b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..308d2b40b6fb4e53a4c27657fcef9b62ee1e00b5 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/Open Notebook.onetoc2 differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/attachment.txt b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/attachment.txt new file mode 100644 index 0000000000000000000000000000000000000000..a959c053358a06abc072d3492e7a86d2e712d804 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/attachment.txt differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.bmp b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eab3975a924ce23658c2cd72ca3725b2d3ce3449 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.bmp differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.gif b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b0069028a8c88f3b11d6bd7f2a7588fa0fdfb8a Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.gif differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.jpg b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2d4cb0f5ca8f87d6ee3a740929637004f92ec63 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.jpg differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.png b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..185512b97148b00cd95c7571321a76ce80cc6205 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.png differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.tiff b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.tiff new file mode 100644 index 0000000000000000000000000000000000000000..cd2a1ff44360f3e5b281cff0a23e5f1da6a0262c Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/pattern.tiff differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/silence.wav b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/silence.wav new file mode 100644 index 0000000000000000000000000000000000000000..96260477f0ca60b1605e2971d8cdc146b8b4e02b Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/fixture-data/silence.wav differ diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/fixture.json b/corpus/m6/rust-collapse-control-01/input/notebook/fixture.json new file mode 100644 index 0000000000000000000000000000000000000000..8958eecf4411591c28ed38f148ad5f7ead182cab --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/input/notebook/fixture.json @@ -0,0 +1,86 @@ +{ + "sections": [ + "Features.one", + "Group A/Duplicate.one", + "Group B/Nested/Duplicate.one", + "Empty.one" + ], + "pages": [ + { + "section": "Features.one", + "xml": "Image png" + }, + { + "section": "Features.one", + "xml": "Image jpg" + }, + { + "section": "Features.one", + "xml": "Image bmp" + }, + { + "section": "Features.one", + "xml": "Image tiff" + }, + { + "section": "Features.one", + "xml": "Image gif" + }, + { + "section": "Features.one", + "xml": "Image role background=false, printout=falseForeground role control" + }, + { + "section": "Features.one", + "xml": "Image role background=true, printout=falseForeground role control" + }, + { + "section": "Features.one", + "xml": "Image role background=false, printout=trueForeground role control" + }, + { + "section": "Features.one", + "xml": "Image role background=true, printout=trueForeground role control" + }, + { + "section": "Features.one", + "xml": "Files and recordingRecording annotation" + }, + { + "section": "Features.one", + "xml": "Paragraph controlsInherited strike and spacingCentered paragraphمرحبا بالعالمCollapsed parentHidden child remains storedGrandchild
B        C]]>
" + }, + { + "section": "Features.one", + "xml": "Numbering controlsSequence 0, item 0Sequence 0, item 1Sequence 1, item 0Sequence 1, item 1Sequence 2, item 0Sequence 2, item 1Sequence 3, item 0Sequence 3, item 1Sequence 4, item 0Sequence 4, item 1" + }, + { + "section": "Features.one", + "xml": "Task controlsDisabled standalone task" + }, + { + "section": "Group A/Duplicate.one", + "xml": "Repeated titleGroup path Group A/Duplicate.one, level 1" + }, + { + "section": "Group A/Duplicate.one", + "xml": "Repeated titleGroup path Group A/Duplicate.one, level 2" + }, + { + "section": "Group A/Duplicate.one", + "xml": "Repeated titleGroup path Group A/Duplicate.one, level 3" + }, + { + "section": "Group B/Nested/Duplicate.one", + "xml": "Repeated titleGroup path Group B/Nested/Duplicate.one, level 1" + }, + { + "section": "Group B/Nested/Duplicate.one", + "xml": "Repeated titleGroup path Group B/Nested/Duplicate.one, level 2" + }, + { + "section": "Group B/Nested/Duplicate.one", + "xml": "Repeated titleGroup path Group B/Nested/Duplicate.one, level 3" + } + ] +} \ No newline at end of file diff --git a/corpus/m6/rust-collapse-control-01/input/notebook/synthetic.one b/corpus/m6/rust-collapse-control-01/input/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..b7614a47dce6dcb02ff9a02e06ea94e75a7ad3b1 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/input/notebook/synthetic.one differ diff --git a/corpus/m6/rust-collapse-control-01/machine.json b/corpus/m6/rust-collapse-control-01/machine.json new file mode 100644 index 0000000000000000000000000000000000000000..0bae3d8e0f20b689ec6a62a99d56e829f57bd837 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/machine.json @@ -0,0 +1 @@ +{"name": "m6-2129feca", "hostname": "ONE-M6-2129FECA"} diff --git a/corpus/m6/rust-collapse-control-01/pdf-format-checks.json b/corpus/m6/rust-collapse-control-01/pdf-format-checks.json new file mode 100644 index 0000000000000000000000000000000000000000..0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/pdf-format-checks.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/corpus/m6/rust-collapse-control-01/read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment b/corpus/m6/rust-collapse-control-01/read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment new file mode 100644 index 0000000000000000000000000000000000000000..a959c053358a06abc072d3492e7a86d2e712d804 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2.attachment differ diff --git a/corpus/m6/rust-collapse-control-01/read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment b/corpus/m6/rust-collapse-control-01/read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment new file mode 100644 index 0000000000000000000000000000000000000000..96260477f0ca60b1605e2971d8cdc146b8b4e02b Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9.attachment differ diff --git a/corpus/m6/rust-collapse-control-01/read/environment.json b/corpus/m6/rust-collapse-control-01/read/environment.json new file mode 100644 index 0000000000000000000000000000000000000000..db9c4914f892763da834db630c81d3b0a9accc1e --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/environment.json @@ -0,0 +1,7 @@ +{ + "powershell": "5.1.14409.1005", + "schema": "xs2010", + "hostname": "ONE-M6-2129FECA", + "cold": true, + "onenote": "14.0.4763.1000" +} diff --git a/corpus/m6/rust-collapse-control-01/read/hierarchy.xml b/corpus/m6/rust-collapse-control-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..95ed7414e08cb7b2187237107a440e01301ffbbe --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/page-000.pdf b/corpus/m6/rust-collapse-control-01/read/page-000.pdf new file mode 100644 index 0000000000000000000000000000000000000000..01c08429ca7082208f98c9ec183cc6746248f7cf Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-000.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-000.xml b/corpus/m6/rust-collapse-control-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..b997630c583dc37f9b591356fa59b7bd96c619a5 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-000.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/rust-collapse-control-01/read/page-001.pdf b/corpus/m6/rust-collapse-control-01/read/page-001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9e01072e8acad86e957f1773ee14b1ee33683dfe Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-001.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-001.xml b/corpus/m6/rust-collapse-control-01/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..6257860aa19a6177514b072d8ea4dcb62883ad55 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-001.xml @@ -0,0 +1,4 @@ + +Inherited strike and spacing]]>مرحبا بالعالم]]> diff --git a/corpus/m6/rust-collapse-control-01/read/page-002.pdf b/corpus/m6/rust-collapse-control-01/read/page-002.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8b9aee2c6d20097edb64185940bc7e0450a729aa Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-002.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-002.xml b/corpus/m6/rust-collapse-control-01/read/page-002.xml new file mode 100644 index 0000000000000000000000000000000000000000..c92e78c977a9825122447c932343843f304aba3b --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-002.xml @@ -0,0 +1,9 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAO +xAAADsQBlSsOGwAAARlJREFUeF7t2VFHQ2EcBvD3PWetVqvVam1ERESMiIiIiL7/J5p9gD1dvF51 +8eNcn4uf53n2P1ZLKUOpnkMCtYx0kkAt00F8gkAtsxFQBJpPAEWgxRGgCLScAopAq2NAEWhzAigC +3c0ARaD7U0AR6OEMUAR6nAOKQE/ngCLQ8wWgCLRdAIpAL5eAItDrFaAI9LYEFIHerwFFoI8bQBHo +cwUoAn3dAopA32tAEehnAygKjPu/xjyHBAY0WQDQL+0BBKhtYSVIgiSo6w+xiqmYiqnYX34J2SAb +ZINskA1qa4EESZAEdW1B15e7g9xBbf2VIAmSICPtDmprgQRJkAR1bUHXl7uD3EFt/ZUgCZIgI+0O +amuBBEnQP07QDo1OW207QPoWAAAAAElFTkSuQmCC + diff --git a/corpus/m6/rust-collapse-control-01/read/page-003.pdf b/corpus/m6/rust-collapse-control-01/read/page-003.pdf new file mode 100644 index 0000000000000000000000000000000000000000..36db4398761b941ebbf6232448a56a8f79dc6d57 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-003.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-003.xml b/corpus/m6/rust-collapse-control-01/read/page-003.xml new file mode 100644 index 0000000000000000000000000000000000000000..3438b372b58e23cab9afd7b9be51e0c843ef1ce6 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-003.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/page-004.pdf b/corpus/m6/rust-collapse-control-01/read/page-004.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f6a4b5bbd95e6efc1074c961a9918eee81d6b1d3 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-004.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-004.xml b/corpus/m6/rust-collapse-control-01/read/page-004.xml new file mode 100644 index 0000000000000000000000000000000000000000..724d9cae26b0e95065f5021654e2b79aa02c97fd --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-004.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/rust-collapse-control-01/read/page-005.pdf b/corpus/m6/rust-collapse-control-01/read/page-005.pdf new file mode 100644 index 0000000000000000000000000000000000000000..17a0890f12216e046e9c8b6bd7f05505d9cbf9dc Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-005.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-005.xml b/corpus/m6/rust-collapse-control-01/read/page-005.xml new file mode 100644 index 0000000000000000000000000000000000000000..b6f842ffaacb32319cde8c040a1462c16093049e --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-005.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/page-006.pdf b/corpus/m6/rust-collapse-control-01/read/page-006.pdf new file mode 100644 index 0000000000000000000000000000000000000000..112a980e4a5d8d280b134fef20dea457f33ac093 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-006.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-006.xml b/corpus/m6/rust-collapse-control-01/read/page-006.xml new file mode 100644 index 0000000000000000000000000000000000000000..456c152c014a60a67244aa2f7a02637e6bc314c4 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-006.xml @@ -0,0 +1,46 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAMAAADS6oI8AAADAFBMVEW4t5mrt5O4qpWrqo6euo2S +uoeZs4ieqoiSqoK4nJCrnIq4kIyrkIaen4SSn36ZmH+ekH+SkHmGuoGGs395t3pounJos3CGqnx5 +qnVtqm9iqmqGnHd5nHGGkHN5kG1on2lomGdokGS4hIirhIK4d4Srd32eh3ySh3aZgHeed3eSd3G4 +a4Cra3m4YHyrYHaea3OSa22eYG+SYGmGh3CGgG55hGloh2FogF+Gd2t5d2Rtd15id1mGa2d5a2CG +YGN5YF1ta1pia1VoYFRWumlWs2dJt2I4ulo4s1hWqmRJql09qlcyqlImulEaukshs0wKukMKs0Em +qkwaqkYPqkAEqjtWnF9JnFlWkFtJkFU4n1E4mE84kEwmn0gan0IhmEMmkEMakD0KnzoKmDgKkDVW +h1hWgFZJhFE4h0k4gEdWd1NJd0w9d0Yyd0FWa09Ja0hWYEtJYEU9a0Iyaz04YDwmh0AahzohgDsK +hzIKgDAmdzsadzUPdy8EdyomazcaazEmYDMaYC0PaysEayYKYCW4VHirVHK4R3SrR22eV2ySV2aZ +UGeeR2eSR2G4O3CrO2m4MGyrMGaeO2OSO12eMF+SMFmGV2CGUF55VFloV1FoUE+GR1t5R1RtR05i +R0mGO1d5O1CGMFN5ME1tO0piO0VoMES4JGirJGK4GGSrGF6eJ1ySJ1aZIFeeGFeSGFG4DmGrDlq4 +A12rA1eeDlSSDk6eA1CSA0qGJE95JEmGGEt5GEVoJ0FoID9oGDyGDkh5DkGGA0R5Az5tDjtiDjZo +AzVWVEdJVEE4Vzk4UDdWR0NJRzw9RzYyRzFWOz9JOzhWMDtJMDU9OzIyOy04MCwmVzAaVyohUCsK +VyIKUCAmRysaRyUPRx8ERxomOycaOyEmMCMaMB0POxsEOxYKMBVWJDdJJDFWGDNJGC04Jyk4ICc4 +GCRWDjBJDilWAyxJAyY9DiMyDh44Ax0mJyAaJxohIBsmGBsaGBUKJxIKIBAKGA0mDhgaDhImAxQa +Aw4PDgwEDgcKAwZYdbPqAAAAAWJLR0QAiAUdSAAAAAxjbVBQSkNtcDA3MTIAAAADSABzvAAABjJJ +REFUWEedkImbTgUcha9ChZl2RUKR0TKTtGiRsZUSEpI0tKm0GoW0WSOjMmNpL82oFG1apJJltNDC +KKRNURRZytZqRr9zzl2+79779Ty+9w943+ccZ7fPLvGv+N1js9jk8r7HfDFPzCRvktfIDOGEA64/ +rYD8oUCFVyhPGuAHtqRYUJq0IHFAOFBh7C4Hu/4B//4NfgO/bwGbN4JNm34FC8D7pWD+XDBv3hww +8w3w5uvgtVfBjBmvAAf+CvrL6f+HfgXo30L/RurdAP2l9M+lfs4c+t+g/3X6X6U+JiB/egH54wJ/ +xQ74bUNkAR9a8F5kQeKAaOAvUr5T7CB20Aay5WexTkBPSt8Rb4uXyUvkBfK8cCqkNxL9O3ZIbyQH +1klvxATkDwVC/p3btcAPrE8RmJ0U0IAX4wJ/+mDBdoLAeg8E1q5da/f8BGZ7IDBr1iy75y0DeqIB +U6dOtXueM5wgsM1QYKvhB0wOaE8MmBzAbkyfPl2BadOmmd2A3Qv8QRBAAXoGfiHRwLskEkDB9OGA +5H5gm/Rbt8oeDcgeDtgAg/qUAQ7YliJQVoZ7lhjJgZIS/FNcHAkUFeGfwsJC50efH8T34guPMgE5 +eNajRBSLSWQiKSImB5GA608rIH8osMZbsDppgB9YmmLBlKQFiQPCgTXGj6vBD6vA99+Bz8EXS0HZ +YrBkyWfgGfDsFFDyNCgungwmTQATx4OicaCw8EHgwL+G/tX0r6JfAfqX0r+YejdA/xT6n6Z+8mT6 +J9A/nv5x1McE5E8vIH/KQGRAzAI+9Ex0QeKAUOBb8g34mnxFPiWfgI/FIvIUeRI8IR4nD5D7yX1i +NHECfzRAvxuQXwH63YD8MQH5owEN0II9DWiAuyAxsHJl8NCKFb5/4cLIAg547LHIAj00dmx8YCXh +QysEBywkuOhDY9GiDwD9ABc9YjwsqCcYMMoYPfpe4HwrvbHckH+ZIb0Bu0G9Ib0BexAoKCiQf8yY +MdCPGkW9BaD+kiCAAvQMfESigUeJH3gIWAAF04cDkvuB5dIvWyZ7NCB7EKBegQLqUwY4YHmKQH4+ +7ulnJAdycxP8iYGcHPyTnZ3tjPQZJoaK2zzyBeSgtUeuaCGakpNIDjE5iARcf1oB+UOBEd6C4UkD +/ED/FAtaJi1IHBAOjDBGDgfDhoCh94BbwW39Qf4toF+/m0Er0LolyD0btGjRHDRtAk46EeScALKz +jwcO/CPoH07/EPoVoL8//bdQ7wbob0n/2dQ3b05/E/pPpP8E6mMC8qcXkD9lIDIgZgEfahVdkDgg +FLib3AXuJHeQm8iN4AZxPTmLnAnOEKeT48ix5BjRkDiBPxqg3w3IrwD9bkD+mID80YAGaMGeBjTA +XZAYGDw4eGjQIN/ft29kAQc0axZZoIcaN44PDCZ8aJDggL4EF11rXCPoB7joVOMUQT3BgAZGw4ZH +A+du6Y2BhvwDDOkN2IPANdIbsAeBrKws+Rs1agR9gwbUWwDq2wkCKEDPwHXED/Qhpj6N+IGTgQVQ +MH04ILkfGCj9gAGyBwHp+/SRPQhQr0AW9SkDHDAwRaBHj/hA3boJ/sRAjRr4p3r16s7VPleIy8Vl +Hj3EJS5HedQVR4oDyQGkBjE5iARcf1oB+VMF3AG9Qwt6plhQP2mBBuwfF7jKB4XeBI2eHgh0797d +HroY1PdAoE6dOnbPEQb0RAOqVatm9+xnOEGgl6FAnuEHTA5oTwyYHMBuZGZmKpCRkWF2A3YvcCVB +AAXoGbiURAP1SCSAgunDAcn9QC/p8/JkjwZkDwdsgEF9ONDN83flgkigffuki2p7/lq1Ei/6v0A3 +48quoFcXkHcRuABc2h6cL84jtUG9WuBwcRjJ3Bdk7AP2FnsRB/5u9Helvwv9CtDvBuRXgH43IP9h +9O9LvxuQPxqQP72A/DGBzp2DAZ06+f527SILOKBmzcgCDahaNT7QmfChToID2hFcdI7RVtAPcNEh +xsGCeoIBlQx7h3ST3uhoyN/BkN6APQi0ld6APQhUqVJF/sqVK0NfqZL0jgP1hQQBFKBn4FziB9oQ +Ux9K/MBBwAIomD4ckNwPdJS+QwfZg4D0bdrIHgSoV6AK9SkDHNAxzQD9sYH/AHAD8Cry1R2MAAAA +AElFTkSuQmCC + diff --git a/corpus/m6/rust-collapse-control-01/read/page-007.pdf b/corpus/m6/rust-collapse-control-01/read/page-007.pdf new file mode 100644 index 0000000000000000000000000000000000000000..99bec87303c91df48069ba3643a5cc30803565e8 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-007.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-007.xml b/corpus/m6/rust-collapse-control-01/read/page-007.xml new file mode 100644 index 0000000000000000000000000000000000000000..3602cba2b17fc84b066db38e9b27cd11b48c6d4d --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-007.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/rust-collapse-control-01/read/page-008.pdf b/corpus/m6/rust-collapse-control-01/read/page-008.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9e40276a3b30b0193f5971143535ecd66c7a8322 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-008.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-008.xml b/corpus/m6/rust-collapse-control-01/read/page-008.xml new file mode 100644 index 0000000000000000000000000000000000000000..023f53d139dcf439f2c8b00bb3611a4891c9c72f --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-008.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/page-009.pdf b/corpus/m6/rust-collapse-control-01/read/page-009.pdf new file mode 100644 index 0000000000000000000000000000000000000000..55490e5e3c7bf8a304e7fa562bc09400d734460e Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-009.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-009.xml b/corpus/m6/rust-collapse-control-01/read/page-009.xml new file mode 100644 index 0000000000000000000000000000000000000000..97dc758974b0f4ad376e99711f7412f294df33bc --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-009.xml @@ -0,0 +1,21 @@ + +/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a +HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy +MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABAAGADASIA +AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA +AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 +ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm +p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA +AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx +BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK +U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 +uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDwhYfa +plh9qsrD7VMsPtUqRFOqVVh9qmWH2qysPtUyw+1UpHbTqlZYfaplh9qsrD7VMsPtVqR206pVWGpl +h9qsrDUyw+1UpHbTqlZYalWH2q0sNSrD7VSkdtOqVlh9qmWH2qysPtUyw+1UpHdTqnHrD7VMsPtV +lYfaplh9q81SPyqnVKqw+1TLD7VZWH2qZYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adUqrDUyw+1 +WVhqZYfarUjtp1SssNSrD7VaWGpVh9qpSO2nVKyw+1TLD7VZWH2qZYfaqUjup1Tj1h9qmWH2qysP +tUyw+1eapH5VTqlVYfaplh9qsrD7VMsPtVKR206pWWH2qZYfarKw+1TLD7VSkdtOqVVhqZYfarKw +1MsPtVqR206pWWGpVh9qtLDUqw+1UpHbTqlZYfaplh9qsrD7VMsPtVKR206px6w+1TLD7VZWH2qZ +YfavNUj8rp1SqsPtUyw+1WVh9qmWH2qlI7adUrLD7VMsPtVlYfaplh9qpSO2nVKqw1MsPtVlYamW +H2q1I7adUrLDUqw+1WlhqVYfaqUjtp1SssPtUyw+1WVh9qmWH2qlI7adU//Z + diff --git a/corpus/m6/rust-collapse-control-01/read/page-010.pdf b/corpus/m6/rust-collapse-control-01/read/page-010.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fb05e37e02045073974253cc4859d427de5b8cd8 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-010.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-010.xml b/corpus/m6/rust-collapse-control-01/read/page-010.xml new file mode 100644 index 0000000000000000000000000000000000000000..67a6a557ecf8a20ee8997d60ccb88c50722d46ad --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-010.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/page-011.pdf b/corpus/m6/rust-collapse-control-01/read/page-011.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3bfe885ccc293ad7735d76c3c312c53ff8b01271 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-011.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-011.xml b/corpus/m6/rust-collapse-control-01/read/page-011.xml new file mode 100644 index 0000000000000000000000000000000000000000..c6469d4ddace2fa9991e04458ff69fd1f02e3902 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-011.xml @@ -0,0 +1,300 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAEImSURBVHheDbiBV2GL+v+/f9V1q+uk46TjpDFp +TBqDMUhoh3Zoh3Zoh3Zoh3YYgzE0Jo1J46TjpOOk61Yf32pZ1bKqZVXLqpZV/W2/8y8863nez/v1 +AgAAaAL+vxagiQQ0twIt7cC/yACpA/h3J9BKBdq6gPZu4D90gNwD/NQLdDABSh/Q2Q/8zAaoA8Av +g0AXF6DxgG4B8KsQoIuA3yRAjxRgyIBeBfACBJhK4KUa6IMAlgbo1wGvYICtB14bgQEE4JiAQQvw +BgW4VuCtHeBhAN8BCFzAOxwQuoH3XkBEAGIfIAkAQ0FAGgKGI4AsCshjgGIFGEkA4CowugYoU4Bq +HVBvAGMZANoExrcATQ7QbgO6HWCiAMC7wOQeoC8Bhn3AeAhMlQHkCJg+AUwVwHwKWM6BmSqAXgCz +V4C1BtiuAfstMFcHsDtg/gFwNADnI+B6BhYAoPn/a2puamluJjW3tDb/q72ZRG7+d0dza2dzG7W5 +vav5P93NZHrzTz3NHb3NFGZzZ1/zz/3NVHbzLwPNXYPNNG5zN6/5V0EzXdj8m6i5R9LMkDb3yppf +KJqZYPNLZXOfupkFNfdrml/pmtlw82t984CxmYM0D5qa31iauWjzW2szz97Mx5oFjuZ3rmYh3vze +3SzyNouJZomveSjQLA02D4eaZZFmebRZEWseWWkGE82jq83KtWZVqlm93jy20Qxlmsc3mzVbzdpc +s267eWKnGS40T+426/eaDaVm437z1GEzUm6ePmo2nTSbK82W0+aZ82a02jx70Wy9arbVmu3XzXO3 +zVi9ef6u2fHQ7Gw0ux6bF56bcQAgNTX9MxtSC4n0r1YSqZ30bzKptYPU1klqp5L+00Uid5N+opM6 +ekiUXlInk/RzH4naT/qFTeoaINEGSd1c0q88El1A+k1I6hGRGBJSr5T0QkZiKkgvQVKfksRSk/oh +0isNia0jvYZJA3oSx0gaREhvTCSuhfQWJfGsJL6dJMBI7xwkoYv0HieJ3CSxlyQhSEM+kjRAGg6S +ZCGSPEJSREkjMRK4QhpNkJSrJNUaSZ0ija2ToA3SeIak2SRpt0i6HGlimwTvkCYLJP0uybBHMpZI +U/sk5JA0XSaZjkjmE5KlQpo5JaHnpNkqyXpBsl2R7DXS3DUJuyXN10mOO5LzgeRqkBYeSfgzaREA +2pqb2lpa2v5FaiO1tv27va2V3NbW0dbe2fYfahu5q+2n7rYOehulp62zt+1nZhu1r+2X/rYudhtt +oK17sO1Xbhud1/aboK1H2MYQtfVK2l5I25iytpeKtj6wjaVs61e3vYLa2Jq217q2AbiNo28bNLa9 +Qdq4pra3ljYe2sa3tgnsbe+wNqGj7b2rTYS3id1tEm/bENEm9bUNB9pkwTZ5qE0RaRuJtoGxttGV +NmWiTbXapl5rG0u1Qett4xttmkybdrNNt9U2kWuDt9smd9r0hTbDbptxr22q1Ibst00ftpnKbeaj +NstJ20ylDT1tmz1vs1bbbBdt9qu2uVobdt02f9vmqLc579pcD20LjTb8sW3xuc0NAOSWJvK/Wsgk +EvnfreTWdnIbmdzeQf5PJ5lMJf/URe7oJlPo5M4e8s+9ZCqT/EsfuaufTGOTuwfIvw6S6Vzybzxy +j4DMEJJ7ReQXEjJTSn4pI/cpyCyQ3K8kv1KT2RD5tYY8oCNzYPKgnvzGSOYi5LcmMs9C5qNkgZX8 +zk4WYuT3DrLIRRbjZImbPOQlSwnysI8sC5DlQbIiRB6JkMEoeTRGVq6QVQmyepU8tkaGUuTxdbJm +g6zNkHWb5IktMpwjT26T9TtkQ4Fs3CVP7ZGREnl6n2w6JJvLZMsReeaEjFbIs6dk6znZViXbL8hz +V2SsRp6/Jjtuyc462XVHXngg4w3y4iPZ/Uz2AADlX00UUgvl3yRKayulrZ3STqb8p4NC7qT8RKV0 +dFEo3ZROOuXnHgq1l/ILk9LVR6H1U7rZlF8HKPRBym9cSg+PwhBQeoWUFyIKU0J5KaX0ySgsBaUf +pLxSUthqymuIMqChcHSUQZjyRk/hGilvEQrPROFbKAKU8s5KEdop7zGKyEERuygSnDLkpki9lGGC +IvNR5AGKIkgZCVHACGU0SlHGKKoVijpBGVulQGuU8RRFs07RblB0GcrEJgXeokzmKPptimGHYixQ +pnYpyB5lukQx7VPMhxRLmTJzREFPKLMVivWUYjun2KuUuQsKdkWZr1Ec1xTnLcVVpyzcUfAHymKD +4n6keJ4pXgCgkpqo/26htpKoba3U9nbqf/7ZnA7qT53UDiqV0kXt7Kb+TKdSe6i/9FK7mFRaH7W7 +n/orm0ofoP42SO3hUhk8aq+A+kJIZYqoLyXUPimVJaP2K6ivQCpbSX2tpg5AVI6GOqijvoGpXD31 +rZHKQ6h8E1Vgob5DqUIr9b2dKsKoYgdV4qIO4VSpmzrspcoIqtxHVQSoI0EqGKKORqjKKFUVo6pX +qGMJKrRKHV+jalJU7TpVt0GdyFDhTerkFlWfoxq2qcYd6lSBiuxSp/eophLVvE+1HFJnylT0iDp7 +QrVWqLZTqv2cOlelYhfU+Suqo0Z1XlNdt9SFOhW/oy4+UN0NqueR6n2mLgEA7d9NtNYWWhuJ1t5K ++087jUym/dRB6+ikUai0zi7az900Kp32Sw+tq5dGY9K6+2i/9tPobNpvA7SeQRqDS+vl0V4IaEwh +7aWI1iehsaS0fhntlYLGBmmvlbQBNY0D0QY1tDc6GhemvdXTeEYaH6EJTLR3FpoQpb230kR2mhij +SRy0IRdNitOG3TSZlyYnaAofbSRAA4O00RBNGaGpojR1jDa2QoMStPFVmmaNpk3RdOu0iQ0anKFN +btL0WzRDjmbcpk3t0JACbXqXZtqjmUs0yz5t5pCGlmmzRzTrCc1WodlPaXPnNKxKm7+gOa5ozhrN +dU1buKXhddriHc39QPM0aN5H2tIzjQAAemsTva2F3k6i/6eVTm6n/0Smd3TQ/7mrTir95y46tZv+ +C53e1UOn9dK7mfRf++j0fvpvbHrPAJ0xSO/l0l/w6EwB/aWQ3ieisyT0fin9lYzOVtBfg/QBJZ2j +pg9C9DcaOldHfwvTeXo630gXIPR3JrrQQn+P0kVWuthOl2D0IQdd6qIP43SZmy730hUEfcRHBwP0 +0SBdGaKrInR1lD4Wo0Mr9PEEXbNK167RdSn6xDod3qBPZuj6Tbphi27M0ae26cgOfbpAN+3SzXt0 +S4k+s09HD+mzZbr1iG47odsr9LlTOnZOn6/SHRd05xXdVaMvXNPxW/pine6+o3se6N4GfemRTjzT +lwGA0dbEaG9h/IfEILcyfmpndJAZlA5GZyfjZyqD2sX4pZvRRWfQehjdvYxfmQx6H+O3fkYPm8EY +YPQOMl5wGUwe46WA0SdksESMfgnjlZTBljFeKxgDIIOjZAyqGW8gBlfDeKtj8GAGX88QGBnvEIbQ +xHhvYYhQhtjKkNgZQxhD6mAMuxgynCF3MxRexgjBAH2M0QBDGWSoQgx1hDEWZUAxxvgKQ5NgaFcZ +ujXGRIoBrzMmNxj6DMOwyTBuMaZyDGSbMb3DMBUY5l2GZY8xU2Kg+4zZQ4a1zLAdMewnjLkKAztl +zJ8zHFWG84LhumIs1Bj4NWPxluGuMzx3DO8DY6nBIB4Zy88MHwAw25uY/2lhkknMn1qZHe1MCpnZ +2cH8uZNJpTJ/6WJ2dTNpdGZ3D/PXXiadyfytj9nTz2Swmb0DzBeDTCaX+ZLH7BMwWUJmv4j5SsJk +S5mvZcwBBZMDMgeVzDdqJhdivtUweTomH2YK9Mx3RqYQYb43MUUWphhlSqzMITtTijGHHUyZiynH +mQo3c8TLBAnmqI+pDDBVQaY6xByLMKEoczzG1KwwtQmmbpU5scaEU8zJdaZ+g2nIMI2bzKktJpJj +Tm8zTTtMc4Fp2WXO7DHREnN2n2k9ZNrKTPsRc+6EiVWY86dMxznTWWW6LpgLV0y8xly8ZrpvmZ46 +03vHXHpgEg3m8iPT98z0AwDrP00scgvrJxKro5VFaWd1klk/d7ConaxfqKyuLhatm9VNZ/3aw6L3 +sn5jsnr6WIx+Vi+b9WKAxRxkveSy+ngsloDVL2S9ErHYEtZrKWtAxuIoWIMg642SxVWz3kIsnobF +17EEMOudniU0st4jLJGJJbawJChryMqS2lnDGEvmYMldLAXOGnGzQC9rlGApfSxVgKUOssZCLCjC +Go+yNDGWdoWlS7AmVlnwGmsyxdKvswwbLGOGNbXJQrZY0zmWaZtl3mFZCqyZXRa6x5otsaz7LNsh +y15mzR2xsBPWfIXlOGU5z1muKmvhgoVfsRZrLPc1y3PL8tZZS3cs4oG13GD5Hln+Z1YAANjkJvZP +LewOEpvSyu5sZ/9MZlM72L90sruobFoXu7ub/Sv9n8hh/9bL7mGyGX3s3n72CzabOcB+Ocju47JZ +PHa/gP1KyGaL2K8l7AEpmyNjDyrYb0A2V8l+q2bzIDZfwxbo2O9gtlDPfm9kixC22MSWWNhDKFtq +ZQ/b2TKMLXewFS72CM4G3exRL1tJsFU+tjrAHguyoRB7PMLWRNnaGFu3wp5IsOFV9uQaW59iG9bZ +xg32VIaNbLKnt9imHNu8zbbssGcKbHSXPbvHtpbYtn22/ZA9V2ZjR+z5E7ajwnaesl3n7IUqG79g +L16x3TW255rtvWUv1dnEHXv5ge1rsP2P7MAz+wMAcH5q4nS0cCgkTmcr5+d2DpXM+aWD09XJoVE5 +3V2cX7s5dDrntx5OTy+HweT09nFe9HOYbM7LAU7fIIfF5fTzOK8EHLaQ81rEGZBwOFLOoIzzRsHh +gpy3Sg5PzeFDHIGG807HEcKc93qOyMgRIxyJiTNk4UhRzrCVI7Nz5BhH4eCMuDggzhl1c5Rejorg +qH2csQAHCnLGQxxNhKONcnQxzsQKB05wJlc5+jWOIcUxrnOmNjhIhjO9yTFtccw5jmWbM7PDQQuc +2V2OdY9jK3Hs+5y5Qw5W5swfcRwnHGeF4zrlLJxz8Cpn8YLjvuJ4ahzvNWfplkPUOct3HN8Dx9/g +BB45H545QQDgdjRxKS3cThL351YutZ37C5nb1cGldXK7qdxfu7j0bu5vdG5PD5fRy+1lcl/0cZn9 +3Jdsbt8AlzXI7edyX/G4bAH3tZA7IOJyJNxBKfeNjMtVcN+CXJ6Sy1dzBRD3nYYr1HHfw1yRnis2 +ciUId8jElVq4wyhXZuXK7VwFxh1xcEEXdxTnKt1clZerJrhjPi4U4I4HuZoQVxvh6qLciRgXXuFO +Jrj6Va5hjWtMcafWucgGdzrDNW1yzVtcS447s81Fd7izBa51l2vb49pL3Ll9LnbInS9zHUdc5wnX +VeEunHLxc+5ileu+4HquuN4ad+maS9xyl+tc3x3X/8ANNLgfHrnBZ+5HAOBTmvidLfyfSXxqK/+X +dn4XmU/r4Hd38n+l8uld/N+6+T10PqOH39vLf8HkM/v4L/v5fWw+a4DfP8h/xeWzefzXAv6AkM8R +8Qcl/DdSPlfGf6vg80A+X8kXqPnvIL5Qw3+v44tgvljPlxj5QwhfauIPW/gylC+38hV2/gjGBx38 +URdfifNVbr7ayx8j+JCPPx7ga4J8bYivi/Anonw4xp9c4esTfMMq37jGn0rxkXX+9AbflOGbN/mW +Lf5Mjo9u82d3+NYC37bLt+/x50p8bJ8/f8h3lPnOI77rhL9Q4eOn/MVzvrvK91zwvVf8pRqfuOYv +3/J9db7/jh944H9o8IOP/I/P/BAACDubhD+3CKkk4S+twq52IY0s7O4Q/toppFOFv3UJe7qFDLqw +t0f4olfIZApf9gn7/glktrB/QPhqUMjmCl/zhAMCIUcoHBQJ30iEXKnwrUzIUwj5oFCgFL5TC4WQ +8L1GKNIJxbBQohcOGYVSRDhsEsosQjkqVFiFI3YhiAlHHUKlS6jChWq3cMwrhAjhuE+oCQi1QaEu +JJyICOGocDIm1K8IDQmhcVU4tSZEUsLpdaFpQ2jOCC2bwpktIZoTzm4LrTtCW0Fo3xXO7QmxknB+ +X+g4FDrLQteRcOFEiFeEi6dC97nQUxV6L4RLV0KiJly+Fvpuhf66MHAn/PAgDDaEHx+FoWdhGADE +PzeJqS3iX0jirlYxrV3cTRb/2iGmd4p/o4p7usSMbnEvXfyiR8zsFb9kivv6xKx+cT9b/GpAzB4U +v+aKB3hijkA8KBS/EYm5EvFbqZgnE/MVYgEofqcUC9Xi95BYpBGLdWIJLB7Si6VG8TAilpnEcotY +gYpHrGLQLh7FxEqHWOUSq3HxmFsMecXjhFjjE2sDYl1QPBESwxHxZFSsj4kNK2JjQjy1KkbWxNMp +sWldbN4QWzLimU0xuiWezYmt22LbjtheEM/tirE98XxJ7NgXOw/FrrJ44UiMn4gXK2L3qdhzLvZW +xUsXYuJKvFwT+67F/ltxoC7+cCcOPog/NsShR3H4WRwBACm1SfpLi7SLJKW1Srvbpb+SpfQO6W+d +0h6qlNEl7e2WvqBLmT3Sl73SPqaU1Sft75e+Ykv/eVevB6UDXCmHJx0USN8IpVyR9K1EypNK+TKp +QCF9B0qFSul7tVQEScUaqUQnHYKlUr102CiVIVK5SaqwSEdQKWiVjtqlSkyqckjVLukYLoXc0nGv +VENItT6pLiCdCErhkHQyItVHpYaY1LginUpIkVXp9JrUlJKa16WWDelMRopuSme3pNac1LYtte9I +5wpSbFc6vyd1lKTOfanrULpQluJH0sUTqbsi9ZxKvefSpaqUuJAuX0l9Nan/Whq4lX6oS4N30o8P +0lBDGn6URp6lnwBA/kuTvKtFTiPJu1vlv7bL6WT5bx3ynk45gyrv7ZK/6JYz6fKXPfK+XjmLKe/v +k7/ql7PZ8tcD8oFBOYcrH+TJ3wjkXKH8rUjOk8j5UrlAJn+nkAtB+XulXKSWiyG5RCMf0smlsHxY +L5cZ5XJErjDJRyxyEJWPWuVKu1yFydUO+ZhLDuHycbdc45VrCbnOJ58IyOGgfDIk10fkhqjcGJNP +rciRhHx6VW5ak5tTcsu6fGZDjmbks5ty65bclpPbt+VzO3KsIJ/flTv25M6S3LUvXziU42X54pHc +fSL3VOTeU/nSuZyoypcv5L4rub8mD1zLP9zKg3X5xzt56EEebsgjj/JPz/IoAIBdTSCtBewmgb+2 +gvR28Dcy2NMBMjrBXir4ogtkdoMv6WBfD8jqBfuZ4Ks+kN0PvmaDAwMgZxAc5IJveCBXAL4VgjwR +yJeAAin4TgYKFeB7EBQpQbEalEDgkAaU6sBhGJTpQbkRVCDgiAkELeAoCiqtoMoOqjFwzAFCLnAc +BzVuUOsFdQQ44QPhADgZBPUh0BABjVFwKgYiK+B0AjStguY10JICZ9ZBdAOczYDWTdC2Bdpz4Nw2 +iO2A8wXQsQs690BXCVzYB/FDcLEMuo9AzwnorYBLpyBxDi5XQd8F6L8CAzXwwzUYvAU/1sHQHRh+ +ACMN8NMjGH0GPwOAitak6m5R/UpS0VtVv7WresgqRoeqt1P1gqpidqledqv66CpWj6q/V/WKqWL3 +qV73qwbYKs6AanBQ9Yar4vJUbwUqnlDFF6kEEtU7qUooU71XqESgSqxUSdSqIUgl1aiGdSoZrJLr +VQqjagRRgSbVqEWlRFUqq0ptV41hKsihGnepNLhK61bpvKoJQgX7VJMBlT6oMoRUxohqKqpCYqrp +FZUpoTKvqixrqpmUCl1XzW6orBmVbVNl31LN5VTYtmp+R+UoqJy7KteeaqGkwvdVi4cqd1nlOVJ5 +T1RLFRVxqlo+V/mqKv+FKnCl+lBTBa9VH29VoboqfKeKPKg+NVTRR9XnZ1UMAKDuJujXFohOgn5r +hXraIQYZ6u2AXnRCTCr0sgvq64ZYdKi/B3rVC7GZ0Os+aKAf4rChwQHozSDE5UJveRBP8M8nhwQi +6J0EEkqh9zJIpIDEICRRQkNqSApBwxpIpoPkMKTQQyNGCESgUROktEAqFFJboTE7BGHQuAPSuCAt +Dunc0IQXgglo0gfpA5AhCBlD0FQEQqLQdAwyrUDmBGRZhWbWIDQFza5D1g3IloHsm9DcFoTloPlt +yLEDOQuQaxda2IPwErS4D7kPIU8Z8h5BSycQUYGWTyHfOeSvQoEL6MMVFKxBH6+h0C0UrkORO+jT +AxRtQJ8fodgzFAcA7a9NWnqL9jeStqdVy2jX9pK1Lzq0zE7tS6q2r0vL6tb207WverTsXu1rpnag +T8vp1w6ytW8GtNxB7VuulsfT8gVagVD7TqQVSrTvpVqRTCtWaCWgdkiplaq1w5BWptHKdVoFrB3R +a0GjdhTRKk1alUWrRrVjVi1k145jWo1Dq3Vpdbh2wq2FvdpJQqv3aQ0BrTGonQppkYh2Oqo1xbTm +Fa0loZ1Z1aJr2tmU1rqutW1o7Rnt3KYW29LO57SOba1zR+sqaBd2tfiedrGkde9rPYdab1m7dKQl +TrTLFa3vVOs/1waq2g8X2uCV9mNNG7rWhm+1kbr20502+qD93NDGHrXxZ+0KAMD0Jvi3FriHBDNa +4d52+AUZZnbALzvhPirM6oL7u+FXdJjdA7/uhQeYMKcPHuyH37Bh7gD8dhDmcWE+DxYI4HdCWCiC +30tgkRQWy2CJAh4CYakSHlbDMgiWa2CFDh6BYVAPjxphJQKrTLDaAo+hMGSFx+2wBoO1Dljngidw +GHbDk15YT8AGH2wMwFNBGAnB0xHYFIXNMdiyAs8kYHQVnl2DrSnYtg7bN+C5DIxtwvNbsCMHO7dh +1w68UIDxXXhxD3aXYM8+7D2El8owcQQvn8C+Cuw/hQPn8IcqHLyAP17BoRocvoYjt/CnOhy9gz8/ +wLEGHH+EV57hLwBg+K3J0NNiYJAMva2GF+0GJtnwssPQ12lgUQ39XYZX3QY23fC6xzDQa+AwDYN9 +hjf9Bi7b8HbAwBs08LkGAc/wTmAQCg3vRQaRxCCWGiQyw5DCIAUNw0qDTG2QQwaFxjCiM4CwYVRv +UBoNKsSgNhnGLAYINYxbDRq7QYsZdA7DhMsA44ZJt0HvNRgIg9FnmAoYkKBhOmQwRQzmqMESM8ys +GNCEYXbVYF0z2FIG+7phbsOAZQzzmwbHlsGZM7i2DQs7BrxgWNw1uPcMnpLBu29YOjQQZcPykcF3 +YvBXDIFTw4dzQ7Bq+HhhCF0ZwjVD5Nrw6dYQrRs+3xliD4Z4w7DyaPjybEgAANLThDBakF4S8qIV +YbYjL8lIXwfC6kT6qcirLoTdjbymIwM9CKcXGWQib/oQbj/ylo3wBhD+ICLgIu94iFCAvBciIhEi +liASKTL0T89RIMMgIlMicjWigJARDQLqkFEYUeoRlRFRI8iYCYEsyDiKaKyI1o7oMGTCgcAuZBJH +9G7E4EWMBDLlQ5AAMh1ETCHEHEEsUWQmhqAryGwCsa4itjXEnkLm1hFsA5nPII5NxLmFuHLIwjaC +7yCLBcS9i3j2EG8JWdpHiENkuYz4jhD/CRKoIB9OkeA58rGKhC6Q8BUSqSGfrpHoLfK5jsTukPgD +stJAvjwiiWfkKwCYGU3m3hbzC5KZ2Wp+2W7uI5tZHeb+TvMrqpndZX7dbR6gmzk95sFe8xummdtn +fttv5rHN/AGzYND8jmsW8szvBWaR0CwWmSUS85DULJWZhxVmGWiWK80KtXkEMoMa86jOrITNKr1Z +bTSPIWbIZB63mDWoWWs16+zmCcwMO8yTLrMeNxvcZqPXPEWYEZ95OmA2Bc3mkNkSMc9EzWjMPLti +tibMtlWzfc08lzJj6+b5DbMjY3Zuml1b5oWcGd82L+6Y3QWzZ9fs3TMvlczEvnn50Owrm/1H5sCJ ++UPFHDw1fzw3h6rm8IU5cmX+VDNHr82fb82xujl+Z155MH9pmBOP5q/P5lUAQHub0BctKJOEvmxF ++9pRFhnt70BfdaJsKvq6Cx3oRjl0dLAHfdOLcpno2z6U14/y2ahgAH03iAq56HseKhKgYiEqEaFD +ElQqRYdlqEyB/tMCFUp0RI2CEDqqQZU6VAWjaj06ZkQhBB03oRoLqkVRnRWdsKMwhk46UL0LNeCo +0Y1OeVGEQKd9qCmAmoOoJYTORFA0is7GUOsKakug9lV0bg3FUuj8OurYQJ0Z1LWJLmyheA5d3Ebd +O6ingHp30aU9lCihy/uo7xD1l9HAEfrhBA1W0I+naOgcDVfRyAX66QqN1tDP12jsFo3X0ZU79MsD +mmigXx/R1Wc0CQC2F002ZovtJcnW12pjtdv6ybZXHTZ2p+011TbQZeN02wbptjc9Nm6v7S3Txuuz +8fttArbt3YBNOGh7z7WJeDaxwCYR2oZENqnENiy1yWQ2ucKmAG0jShuoto1CNqXGptLZ1LBtTG+D +jLZxxKYx2bQWmw61TVhtsN02idn0DpvBZTPitim3DfHapgmbyWczB2yWoG0mZEMjttmozRqz2VZs +9oRtbtWGrdnmUzbHus25YXNlbAubNnzLtpizubdtnh2bt2Bb2rURe7blks23b/Mf2gJl24cjW/DE +9rFiC53awue2SNX26cIWvbJ9rtli17b4rW2lbvtyZ0s82L42bKuPtuSzbQ0AMGYT9rIF6yNhrFas +vx17RcbYHdjrTmyAinG6sMFu7A0d4/Zgb3sxHhPj92GCfuwdGxMOYO8HMREXE/MwiQAbEmJSETYs +wWRSTC7DFApsBMRAJTaqxpQQptJgah02BmOQHhs3YhoE05ownQWbQDHYik3aMT2GGRyY0YVN4Rji +xqa9mInAzD7MEsBmghgawmYjmDWK2WKYfQWbS2DYKja/hjlSmHMdc21gCxkM38QWtzB3DvNsY94d +bKmAEbvY8h7mK2H+fSxwiH0oY8Ej7OMJFqpg4VMsco59qmLRC+zzFRarYfFrbOUW+1LHEnfY1wds +tYElH7G1Z+wbADhfNjn7WpwskrO/1fmq3ckmO193OAc6nRyqc7DL+abbyaU73/Y4eb1OPtMp6HO+ +63cK2c73A07RoFPMdUp4ziGBUyp0DoucMolTLnUqZM4RhRMEnaNKp1LtVEFOtcY5pnNCsHNc79QY +nVrEqTM5JyxOGHVOWp16u9OAOY0O55TLieDOabfT5HWaCafF55wJONGgczbktEactqjTHnPOrTix +hHN+1elYczpTTte6c2HDiWeci5tO95bTk3N6t51LO06i4Fzedfr2nP6SM7Dv/HDoDJadH4+coRNn +uOKMnDo/nTujVefnC2fsyhmvOVeunV9unYm68+udc/XBmWw41x6d356dKQDA+5pwVgveT8JfteLs +dvw1GR/owDmd+CAVf9OFc7vxt3Sc14Pze3EBE3/Xhwv78fdsXDSAiwdxCRcf4uFSAT4sxGUiXC7B +FVJ8RIaDCnwUxJVKXKXG1RA+pvmnIOPjMK7R41ojrkPwCRMOW/BJFNdbcYMdN2L4lANHXPg0jpvc +uNmLWwh8xoejAXw2iFtDuC2C26P4XAzHVvD5BO5YxZ1ruCuFL6zj+Aa+mMHdm7hnC/fm8KVtnNjB +lwu4bxf37+GBEv5hHw8e4h/LeOgID5/gkQr+6RSPnuOfq3jsAo9f4Ss1/Ms1nrjFv9bx1Ts8+YCv +NfBvj3jqGf8OAB5Wk6e/xfOK5GG3el63ewbIHk6HZ7DT84bq4XZ53nZ7eHQPv8cj6PW8Y3qEfZ73 +/R4R2yMe8EgGPUNcj5TnGRZ4ZEKPXORRSDwjUg8o84wqPErQo1J61GrPGOSBNJ5xnUcDe7R6j87o +mUA8sMkzafHoUY/B6jHaPVOYB3F4pl0eE+4xuz0Wr2eG8KA+z2zAYw16bCGPPeKZi3qwmGd+xeNI +eJyrHteaZyHlwdc9ixsed8bj2fR4tzxLOQ+x7Vne8fgKHv+uJ7Dn+VDyBPc9Hw89obInfOSJnHg+ +VTzRU8/nc0+s6olfeFauPF9qnsS15+utZ7XuSd551h483xqe1KPn+7NnHQCI/ibiVQvBJhGvW4mB +doJDJgY7iDedBJdKvO0ieN0En04Ieoh3vYSQSbzvI0T9hJhNSAaIoUFCyiWGeYRMQMiFhEJEjEgI +UEqMygilglCBhFpJjKkJCCLGNYRGR2hhQqcnJowEjBCTJkJvIQwoYbQSU3YCwYhpB2FyEWacsLiJ +GS+BEsSsj7AGCFuQsIeIuQiBRYn5GOFYIZwJwrVKLKwReIpYXCfcG4QnQ3g3iaUtgsgRy9uEb4fw +F4jALvFhjwiWiI/7ROiQCJeJyBHx6YSIVojPp0TsnIhXiZUL4ssVkagRX6+J1VsiWSfW7ohvD0Sq +QXx/JNafiTQA+F81+dkt/tck/0Crn9PuHyT733T4uZ3+t1Q/r8vP7/YL6P53PX5hr/890y/q84v7 +/RK2f2jALx30D3P9Mp5fLvArhP4RkR+U+EelfqXMr1L41aB/TOmH1P5xyK/R+LU6vw72T+j9sNE/ +ifj1Jr/B4jei/imrH7H7pzG/yeE3u/wW3D/j9qNe/yzht/r8toDfHvTPhfxYxD8f9TtifueK35Xw +L6z68TX/YsrvXvd7NvzejH9p009s+Zdzft+237/jDxT8H3b9wT3/x5I/tO8PH/ojZf+nI3/0xP+5 +4o+d+uPn/pWq/8uFP3Hl/1rzr177k7f+tbr/250/9eD/3vCvP/rTz/4NAAiym4KvW4IDpCCnNTjY +HnxDDnI7gm87gzxqkN8VFHQH39GDwp7g+96giBkU9wUl/cEhdlA6EBweDMq4QTkvqBAER4RBUBQc +lQSV0qBKFlQrgmNgEFIGx9VBDRTUaoI6XXACDsL64KQxqP8HH0xBoyU4hQYRa3DaHjRhQbMjaHEF +Z/Ag6g7OeoNWImjzBe2B4FwwiIWC85GgIxp0xoKuleBCIoivBhfXgu5U0LMe9G4ElzJBYjO4vBX0 +5YL+7WBgJ/ihEAzuBj/uBUOlYHg/GDkMfioHo0fBzyfBWCUYPw2unAe/VIOJi+DXq+BqLZi8Dq7d +Br/Vg6m74PeH4HojmH4MbjwHfwBA+HVTeKAlzCGFB1vDb9rDXHL4bUeY1xnmU8OCrvC77rCQHn7f +Exb1hsXMsKQvPNQflrLDwwNh2WBYzg0reOERQRgUhkdFYaUkrJKG1bLwmCIMgeFxZVijDmuhsE4T +ntCFYTg8qQ/rjWEDEjaawlOWMIKGp61hkz1sxsIWR3jGFUbx8Kw7bPWGbUTY7gvPBcJYMDwfCjsi +YWc07IqFF1bCeCK8uBp2r4U9qbB3Pby0ESYy4eXNsG8r7M+FA9vhDzvhYCH8cTcc2guHS+HIfvjT +YThaDn8+CsdOwvFKeOU0/OU8nKiGv16EV6/CyVp47Tr87Tacqoe/34XXH8LpRnjjMfzjOZwBgOhA +U5TTEh0kRd+0Rrnt0bfkKK8jyu+MCqjRd11RYXf0PT0q6omKe6MSZnSoLyrtjw6zo7KBqHwwquBG +R3hRUBAdFUaVoqhKElVLo2OyKKSIjoNRjTKqVUd1UHRCE4V10Uk4qtdHDcaoEYlOmaL/wNU0GjVZ +o2Z71IJFZxxR1BWdxaNWd9TmjdqJ6JwvigWi88GoIxR1RqKuaHQhFsVXoouJqHs16lmLelPRpfUo +sRFdzkR9m1H/VjSQi37YjgZ3oh8L0dBuNLwXjZSin/aj0cPo53I0dhSNn0RXKtEvp9HEefRrNbp6 +EU1eRddq0W/X0dRt9Hs9un4XTT9ENxrRH4/RzHP0dwCIc5rigy3xN6Q4tzX+tj3OI8f5HXFBZ/wd +NS7sir/vjovocXFPXNIbH2LGpX3x4f64jB2XD8QVg/ERbhzkxUcFcaUwrhLF1ZL4mDQOyeLjirgG +jGuVcZ06PgHFYU18UhfXw3GDPm40xqeQOGKKT1viJjRutsYt9vgMFkcd8VlX3IrHbe643RufI+KY +Lz4fiDuCcWco7orEF6JxPBZfXIm7E3HPaty7Fl9KxYn1+PJG3JeJ+zfjga34h1w8uB3/uBMPFeLh +3XhkL/6pFI/uxz8fxmPlePwovnIS/1KJJ07jX8/jq9V48iK+dhX/VounruPfb+Pr9Xj6Lr7xEP/R +iGce478/xzcBIDHYlHjTkuCSEm9bE7z2BJ+cEHQk3nUmhNTE+66EqDshpickPYmh3oSUmRjuS8j6 +E3J2QjGQGBlMgNzEKC+hFCRUwoRalBiTJCBpYlyW0CgSWjChUyYm1AkYSkxqEnpdwgAnjPrElDGB +IIlpU8JkSZjRhMWamLEnUCwx60hYXQkbnrC7E3PeBEYk5n0JRyDhDCZcocRCJIFHE4uxhHsl4Ukk +vKuJpbUEkUosryd8Gwl/JhHYTHzYSgRziY/bidBOIlxIRHYTn/YS0VLi834idpiIlxMrR4kvJ4lE +JfH1NLF6nkhWE2sXiW9XiVQt8f06sX6bSNcTG3eJHw+JTCPx+2Ni8zmRBYDkm6YktyX5lpTktSb5 +7UkBOfmuIynsTL6nJkVdSXF3UkJPDvUkpb3JYWZS1peU9ycV7OTIQBIcTI5yk0peUiVIqoXJMVES +kiTHpUmNLKlVJHVgckKZhNXJSSip1yQNuqQRTk7pk4gxOY0kTaak2ZK0oMkZaxK1J2expNWRtLmS +djw5505i3uQ8kXT4ks5A0hVMLoSSeCS5GE26Y0nPStKbSC6tJom15HIq6VtP+jeSgUzyw2YyuJX8 +mEuGtpPhnWSkkPy0m4zuJT+XkrH9ZPwwuVJOfjlKJk6SXyvJ1dNk8jy5Vk1+u0imrpLfa8n162T6 +NrlRT/64S2Yekr83kpuPyexzcgsAUtym1NuWFI+U4remBO2pd+SUsCP1vjMloqbEXSlJd2qInpL2 +pIZ7UzJmSt6XUvSnRtgpcCA1OphSclMqXkotSI0JU5AoNS5JaaQprSylU6QmwBSsTE2qU3ooZdCk +jLrUFJxC9KlpY8qEpMymlMWSmkFTqDU1a09ZsX+4M2V3pebwFOZOzXtTDiLl9KVcgdRCMIWHUouR +lDua8sRS3pXUUiJFrKaW11K+VMq/ngpspD5kUsHN1MetVCiXCm+nIjupT4VUdDf1eS8VK6Xi+6mV +w9SXcipxlPp6klqtpJKnqbXz1LdqKnWR+n6VWq+l0tepjdvUj3oqc5f6/SG12UhlH1Nbz6k/ACD9 +tinNa0nzSWlBa/pde1pITr/vSIs602JqWtKVHupOS+np4Z60rDctZ6YVfemR/jTITo8OpJWDaRU3 +realxwRpSJgeF6U1krRWmtbJ0hOKNAymJ5VpvTptgNJGTXpKl0bg9LQ+bTKmzUjaYkrPWNIomp61 +pq32tA1L2x3pOVcaw9Pz7rTDm3YSaZcvvRBI48H0YijtjqQ90bQ3ll5aSROJ9PJq2reW9qfSgfX0 +h410MJP+uJkObaXDuXRkO/1pJx0tpD/vpmN76XgpvbKf/nKYTpTTX4/SqyfpZCW9dpr+dp5OVdPf +L9LrV+l0Lb1xnf5xm87U07/fpTcf0tlGeusx/cdzOgcAGV5Tht+SEZAy71ozwvbMe3JG1JERd2Yk +1MxQV0banRmmZ2Q9GXlvRsHMjPRlwP7MKDujHMioBjNqbmaMl4EEmXFhRiPKaCUZnTQzIcvAiswk +mNErMwZ1xghlpjQZRJeZhjMmfcZszFiQzIwpg1oys2jGas3Y7Bk7lplzZDBXZh7PONwZpzfjIjIL +vgweyCwGM+5QxhPJeKOZpViGWMksJzK+1Yx/LRNIZT6sZ4IbmY+ZTGgzE97KRHKZT9uZ6E7mcyET +283E9zIrpcyX/UziMPO1nFk9yiRPMmuVzLfTTOo8872aWb/IpK8yG7XMj+tM5jbzez2zeZfJPmS2 +Gpk/HjO558yfAJDlN2UFLdl3pKywNfu+PSsiZ8UdWUlndoialXZlh7uzMnpW3pNV9GZHmFmwLzva +n1Wys6qBrHowO8bNQrzsuCCrEWa1oqxOkp2QZmFZdlKR1YNZgzJrVGenoCyiyU7rsiY4a9ZnLcbs +DJJFTdlZS9aKZm3WrN2encOymCM778o68KzTnXV5swtEFvdlFwNZdzDrCWW9kexSNEvEsssrWV8i +61/NBtayH1LZ4Hr240Y2lMmGN7ORreynXDa6nf28k40VsvHd7Mpe9kspm9jPfj3MrpazyaPs2kn2 +WyWbOs1+P8+uV7Ppi+zGVfZHLZu5zv5+m92sZ7N32a2H7B+NbO4x++dzdhsAcoKm3LuWnJCUe9+a +E7XnxOScpCM31JmTUnPDXTlZd05Ozyl6ciO9OZCZG+3LKftzKnZOPZAbG8xB3Nw4L6cR5LTCnE6U +m5DkYGluUpbTK3IGMGdU5qbUOQTKTWtyJl3ODOcs+tyMMYciuVlTzmrJ2dCc3Zqbs+cwLDfvyDlc +OSeec7lzC/9QOZFb9OXcgZwnmPOGckuRHBHNLcdyvpWcP5ELrOY+rOWCqdzH9VxoIxfO5CKbuU9b +uWgu93k7F9vJxQu5ld3cl71copT7up9bPcwly7m1o9y3k1yqkvt+mls/z6WruY2L3I+rXKaW+/06 +t3mby9ZzW3e5Px5yuUbuz8fc9nMuDwD5d015YUv+PSkvas2L2/MScn6oIy/tzA9T87KuvLw7r6Dn +R3ryYG9+lJlX9uVV/Xk1Oz82kIcG8+PcvIaX1wryOmF+QpSHJflJaV4vyxsUeSOYn1LmEXV+Gsqb +NHmzLm+B8zP6PGrMzyJ5qylvs+TtaH7Omsfs+Xks73Dkna68C88vuPO4N79I5N2+vCeQ9wbzS6E8 +EckvR/O+WN6/kg8k8h9W88G1/MdUPrSeD2/kI5n8p818dCv/OZePbefjO/mVQv7Lbj6xl/9ayq/u +55OH+bVy/ttRPnWS/17Jr5/m0+f5jWr+x0U+c5X/vZbfvM5nb/Nb9fwfd/ncQ/7PRn77MZ9/zu8A +QEHYVHjfUhCRCuLWgqS9MEQuSDsKw50FGbUg7yoougsj9ALYUxjtLSiZBVVfQd1fGGMXoIHC+GBB +wy1oeQWdoDAhLMCiwqSkoJcWDLKCUVGYAguIsjCtLpiggllTsOgKM3AB1RdmjQUrUrCZCnZLYQ4t +YNbCvL3gwApOR8HlKizgBdxdWPQW3EThH2fhDRSWggUiVFiOFHzRgj9WCKwUPiQKwdXCx7VCKFUI +rxciG4VPmUJ0s/B5qxDLFeLbhZWdwpdCIbFb+LpXWC0VkvuFtcPCt3IhdVT4flJYrxTSp4WN88KP +aiFzUfj9qrBZK2SvC1u3hT/qhdxd4c+HwnajkH8s7DwX/gKA4vumoqilKCYVJa3FofailFwc7ijK +OotyalHRVRzpLoL04mhPUdlbVDGL6r7iWH8RYhfHB4qawaKWW9TxihOCIiwsToqKeknRIC0aZcUp +RREBi9PKokldNENFi6Y4oyuicHFWX7QaizakaDcV5yxFDC3OW4sOe9GJFV2O4oKriOPFRXfR7S16 +iKLXV1wKFIlgcTlU9EWK/mgxECt+WCkGE8WPq8XQWjGcKkbWi582itFM8fNmMbZVjOeKK9vFLzvF +RKH4dbe4uldMlopr+8Vvh8VUufj9qLh+UkxXihunxR/nxUy1+PtFcfOqmK0Vt66Lf9wWc/Xin3fF +7YdivlHceSz+9VwsAEBJ1FQSt5QkpNJQa0naXhoml2QdJXlnSUEtjXSVwO7SKL2k7CmpektqZmms +rwT1l8bZJc1ASTtY0nFLE7wSLChNCkt6UckgKRmlpSlZCVGUpsGSSVkyq0sWqDSjKaG60ixcsupL +NmPJjpTmTCXMUppHSw5ryWkvubDSgqOEu0qLeMntLnm8JS9RWvKViEBpOVjyhUr+SCkQLX2IlYIr +pY+JUmi1FF4rRVKlT+ul6Ebpc6YU2yzFt0orudKX7VJip/S1UFrdLSX3Smul0rf9Uuqw9L1cWj8q +pU9KG5XSj9NS5rz0e7W0eVHKXpW2aqU/rku529Kf9dL2XSn/UNpplP56LBWeS38DwIG46UDScjBE +OpC2Hgy3H8jIB/KOA0XnwQj1AOw6GO0+UNIPVD0H6t6DMeYB1Hcw3n+gYR9oBw50gwcT3AOYdzAp +ONALDwyiA6PkYEp6gMgOphUHJvDArDywqA9moANUczCrO7DCBzb9gd14MIccYKaDecuBAz1wWg9c +9oMF7AB3HCy6Dtz4gcd94PUeLBEHhO9gOXDgCx74QweByMGH6EEwdvBx5SCUOAivHkTWDj6lDqLr +B583DmKZg/jmwcrWwZfcQWL74OvOwWrhILl7sLZ38K10kNo/+H54sF4+SB8dbJwc/KgcZE4Pfj8/ +2KweZC8Otq4O/qgd5K4P/rw92K4f5O8Odh4O/mocFB4P/n4+2AWAsqSpPNRSlpLKw61lWXtZTi4r +OsojnWWQWh7tKiu7yyp6Wd1THustQ8zyeF9Z01/Wssu6gfLEYBnmlid5Zb2gbBCWjaLylKSMSMvT +srJJUTaDZYuyPKMuo1B5VlO26so2uGzXl+eMZQwpz5vKDkvZiZZd1vKCvYxj5UVH2e0qe/Cy111e +8pYJorzsK/sCZX+wHAiVP0T+0Tnlj7FyaKUcTpQjq+VPa+Voqvx5vRzbKMcz5ZXN8petciJX/rpd +Xt0pJwvltd3yt71yqlT+vl9ePyyny+WNo/KPk3KmUv79tLx5Xs5Wy1sX5T+uyrla+c/r8vZtOV8v +79yV/3ooFxrlvx/Lu8/lIgAcDzUdS1uOh0nHstZjefuxgnw80nEMdh6PUo+VXceq7mM1/Xis5xjq +PR5nHmv6jrX9xzr28cTAMTx4PMk91vOODYJjo/B4SnSMSI6npccm2bFZcWwBj2eUx6j6eBY6tmqO +bbpjO3w8pz/GjMfzyLHDdOy0HLvQ4wXrMW4/XsSO3Y5jj+vYix8vuY8J7/EycezzHfsDx4Hg8YfQ +cTBy/DF6HIodh1eOI4njT6vH0bXjz6nj2PpxfON4JXP8ZfM4sXX8NXe8un2c3DleKxx/2z1O7R1/ +Lx2v7x+nD483ysc/jo4zJ8e/V443T4+z58db1eM/Lo5zV8d/1o63r4/zt8c79eO/7o4LD8d/N453 +H4+Lz8d7AFCRNlWGWyoyUkXeWlG0V0bIFbCjMtpZUVIrqq6KursyRq9APZXx3oqGWdH2VXT9lQl2 +BR6oTA5W9NyKgVcxCipTwgoiqkxLKiZpxSyrWBSVGbCCKiuz6ooVqtg0FbuuMgdXMH1l3lhxIBWn +qeKyVBbQCm6tLNorbqzicVS8rsoSXiHclWVvxUdU/L5KIFD5EKwEQ5WPkUooWgnHKpGVyqdEJbpa ++bxWiaUq8fXKykblS6aS2Kx83aqs5irJ7craTuVboZLarXzfq6yXKun9ysZh5Ue5kjmq/H5S2axU +sqeVrfPKH9VK7qLy51Vlu1bJX1d2bit/1SuFu8rfD5XdRqX4WNl7rvwXAM6Gm85kLWdy0pmi9Wyk +/Qwkn412nCk7z1TUM3XX2Vj3GUQ/G+850/SeaZlnur6zif4zmH02OXCmHzwzcM+MvLMpwRkiPJsW +nZkkZ2bpmUV2NqM4Q8GzWeWZVX1mg87smrM53RkGn83rzxzGMydy5jKdLVjOcPRs0Xrmtp95sDOv +42zJdUbgZ8vuM5/3zE+cBXxnHwJnweDZx9BZKHIWjp5FYmefVs6iibPPq2extbN46mxl/ezLxlki +c/Z182x16yyZO1vbPvu2c5YqnH3fPVvfO0uXzjb2z34cnmXKZ78fnW2enGUrZ1unZ3+cn+WqZ39e +nG1fneVrZzvXZ3/dnhXqZ3/fne0+nBUbZ3uPZ/99PisBQFXWVJW3VBWk6khrFWyvjpKryo6qqrOq +plbHuqpQd3WcXtX0VLW9VR2zOtFXhfurk+yqfqBqGKwaudUpXhURVKeFVZOoapZULdLqjKyKKqqz +YNWqrNrUVTtUndNUMV11Hq469FWnsepCqgumKm6pLqJVt7XqsVe9WHXJUSVc1WW86nNX/d5qgKh+ +8FWDgerHYDUUqoYj1Ui0+ilWja5UPyeqsX9k11p1JVX9sl5NbFS/Zqqrm9XkVnUtV/22XU3tVL8X +quu71fRedaNU/bFfzRxWfy9XN4+q2ZPqVqX6x2k1d179s1rdvqjmr6o7tepf19XCbfXvenX3rlp8 +qO41qv99rJaeq/8DgEt506Wi5XKEdAm2Xo62XyrJl6qOS3Xn5Rj1Euq6HO++1NAvtT2Xut7LCeYl +3Hc52X+pZ18aBi6Ng5dT3EuEdzktuDQJL82iS4vkckZ6icouZxWXVvDSpry0qy/noEtMczmvu3TA +l079pct4uYBc4qbLRculG730WC+99ssl7JJwXC67Ln34pd99GfBefiAug77Lj4HLUPAyHLqMRC4/ +RS+jscvPK5exxGV89XJl7fJL6jKxfvl143I1c5ncvFzbuvyWu0xtX37fuVwvXKZ3Lzf2Ln+ULjP7 +l78fXm6WL7NHl1snl39ULnOnl3+eX25XL/MXlztXl3/VLgvXl3/fXu7WL4t3l3sPl/9tXJYeL//3 +fLkPADVFU22kpQaSaqOtNWV7TUWuqTtqY501iFob76ppumtaek3XU5vorcHM2mRfTd9fM7BrxoHa +1GAN4dameTWToGYW1iyi2oykhkprs7KaVVGzgTW7sjanrmFQbV5Tc+hqTrjm0tcWjDUcqS2aam5L +zYPWvNbakr1GYLVlR83nqvnxWsBd++CtBYnaR18tFKiFg7VIqPYpUotGa59jtdhKLZ6orazWvqzV +/lGBX9drqxu1ZKa2tln7tlVL5Wrft2vrO7V0obaxW/uxV8uUar/v1zYPa9lybeuo9sdJLVep/Xla +2z6v5au1nYvaX1e1Qq3293Vt97ZWrNf27mr/faiVGrX/Pdb2n2sHAHAz0nQDttyMkm6UrTeq9hs1 ++Was4wbqvBmn3mi6brTdNzr6zUTPDdx7M8m80ffdGPpvjOybqYEbZPBmmntj4t2YBTcW4c2M6AaV +3MxKb6yyG5vixg7ezClvMPXNPHTj0Nw4dTcu+GZBf4MbbxaRG7fpxmO58aI3S9Ybwn6zjN34HDd+ +100Av/ngvgl6bz4SNyHfTThwEwnefArdRCM3n6M3sdhNfOVmJXHzZfUmsXbzNXWzun6T3LhZy9x8 +27xJbd18z92sb9+kd242Cjc/dm8yeze/l24292+yhzdb5Zs/jm5yJzd/Vm62T2/y5zc71Zu/Lm4K +Vzd/1252r2+Ktzd79Zv/3t2UHm7+17jZf7w5eL45BIA62FQfbakrSXVVa13dXh8j16GO+nhnXUOt +a7vquu76BL0O99Qne+t6Zt3QVzf216fYdWSgPj1YN3HrZl7dIqjPCOuoqD4rqVuldZusblfU58A6 +pqzPq+sOqO7U1F26+gJcx/X1RWPdjdQ9prrXUl9C64S1vmyv+7C631EPuOof8HrQXf/orYeIethX +jwTqn4L1aKj+OVKPRevxWH1lpf4lUU+s1r+u1VdT9eR6fW2j/i1TT23Wv2/V13P19HZ9Y6f+o1DP +7NZ/36tvlurZ/frWYf2Pcj13VP/zpL5dqedP6zvn9b+q9cJF/e+r+m6tXryu793W/1uvl+7q/3uo +7zfqB4/1w+f6/wHA/WjTvbLlXkW6V7fej7XfQ+T78Y57Tee9lnqv67qf6L6H6feTPff63nsD897Y +dz/Vf4+w76cH7k2D92buvYV3PyO4R4X3s6J7q+TeJr23y+7nFPcYeD+vvHeo753QvUtzv6C7x+H7 +Rf2923jvQe69pvslyz2B3i9b7332ez92H3Dcf3DdB/H7j+77kPc+TNxHfPefAvfR4P3n0H0sch+P +3q/E7r+s3CcS919X71fX7pOp+7X1+28b96nM/ffN+/Wt+3TufmP7/sfOfaZw//vu/ebefbZ0v7V/ +/8fhfa58/+fR/fbJfb5yv3N6/9f5faF6//fF/e7VfbF2v3d9/9/b+1L9/n939/sP9weN+8PH+/97 +vi8DQEPZ1FC1NNSkxlhrA2pvjJMbmo6GtrOhozYmuhpwd2OS3tD3NAy9DSOzMdXXQPob0+yGaaBh +HmxYuI0ZXgMVNGaFDauoYZM07NLGnKyBKRrzYMOhbDjVDRfUWNA0cF1jEW649Q2PseFFGkumBmFp +LKMNn7XhtzcCWOODoxF0NT7ijZC7EfY2IkTjk68RDTQ+BxuxUCMeaaxEG19ijcRK42uisbraSK41 +1lKNb+uN1Ebje6axvvmPJW1s5Bo/thuZncbvhcbmbiO719gqNf7Yb+QOG3+WG9tHjfxJY6fS+Ou0 +UThv/F1t7F40ileNvVrjv9eN0m3jf/XG/l3j4KFx2Gj832Oj/Nz4fwDwpGp6Urc8jZGeoNan8fYn +DflJ2/Gk63yaoD7BXU+T3U96+pOh58nY+zTFfEL6nqb7n0zsJ/PAk2XwaYb7hPKeZgVPVuGTTfRk +lzzNSZ8w2dO84skBPjmVTy710wL0hGueFnVPbvjJo3/yGp+WkCfC9LRsefKhT37rU8D+9AF7Cjqe +PrqeQvhT2P0U8T59Ip6ivqfPgadY8CkeelqJPH2JPiViT19XnlYTT8nVp7W1p2+pp9T60/eNp/XM +U3rzaWPr6UfuKbP99PvO02bhKbv7tLX39EfpKbf/9Ofh03b5KX/0tHPy9FflqXD69Pf50271qXjx +tHf19N/aU+n66X+3T/v1p4O7p8OHp/9rPJUfn/7f89PR/w8QCy14LJdV2gAAAABJRU5ErkJggg== diff --git a/corpus/m6/rust-collapse-control-01/read/page-012.pdf b/corpus/m6/rust-collapse-control-01/read/page-012.pdf new file mode 100644 index 0000000000000000000000000000000000000000..600e412c65da8def439611a1fef43c58438943ba Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-012.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-012.xml b/corpus/m6/rust-collapse-control-01/read/page-012.xml new file mode 100644 index 0000000000000000000000000000000000000000..031366d4b192673843f63a383bd9bddd47be1077 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-012.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/rust-collapse-control-01/read/page-013.pdf b/corpus/m6/rust-collapse-control-01/read/page-013.pdf new file mode 100644 index 0000000000000000000000000000000000000000..537a758399e65b9c50dea023ef47c7beafd5c16a Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-013.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-013.xml b/corpus/m6/rust-collapse-control-01/read/page-013.xml new file mode 100644 index 0000000000000000000000000000000000000000..66c3d86f16732f38d2760cd40daa82ec2df7a71c --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-013.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/page-014.pdf b/corpus/m6/rust-collapse-control-01/read/page-014.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a7bc831081250111bea56e04db11906fec9a3fee Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-014.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-014.xml b/corpus/m6/rust-collapse-control-01/read/page-014.xml new file mode 100644 index 0000000000000000000000000000000000000000..1b54aa252a7669dec1c3592a329dfb1c5f3d6868 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-014.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/page-015.pdf b/corpus/m6/rust-collapse-control-01/read/page-015.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d0caa33d4dd0d167c7ee77b366c1e89e9586bda3 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-015.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-015.xml b/corpus/m6/rust-collapse-control-01/read/page-015.xml new file mode 100644 index 0000000000000000000000000000000000000000..853e3ca6bde7a263c247a8a9dcb395a5eaacd151 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-015.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/page-016.pdf b/corpus/m6/rust-collapse-control-01/read/page-016.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ddd5d4672d517c94541a37c4b815f3dfa75443c6 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-016.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-016.xml b/corpus/m6/rust-collapse-control-01/read/page-016.xml new file mode 100644 index 0000000000000000000000000000000000000000..6741375d5ad10c8b49a4d6bf24ce38f002f7394e --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-016.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/page-017.pdf b/corpus/m6/rust-collapse-control-01/read/page-017.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c224d08f28a34342dfb7322cea44b21212030542 Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-017.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-017.xml b/corpus/m6/rust-collapse-control-01/read/page-017.xml new file mode 100644 index 0000000000000000000000000000000000000000..467571008cfc40b8d9f584425048b414d410cd14 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-017.xml @@ -0,0 +1,6 @@ + +iVBORw0KGgoAAAANSUhEUgAAAGAAAABACAIAAABqVuVZAAAAwUlEQVR4nO3ZwQ2DQBDF0Hkk/dec +CuASwXCwtBVY/mYBM3OMznEC4TsfMx1nEALk2o8ACZB/GpJBAiSD3PcgbmICJIM0MVvX/RokQDJI +E1ODvPOrS5EWIBmkialB1ntcpAVIBmli1rvTRVGAZJAmZj1AvawKkAzSxNQg6zEu0gIkgzQx69Hp +oihAMkgT85LTn1UBkkGamBpkvcdFWoBkkCZmvTtdFAVIBmli1gPUy6oAySBNTA2yHuMiLUAyyPMT ++wHXVRp4qDc0HQAAAABJRU5ErkJggg== diff --git a/corpus/m6/rust-collapse-control-01/read/page-018.pdf b/corpus/m6/rust-collapse-control-01/read/page-018.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b0c2b132891fb7e9cf3190bd3e0b6d5dedcf1a0f Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-018.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-018.xml b/corpus/m6/rust-collapse-control-01/read/page-018.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e1c0987d930b1e3b6eb0a06b37cb67119bc8457 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-018.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/page-019.pdf b/corpus/m6/rust-collapse-control-01/read/page-019.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6d0aa91347b0e206d80a1ee0f2a73fdc152a5e5b Binary files /dev/null and b/corpus/m6/rust-collapse-control-01/read/page-019.pdf differ diff --git a/corpus/m6/rust-collapse-control-01/read/page-019.xml b/corpus/m6/rust-collapse-control-01/read/page-019.xml new file mode 100644 index 0000000000000000000000000000000000000000..6bade7adfe73860199145877401d201cb5feb526 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/page-019.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/m6/rust-collapse-control-01/read/payloads.json b/corpus/m6/rust-collapse-control-01/read/payloads.json new file mode 100644 index 0000000000000000000000000000000000000000..5129b441680edbf65ef7bec36fb0b55f7b92f0de --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/read/payloads.json @@ -0,0 +1,18 @@ +[ + { + "sha256": "4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2", + "name": "Fictitious attachment.txt", + "object": "{E2ABB096-FC4F-0313-2920-1DADD2631B5C}{40}{B0}", + "kind": "InsertedFile", + "page": "{F8B18912-24AC-0DDE-3A3C-8F1CA984DD2B}{1}{B0}", + "bytes": 27 + }, + { + "sha256": "56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9", + "name": "silence.wav", + "object": "{E2ABB096-FC4F-0313-2920-1DADD2631B5C}{44}{B0}", + "kind": "MediaFile", + "page": "{F8B18912-24AC-0DDE-3A3C-8F1CA984DD2B}{1}{B0}", + "bytes": 16044 + } +] \ No newline at end of file diff --git a/corpus/m6/rust-collapse-control-01/run.json b/corpus/m6/rust-collapse-control-01/run.json new file mode 100644 index 0000000000000000000000000000000000000000..f045583576cd47fdbb5e4fb7dca42c78718d4275 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/run.json @@ -0,0 +1,17 @@ +{ + "notebook": "/Users/clo/dev/one/evidence/m6/rust-collapse-control-input/notebook", + "expected_pages": 20, + "author": null, + "author_timeout_seconds": 600, + "inspect": false, + "base": { + "file": "win7-office-base.qcow2", + "format": "qcow2", + "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346", + "virtual_size": 68719476736 + }, + "scripts": { + "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331", + "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8" + } +} diff --git a/corpus/m6/rust-collapse-control-01/scripts/cold.ps1 b/corpus/m6/rust-collapse-control-01/scripts/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/scripts/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/corpus/m6/rust-collapse-control-01/scripts/read.ps1 b/corpus/m6/rust-collapse-control-01/scripts/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/scripts/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/corpus/m6/rust-collapse-control-01/source.json b/corpus/m6/rust-collapse-control-01/source.json new file mode 100644 index 0000000000000000000000000000000000000000..07176b63e37e23aef49440e8d2206c870b08a945 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/source.json @@ -0,0 +1,110 @@ +[ + { + "path": "Empty.one", + "bytes": 4016, + "sha256": "9e99f8508837f3abe2874ccbd42bea9954ff01a596e3d4e8d1a01bc377b5a0df", + "mtime_ns": 1788661593561895158 + }, + { + "path": "Features.one", + "bytes": 121624, + "sha256": "6e174a041bd916c46e49c42d76332b03f835e08a0ba8e86d894d58a9916d4f01", + "mtime_ns": 1788674679363426341 + }, + { + "path": "Group A/Duplicate.one", + "bytes": 23504, + "sha256": "77d0ffb49f308122e1a9155d0941ccecece888cb8f9af395697569a7be70d308", + "mtime_ns": 1788661593563832275 + }, + { + "path": "Group A/Open Notebook.onetoc2", + "bytes": 3760, + "sha256": "945d36daadca6eef55cc34107f6415356836ec79ca2b484a7f1adc0643fa27e0", + "mtime_ns": 1788661593563917316 + }, + { + "path": "Group B/Nested/Duplicate.one", + "bytes": 23424, + "sha256": "952dd1766415dd2c622d6981eb1eb6bf9d3415abf50735048529240c6ae40343", + "mtime_ns": 1788661593564205357 + }, + { + "path": "Group B/Nested/Open Notebook.onetoc2", + "bytes": 3760, + "sha256": "12e9cefade3dfdce9ad27bdc678b6401c71a5ab0fbeb260f94febc6c74fa0bc2", + "mtime_ns": 1788661593564303940 + }, + { + "path": "Group B/Open Notebook.onetoc2", + "bytes": 3736, + "sha256": "0f6318eae2aee05a8f909f009b7ef948e1e7973c34bc348659b7f5cf5dd63f4d", + "mtime_ns": 1788661593564040816 + }, + { + "path": "Open Notebook.onetoc2", + "bytes": 5364, + "sha256": "06ec4fb5b2454514eafae121f3f740c443053f8a4c857e6eb0dc59e5f8024233", + "mtime_ns": 1788661593562572238 + }, + { + "path": "fixture-data/Open Notebook.onetoc2", + "bytes": 3656, + "sha256": "7b2c9d872dfbec669423821452b76d9cca25d2eea83034623ecaf4cf601848ce", + "mtime_ns": 1788661593562956029 + }, + { + "path": "fixture-data/attachment.txt", + "bytes": 27, + "sha256": "4cff0039dbdf53a59f5f4e4592c29a5297ea3b7acce24415c0ae83c36c6bd7c2", + "mtime_ns": 1788661593562850321 + }, + { + "path": "fixture-data/pattern.bmp", + "bytes": 18486, + "sha256": "d7802912d031a974c277d1500f845faf7d1d5dc3dd9d5a3daf69c44db8d9dbf5", + "mtime_ns": 1788661593563127403 + }, + { + "path": "fixture-data/pattern.gif", + "bytes": 3902, + "sha256": "e0d351f33d156bf3d77b4912269768e2261c0c4850a8e78a87c245a2db2c5953", + "mtime_ns": 1788661593563230986 + }, + { + "path": "fixture-data/pattern.jpg", + "bytes": 1071, + "sha256": "bf7ef0fb92642d75f186c27a0ba662138c7c3f9ea85b1c478805a229cda451ed", + "mtime_ns": 1788661593563318944 + }, + { + "path": "fixture-data/pattern.png", + "bytes": 250, + "sha256": "02065dc5a46ae9a4adc68d0fff2641b62cedaa396f59f93ec6ac79c8b358904a", + "mtime_ns": 1788661593563399569 + }, + { + "path": "fixture-data/pattern.tiff", + "bytes": 18572, + "sha256": "fbbc74945e085389c3e994bfab64c26144056066e0d631512e62a3007b373427", + "mtime_ns": 1788661593563547193 + }, + { + "path": "fixture-data/silence.wav", + "bytes": 16044, + "sha256": "56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9", + "mtime_ns": 1788661593563674442 + }, + { + "path": "fixture.json", + "bytes": 12415, + "sha256": "d3c2142230816e8717c7612a5d2ca816a7551cebc2bc445846f3824d3a44dbc3", + "mtime_ns": 1788661593562325448 + }, + { + "path": "synthetic.one", + "bytes": 7428, + "sha256": "eb1e702f86562e91efcabf0065211efdeaf39bdc977beb82382faf901bf3b2c4", + "mtime_ns": 1788661593562715779 + } +] diff --git a/corpus/m6/rust-collapse-control-01/teardown.json b/corpus/m6/rust-collapse-control-01/teardown.json new file mode 100644 index 0000000000000000000000000000000000000000..05a47793de40f322e745c4c4183727e3590ecf70 --- /dev/null +++ b/corpus/m6/rust-collapse-control-01/teardown.json @@ -0,0 +1 @@ +{"absent": true} diff --git a/corpus/m7/automatic-titles/README.md b/corpus/m7/automatic-titles/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4058ca68f134c12dd8b77c437529aff2b99577f6 --- /dev/null +++ b/corpus/m7/automatic-titles/README.md @@ -0,0 +1,14 @@ +# Native automatic-title fixtures + +OneNote 2010 authored these synthetic sections in disposable, isolated Windows +profiles. `provenance.json` records their capture paths and hashes. + +- `rtl-and-attachments.one`: RTL outline order, RTL table cells, and attachments + preceding text. RTL outlines choose descending x position; RTL rows use the + last stored cell first. Attachments do not supply automatic text titles. +- `widths-and-limits.one`: differing outline widths establish that ordering uses + the x anchor, not the right edge. Automatic titles trim the truncated result + and count UTF-16 units without requiring grapheme boundaries. + +`tests/edit.rs` edits each relevant body candidate and checks the native-derived +navigation label while preserving unrelated properties and historical objects. diff --git a/corpus/m7/automatic-titles/provenance.json b/corpus/m7/automatic-titles/provenance.json new file mode 100644 index 0000000000000000000000000000000000000000..66ea8b05ffbaa6df9bd7ebbacdfa356931997627 --- /dev/null +++ b/corpus/m7/automatic-titles/provenance.json @@ -0,0 +1,14 @@ +[ + { + "path": "rtl-and-attachments.one", + "sha256": "85aaa8be3dc4662acfc42d4c191471d11ed2e94b2574bc819fd1320b94ce52e7", + "source": "evidence/m7/automatic-title-native-04/notebook/synthetic.one", + "bytes": 41052 + }, + { + "path": "widths-and-limits.one", + "sha256": "69cc44b8c5ebc7125f442e7a257738bf20d3796156e44b201eaead7da7486d5a", + "source": "evidence/m7/automatic-title-native-05/notebook/synthetic.one", + "bytes": 37324 + } +] \ No newline at end of file diff --git a/corpus/m7/automatic-titles/rtl-and-attachments.one b/corpus/m7/automatic-titles/rtl-and-attachments.one new file mode 100644 index 0000000000000000000000000000000000000000..e2bf245e797c0808fcd2a2cdd6338ec1fd710317 Binary files /dev/null and b/corpus/m7/automatic-titles/rtl-and-attachments.one differ diff --git a/corpus/m7/automatic-titles/widths-and-limits.one b/corpus/m7/automatic-titles/widths-and-limits.one new file mode 100644 index 0000000000000000000000000000000000000000..714b0c20699debf74b2e27f6ef8cac057a90c028 Binary files /dev/null and b/corpus/m7/automatic-titles/widths-and-limits.one differ diff --git a/corpus/m7/empty-final-run/README.md b/corpus/m7/empty-final-run/README.md new file mode 100644 index 0000000000000000000000000000000000000000..a206b6cf3adee75fa907aced67539e94762e6c9b --- /dev/null +++ b/corpus/m7/empty-final-run/README.md @@ -0,0 +1,13 @@ +# Empty final formatting run + +`input` is the 24-byte minimized stateful fuzz input retained from the M7 text +editing campaign. The old oracle represented only characters and lost the +insertion style of an emptied final run. An insertion there inherited the +retained final run's style, which disagreed with that incomplete oracle. + +The stable semantic replay is +`tests/edit.rs::an_emptied_final_run_retains_its_insertion_style`: erase UTF-16 +positions 22..27 in the native formatted fixture, insert `a` at 22, and require +the original final run's formatting. The current fuzz oracle carries an explicit +terminal style marker. Fixture-selection bytes have changed as cases were added; +the named regression is the replay independent of that encoding. diff --git a/corpus/m7/empty-final-run/input b/corpus/m7/empty-final-run/input new file mode 100644 index 0000000000000000000000000000000000000000..5f22f72cb8fc04fac942156323b4334128d80943 Binary files /dev/null and b/corpus/m7/empty-final-run/input differ diff --git a/corpus/malformed/README.md b/corpus/malformed/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5a55066e9c076b7b130dbe3875ac8ed9c02358c7 --- /dev/null +++ b/corpus/malformed/README.md @@ -0,0 +1,6 @@ +`native-inflight.one` was read without exclusion during OneNote 2010's shared +conflict save. Its committed revision references an object space that was not +yet present. The eventual locked snapshot is valid and lives in +`../collaboration/round-01/live/notebook/`. This intermediate file is a rejection +fixture, not an accepted notebook. The commit test checks that even a no-op edit +fails graph validation before any storage I/O. diff --git a/corpus/malformed/native-inflight.one b/corpus/malformed/native-inflight.one new file mode 100644 index 0000000000000000000000000000000000000000..74b2c8bcaffe679de8d955d1221518a5230ff864 Binary files /dev/null and b/corpus/malformed/native-inflight.one differ diff --git a/corpus/native-delete/cold-deletion-05/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one b/corpus/native-delete/cold-deletion-05/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one new file mode 100644 index 0000000000000000000000000000000000000000..7111ac244a08a0faffc6c19341d1b25771fb4c0e Binary files /dev/null and b/corpus/native-delete/cold-deletion-05/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one differ diff --git a/corpus/native-delete/cold-deletion-05/notebook/OneNote_RecycleBin/Open Notebook.one b/corpus/native-delete/cold-deletion-05/notebook/OneNote_RecycleBin/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..af7cddfbbbae295e8f44b648c621b4715e74819f Binary files /dev/null and b/corpus/native-delete/cold-deletion-05/notebook/OneNote_RecycleBin/Open Notebook.one differ diff --git a/corpus/native-delete/cold-deletion-05/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 b/corpus/native-delete/cold-deletion-05/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..86057ee30ae85f3cb5ba05a2a6624050db20cef4 Binary files /dev/null and b/corpus/native-delete/cold-deletion-05/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 differ diff --git a/corpus/native-delete/cold-deletion-05/notebook/Open Notebook.one b/corpus/native-delete/cold-deletion-05/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..9175d99336bde356dbc153407018d317e010cff2 Binary files /dev/null and b/corpus/native-delete/cold-deletion-05/notebook/Open Notebook.one differ diff --git a/corpus/native-delete/cold-deletion-05/notebook/Open Notebook.onetoc2 b/corpus/native-delete/cold-deletion-05/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c51bee689276b332f759b18b303baae59ec8ca34 Binary files /dev/null and b/corpus/native-delete/cold-deletion-05/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native-delete/cold-deletion-05/notebook/synthetic.one b/corpus/native-delete/cold-deletion-05/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..ccc99e6d782a641e844b2d64224189471d8cdebe Binary files /dev/null and b/corpus/native-delete/cold-deletion-05/notebook/synthetic.one differ diff --git a/corpus/native-delete/cold-deletion-05/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/native-delete/cold-deletion-05/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/native-delete/cold-deletion-05/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/native-delete/cold-deletion-05/read/hierarchy.xml b/corpus/native-delete/cold-deletion-05/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..4fbd21438321b0a4dd8548ad43d120aa2a4c892a --- /dev/null +++ b/corpus/native-delete/cold-deletion-05/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native-delete/cold-deletion-05/read/page-000.xml b/corpus/native-delete/cold-deletion-05/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..b25e144e9c1b431b541c14c649a7aae879c00ef3 --- /dev/null +++ b/corpus/native-delete/cold-deletion-05/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native-delete/cold-deletion-05/read/page-001.xml b/corpus/native-delete/cold-deletion-05/read/page-001.xml new file mode 100644 index 0000000000000000000000000000000000000000..dea61ae7be830969e191c6696fcc2e096b961cfe --- /dev/null +++ b/corpus/native-delete/cold-deletion-05/read/page-001.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native-delete/deletion-05/before/Open Notebook.onetoc2 b/corpus/native-delete/deletion-05/before/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..a33d3bfd210f844e3db618e648ac898adeee09c6 Binary files /dev/null and b/corpus/native-delete/deletion-05/before/Open Notebook.onetoc2 differ diff --git a/corpus/native-delete/deletion-05/before/synthetic.one b/corpus/native-delete/deletion-05/before/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..96c4d7aba4c5a5ca95095bd535adf88481d297eb Binary files /dev/null and b/corpus/native-delete/deletion-05/before/synthetic.one differ diff --git a/corpus/native-delete/deletion-05/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one b/corpus/native-delete/deletion-05/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one new file mode 120000 index 0000000000000000000000000000000000000000..029117dc0602fa589d06fde0d0777cda958c9820 --- /dev/null +++ b/corpus/native-delete/deletion-05/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one @@ -0,0 +1 @@ +../../../cold-deletion-05/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one \ No newline at end of file diff --git a/corpus/native-delete/deletion-05/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 b/corpus/native-delete/deletion-05/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..2853bd0f225466ce998f8cd21fc8c3119388c913 Binary files /dev/null and b/corpus/native-delete/deletion-05/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 differ diff --git a/corpus/native-delete/deletion-05/notebook/Open Notebook.onetoc2 b/corpus/native-delete/deletion-05/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..9eb9fc9a4a114c94e8f50e4f78631756ed2fe983 Binary files /dev/null and b/corpus/native-delete/deletion-05/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native-delete/deletion-05/notebook/synthetic.one b/corpus/native-delete/deletion-05/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..6cebbdccf8fc471778e405c524bf443c6b653aa8 --- /dev/null +++ b/corpus/native-delete/deletion-05/notebook/synthetic.one @@ -0,0 +1 @@ +../../cold-deletion-05/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native-encrypted/cold-encrypted-02/notebook/Open Notebook.one b/corpus/native-encrypted/cold-encrypted-02/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..f46f7709d7803b53acd16bbfa2eb7ccce585becd Binary files /dev/null and b/corpus/native-encrypted/cold-encrypted-02/notebook/Open Notebook.one differ diff --git a/corpus/native-encrypted/cold-encrypted-02/notebook/Open Notebook.onetoc2 b/corpus/native-encrypted/cold-encrypted-02/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..2bd1fd0bdbc878489b96340cbcb5dacf72cdc88a Binary files /dev/null and b/corpus/native-encrypted/cold-encrypted-02/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native-encrypted/cold-encrypted-02/notebook/synthetic.one b/corpus/native-encrypted/cold-encrypted-02/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..5e844b3628c5b39637fe477eae6c19ac2ab43837 Binary files /dev/null and b/corpus/native-encrypted/cold-encrypted-02/notebook/synthetic.one differ diff --git a/corpus/native-encrypted/cold-encrypted-02/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/native-encrypted/cold-encrypted-02/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/native-encrypted/cold-encrypted-02/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/native-encrypted/cold-encrypted-02/read/hierarchy.xml b/corpus/native-encrypted/cold-encrypted-02/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..bc610e135e02cc8ad9d600bdab8f51fde2641ce0 --- /dev/null +++ b/corpus/native-encrypted/cold-encrypted-02/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native-encrypted/cold-encrypted-02/read/page-000.xml b/corpus/native-encrypted/cold-encrypted-02/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..2b50f580061292efd17cc5c32c71ee521ccf7f71 --- /dev/null +++ b/corpus/native-encrypted/cold-encrypted-02/read/page-000.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native-encrypted/encrypted-01/notebook/Open Notebook.onetoc2 b/corpus/native-encrypted/encrypted-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..3757c08bbbcd0eadbc8f0548068c44684f9b21dd Binary files /dev/null and b/corpus/native-encrypted/encrypted-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native-encrypted/encrypted-01/notebook/synthetic.one b/corpus/native-encrypted/encrypted-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..5e844b3628c5b39637fe477eae6c19ac2ab43837 Binary files /dev/null and b/corpus/native-encrypted/encrypted-01/notebook/synthetic.one differ diff --git a/corpus/native-encrypted/manifest.json b/corpus/native-encrypted/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..7aab19c582fedbfb784a7369cbdc649dfd93b5ff --- /dev/null +++ b/corpus/native-encrypted/manifest.json @@ -0,0 +1,56 @@ +{ + "captured_utc": "2026-09-05T06:05:21.931098+00:00", + "native_build": "14.0.7015.1000", + "source_fixture": "../native/20260905-05/snapshots/07-table/notebook", + "password": "fictitious-only", + "operations": [ + "Fresh isolated cache; opened a disposable copy at C:\\one-tests\\runs\\encrypted-01\\notebook", + "Section context menu: Password Protect This Section; Set Password; Lock All; close UI and verify process exit", + "Fresh isolated cache at cold-encrypted-02; observed locked section; unlocked in UI with fixture password", + "read-current.ps1 -Root C:\\one-tests\\runs\\cold-encrypted-02 -ExpectedPages 1 -UseCurrentCache; exit 0", + "Closed UI and verified process exit" + ], + "files": [ + { + "path": "cold-encrypted-02/notebook/Open Notebook.one", + "bytes": 3360, + "sha256": "f140e4d90d5cb3cc114864d09bf49a8864d0e2129d1ccb4d19f81d5e61789eb8" + }, + { + "path": "cold-encrypted-02/notebook/Open Notebook.onetoc2", + "bytes": 5072, + "sha256": "8e662d3d07ad6d49c4a84ba3cd2092a293f40926ad5d373420b630a635b3c869" + }, + { + "path": "cold-encrypted-02/notebook/synthetic.one", + "bytes": 17560, + "sha256": "7a6e519cc0ef8de10357ffd52a32bd94c33ea09d8e420ff2d0b216ed141ff695" + }, + { + "path": "cold-encrypted-02/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment", + "bytes": 43, + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7" + }, + { + "path": "cold-encrypted-02/read/hierarchy.xml", + "bytes": 1056, + "sha256": "4bd3bd85e825a869f6723e4c5a58c3098a681bb4056a84f88254136ac1dd3867" + }, + { + "path": "cold-encrypted-02/read/page-000.xml", + "bytes": 5588, + "sha256": "6109c0d91b13a29df310ec5b9a3fdf9be3730fee1e889e48871622b6c447cf9e" + }, + { + "path": "encrypted-01/notebook/Open Notebook.onetoc2", + "bytes": 4936, + "sha256": "9646f8eedc864b94ecbda3c0aacc5d979b9c1b8d35ad0738ea34863cb55dc90b" + }, + { + "path": "encrypted-01/notebook/synthetic.one", + "bytes": 17560, + "sha256": "7a6e519cc0ef8de10357ffd52a32bd94c33ea09d8e420ff2d0b216ed141ff695" + } + ], + "native_observation": "The cold unlocked page contains one empty leading paragraph before the original four text paragraphs. This UI-produced state is part of the fixture oracle." +} diff --git a/corpus/native-ink/20260905-ui/notebook/Open Notebook.onetoc2 b/corpus/native-ink/20260905-ui/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..a33d3bfd210f844e3db618e648ac898adeee09c6 Binary files /dev/null and b/corpus/native-ink/20260905-ui/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native-ink/20260905-ui/notebook/synthetic.one b/corpus/native-ink/20260905-ui/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..e46d7a24cead34b8521bc6e1d117d68a9ff70f09 Binary files /dev/null and b/corpus/native-ink/20260905-ui/notebook/synthetic.one differ diff --git a/corpus/native-ink/cold-ui-ink/notebook/Open Notebook.one b/corpus/native-ink/cold-ui-ink/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..f6c61e56f1d1e057db725efb3fc0a4b16c5a27bb Binary files /dev/null and b/corpus/native-ink/cold-ui-ink/notebook/Open Notebook.one differ diff --git a/corpus/native-ink/cold-ui-ink/notebook/Open Notebook.onetoc2 b/corpus/native-ink/cold-ui-ink/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..c7beb44bf509f935090fe55e7549e4b50e0ae0e9 Binary files /dev/null and b/corpus/native-ink/cold-ui-ink/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native-ink/cold-ui-ink/notebook/synthetic.one b/corpus/native-ink/cold-ui-ink/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..59dbc38a3e88ca0e711ee259358823300f551ade --- /dev/null +++ b/corpus/native-ink/cold-ui-ink/notebook/synthetic.one @@ -0,0 +1 @@ +../../20260905-ui/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native-ink/cold-ui-ink/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/native-ink/cold-ui-ink/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/native-ink/cold-ui-ink/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/native-ink/cold-ui-ink/read/hierarchy.xml b/corpus/native-ink/cold-ui-ink/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..ba9a6c7a3ebef8abc3e6e216688761b814e0a43f --- /dev/null +++ b/corpus/native-ink/cold-ui-ink/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native-ink/cold-ui-ink/read/page-000.xml b/corpus/native-ink/cold-ui-ink/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..f8589978d9227bbe7619b031b0786a793558b50f --- /dev/null +++ b/corpus/native-ink/cold-ui-ink/read/page-000.xml @@ -0,0 +1,26 @@ + +Fictitious: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/20260905-05/.native-corpus.json b/corpus/native/20260905-05/.native-corpus.json new file mode 100644 index 0000000000000000000000000000000000000000..74fec4f4d515da505e514f37afbac6a0e9e32f39 --- /dev/null +++ b/corpus/native/20260905-05/.native-corpus.json @@ -0,0 +1,5 @@ +{ + "format": "onenote-native-stage1-root-v1", + "root": "C:\\one-tests\\runs\\20260905-05", + "generated": true +} diff --git a/corpus/native/20260905-05/assets/fictitious-attachment.txt b/corpus/native/20260905-05/assets/fictitious-attachment.txt new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/native/20260905-05/assets/fictitious-attachment.txt @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/native/20260905-05/assets/fictitious-image.png b/corpus/native/20260905-05/assets/fictitious-image.png new file mode 100644 index 0000000000000000000000000000000000000000..57898d7438747479376d9a9eb71fd88045b19c8e Binary files /dev/null and b/corpus/native/20260905-05/assets/fictitious-image.png differ diff --git a/corpus/native/20260905-05/evidence/00-empty/hierarchy.xml b/corpus/native/20260905-05/evidence/00-empty/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..7a73678592dc6531b4e18bd37e323b08b8654c5f --- /dev/null +++ b/corpus/native/20260905-05/evidence/00-empty/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/00-empty/native.json b/corpus/native/20260905-05/evidence/00-empty/native.json new file mode 100644 index 0000000000000000000000000000000000000000..05f7555d667171c44eede1764036458b32818a4a --- /dev/null +++ b/corpus/native/20260905-05/evidence/00-empty/native.json @@ -0,0 +1,9 @@ +{ + "fixture": "00-empty", + "notebook_id": "{D1F5A6FB-4A78-4C8A-87D0-3262527DD134}{1}{B0}", + "section_id": "{8F2B1E24-1BCB-06DF-1A76-C3DADDCBC218}{1}{B0}", + "hierarchy_file": "hierarchy.xml", + "pages": [ + + ] +} diff --git a/corpus/native/20260905-05/evidence/00-empty/reopened/hierarchy.xml b/corpus/native/20260905-05/evidence/00-empty/reopened/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..7a25e5588d6bbb494c9088b6ec0cfb3ec63ac776 --- /dev/null +++ b/corpus/native/20260905-05/evidence/00-empty/reopened/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/00-empty/reopened/native.json b/corpus/native/20260905-05/evidence/00-empty/reopened/native.json new file mode 100644 index 0000000000000000000000000000000000000000..14a2e7a929d8cd77c6ca5fd88d7d0ba7de9e0cd2 --- /dev/null +++ b/corpus/native/20260905-05/evidence/00-empty/reopened/native.json @@ -0,0 +1,8 @@ +{ + "expected_page_count": 0, + "actual_page_count": 0, + "hierarchy_file": "hierarchy.xml", + "pages": [ + + ] +} diff --git a/corpus/native/20260905-05/evidence/01-blank-page/hierarchy.xml b/corpus/native/20260905-05/evidence/01-blank-page/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2907551adc5f26da5240efc26495008061ee6b19 --- /dev/null +++ b/corpus/native/20260905-05/evidence/01-blank-page/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/01-blank-page/native.json b/corpus/native/20260905-05/evidence/01-blank-page/native.json new file mode 100644 index 0000000000000000000000000000000000000000..9d19cff107a564d9439b2f7e5d2e84e30aa306fa --- /dev/null +++ b/corpus/native/20260905-05/evidence/01-blank-page/native.json @@ -0,0 +1,12 @@ +{ + "fixture": "01-blank-page", + "notebook_id": "{EB00B959-9882-45B1-908C-44DFF6F2B55A}{1}{B0}", + "section_id": "{63B22DCB-CDA5-09EB-2BD2-88573B2DCA32}{1}{B0}", + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{4FFBDE4D-446E-4AFA-ACB5-20C6C715D62D}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/01-blank-page/pages/page-00.xml b/corpus/native/20260905-05/evidence/01-blank-page/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..7bedd0a9bb947621c5b9687f1edbbc9544d89582 --- /dev/null +++ b/corpus/native/20260905-05/evidence/01-blank-page/pages/page-00.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/01-blank-page/reopened/hierarchy.xml b/corpus/native/20260905-05/evidence/01-blank-page/reopened/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb8a1b033d9c168bd2b2612eb9825fa7ef12babc --- /dev/null +++ b/corpus/native/20260905-05/evidence/01-blank-page/reopened/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/01-blank-page/reopened/native.json b/corpus/native/20260905-05/evidence/01-blank-page/reopened/native.json new file mode 100644 index 0000000000000000000000000000000000000000..49f86a4ba010b94690d2190c4090a470fef4cbf9 --- /dev/null +++ b/corpus/native/20260905-05/evidence/01-blank-page/reopened/native.json @@ -0,0 +1,11 @@ +{ + "expected_page_count": 1, + "actual_page_count": 1, + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{911F02E6-1398-4E1F-902B-E534CB21DBE5}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/01-blank-page/reopened/pages/page-00.xml b/corpus/native/20260905-05/evidence/01-blank-page/reopened/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..f319d395388dc81c86b2b6a292ea7fc02ae769df --- /dev/null +++ b/corpus/native/20260905-05/evidence/01-blank-page/reopened/pages/page-00.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/02-text/hierarchy.xml b/corpus/native/20260905-05/evidence/02-text/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..a3177108704e407e6fdcc96d46b7ccb5cd7d11e3 --- /dev/null +++ b/corpus/native/20260905-05/evidence/02-text/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/02-text/native.json b/corpus/native/20260905-05/evidence/02-text/native.json new file mode 100644 index 0000000000000000000000000000000000000000..d83841ee30ecbaf8036d6bce0d018e1cf1a31d08 --- /dev/null +++ b/corpus/native/20260905-05/evidence/02-text/native.json @@ -0,0 +1,12 @@ +{ + "fixture": "02-text", + "notebook_id": "{58149BE9-F814-428F-BBD2-FC45BCC296CF}{1}{B0}", + "section_id": "{54FFF47B-D5E8-0F67-0755-3A3C585D3E22}{1}{B0}", + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{78B607FD-5C23-4C76-8032-92ADA465223D}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/02-text/pages/page-00.xml b/corpus/native/20260905-05/evidence/02-text/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..6a3e43254ceaab173d9c21fde93c3a5f9ae34955 --- /dev/null +++ b/corpus/native/20260905-05/evidence/02-text/pages/page-00.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/02-text/reopened/hierarchy.xml b/corpus/native/20260905-05/evidence/02-text/reopened/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..a8d2c2702c0b828bc29226566549eb4b62a8b8cc --- /dev/null +++ b/corpus/native/20260905-05/evidence/02-text/reopened/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/02-text/reopened/native.json b/corpus/native/20260905-05/evidence/02-text/reopened/native.json new file mode 100644 index 0000000000000000000000000000000000000000..23559e87891e1304c8c656dddc3d8c2b8bbfb757 --- /dev/null +++ b/corpus/native/20260905-05/evidence/02-text/reopened/native.json @@ -0,0 +1,11 @@ +{ + "expected_page_count": 1, + "actual_page_count": 1, + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{318E4E64-D5D5-408B-B701-8D88D0536D18}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/02-text/reopened/pages/page-00.xml b/corpus/native/20260905-05/evidence/02-text/reopened/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb7de20c9fe84412bae931eaf2fbfbd6147a892d --- /dev/null +++ b/corpus/native/20260905-05/evidence/02-text/reopened/pages/page-00.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/03-format-unicode-before.xml b/corpus/native/20260905-05/evidence/03-format-unicode-before.xml new file mode 120000 index 0000000000000000000000000000000000000000..2998d231c658b32b6826331b3c162248b06d9dc7 --- /dev/null +++ b/corpus/native/20260905-05/evidence/03-format-unicode-before.xml @@ -0,0 +1 @@ +02-text/reopened/pages/page-00.xml \ No newline at end of file diff --git a/corpus/native/20260905-05/evidence/03-format-unicode/hierarchy.xml b/corpus/native/20260905-05/evidence/03-format-unicode/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..ac19b7241f7e48ef223a2825f4a1cca900d28dd3 --- /dev/null +++ b/corpus/native/20260905-05/evidence/03-format-unicode/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/03-format-unicode/native.json b/corpus/native/20260905-05/evidence/03-format-unicode/native.json new file mode 100644 index 0000000000000000000000000000000000000000..85b3998de7e4abc772ee30f8a4a28335d158a638 --- /dev/null +++ b/corpus/native/20260905-05/evidence/03-format-unicode/native.json @@ -0,0 +1,12 @@ +{ + "fixture": "03-format-unicode", + "notebook_id": "{A0DD33AA-0468-4676-A6E5-B9ECBA4C63E4}{1}{B0}", + "section_id": "{D2385CFB-76BF-0BC5-1733-3ED568CA6CA5}{1}{B0}", + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{FE71AF7D-FF74-48D4-9054-964494F270BA}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/03-format-unicode/pages/page-00.xml b/corpus/native/20260905-05/evidence/03-format-unicode/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..8a71469f1b56469eddc6bdb7eab6f4267a712381 --- /dev/null +++ b/corpus/native/20260905-05/evidence/03-format-unicode/pages/page-00.xml @@ -0,0 +1,7 @@ + +Fictitious: café, 東京, مرحبا]]> diff --git a/corpus/native/20260905-05/evidence/03-format-unicode/reopened/hierarchy.xml b/corpus/native/20260905-05/evidence/03-format-unicode/reopened/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..3296e02d944eac5897bf29f6e5f0153a1cd35441 --- /dev/null +++ b/corpus/native/20260905-05/evidence/03-format-unicode/reopened/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/03-format-unicode/reopened/native.json b/corpus/native/20260905-05/evidence/03-format-unicode/reopened/native.json new file mode 100644 index 0000000000000000000000000000000000000000..3245c35271a3915a844378b50fe05300b8a33266 --- /dev/null +++ b/corpus/native/20260905-05/evidence/03-format-unicode/reopened/native.json @@ -0,0 +1,11 @@ +{ + "expected_page_count": 1, + "actual_page_count": 1, + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{BC08407A-E46F-4D09-A789-565DF2DD72B0}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/03-format-unicode/reopened/pages/page-00.xml b/corpus/native/20260905-05/evidence/03-format-unicode/reopened/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..5325a13601bd5d9ecafc26f5ba71db4f2c119d34 --- /dev/null +++ b/corpus/native/20260905-05/evidence/03-format-unicode/reopened/pages/page-00.xml @@ -0,0 +1,7 @@ + +Fictitious: café, 東京, مرحبا]]> diff --git a/corpus/native/20260905-05/evidence/04-positioned-outline/hierarchy.xml b/corpus/native/20260905-05/evidence/04-positioned-outline/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..ecf0c8f420d2d2125de486c8374f343aecb89600 --- /dev/null +++ b/corpus/native/20260905-05/evidence/04-positioned-outline/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/04-positioned-outline/native.json b/corpus/native/20260905-05/evidence/04-positioned-outline/native.json new file mode 100644 index 0000000000000000000000000000000000000000..98bd66d6bfbc34b33f53c0f9e1e33779509343d9 --- /dev/null +++ b/corpus/native/20260905-05/evidence/04-positioned-outline/native.json @@ -0,0 +1,12 @@ +{ + "fixture": "04-positioned-outline", + "notebook_id": "{D8DBA7A8-AE6E-4BAF-B8D6-4829E1133A50}{1}{B0}", + "section_id": "{02BC5154-D788-0AD7-1C4F-69A4CEC02CA7}{1}{B0}", + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{2EF5A2D2-5E43-49C6-9B28-C13532F830B8}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/04-positioned-outline/pages/page-00.xml b/corpus/native/20260905-05/evidence/04-positioned-outline/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..d2007202f107b4e487020874817a215495442c0f --- /dev/null +++ b/corpus/native/20260905-05/evidence/04-positioned-outline/pages/page-00.xml @@ -0,0 +1,7 @@ + +Fictitious: café, 東京, مرحبا]]> diff --git a/corpus/native/20260905-05/evidence/04-positioned-outline/reopened/hierarchy.xml b/corpus/native/20260905-05/evidence/04-positioned-outline/reopened/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..a1735dc987ecb0d9c75f1ce2d2bf42757214bc9d --- /dev/null +++ b/corpus/native/20260905-05/evidence/04-positioned-outline/reopened/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/04-positioned-outline/reopened/native.json b/corpus/native/20260905-05/evidence/04-positioned-outline/reopened/native.json new file mode 100644 index 0000000000000000000000000000000000000000..08916cc60d1ddf690373fbbb9be36e49f8159483 --- /dev/null +++ b/corpus/native/20260905-05/evidence/04-positioned-outline/reopened/native.json @@ -0,0 +1,11 @@ +{ + "expected_page_count": 1, + "actual_page_count": 1, + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{26228515-D185-46B8-BD44-853D77018EDC}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/04-positioned-outline/reopened/pages/page-00.xml b/corpus/native/20260905-05/evidence/04-positioned-outline/reopened/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..f1b4d4b7406639558bf98d5a2ee8e26424f06688 --- /dev/null +++ b/corpus/native/20260905-05/evidence/04-positioned-outline/reopened/pages/page-00.xml @@ -0,0 +1,7 @@ + +Fictitious: café, 東京, مرحبا]]> diff --git a/corpus/native/20260905-05/evidence/05-image/hierarchy.xml b/corpus/native/20260905-05/evidence/05-image/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..214d1bb2a51b4ba82ef35fd4f5bed8ddf6eeec00 --- /dev/null +++ b/corpus/native/20260905-05/evidence/05-image/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/05-image/native.json b/corpus/native/20260905-05/evidence/05-image/native.json new file mode 100644 index 0000000000000000000000000000000000000000..a9be9eb39675656166e743ec9e4db4411cdd1d99 --- /dev/null +++ b/corpus/native/20260905-05/evidence/05-image/native.json @@ -0,0 +1,12 @@ +{ + "fixture": "05-image", + "notebook_id": "{48D3CF06-7D14-487B-88C3-F8E48BE1A121}{1}{B0}", + "section_id": "{BDE7B8CE-74E2-0A61-198D-D2B08E3E4816}{1}{B0}", + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{91AE4B48-FD29-4970-9EEA-7A2172065409}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/05-image/pages/page-00.xml b/corpus/native/20260905-05/evidence/05-image/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..d183f39122a66c53ae7fb4bcdfbc5afb54ba198f --- /dev/null +++ b/corpus/native/20260905-05/evidence/05-image/pages/page-00.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/20260905-05/evidence/05-image/reopened/hierarchy.xml b/corpus/native/20260905-05/evidence/05-image/reopened/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..7d5f4ece67722931c25105d8fa775984ec6b8f0b --- /dev/null +++ b/corpus/native/20260905-05/evidence/05-image/reopened/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/05-image/reopened/native.json b/corpus/native/20260905-05/evidence/05-image/reopened/native.json new file mode 100644 index 0000000000000000000000000000000000000000..2753f90eafd17e46cbba13485c6b7755b725fa07 --- /dev/null +++ b/corpus/native/20260905-05/evidence/05-image/reopened/native.json @@ -0,0 +1,11 @@ +{ + "expected_page_count": 1, + "actual_page_count": 1, + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{B59254CB-C661-46C4-BB14-E73E598AA01C}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/05-image/reopened/pages/page-00.xml b/corpus/native/20260905-05/evidence/05-image/reopened/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..4ed76f4dba04e27199b229ca12640e53d3e3b16d --- /dev/null +++ b/corpus/native/20260905-05/evidence/05-image/reopened/pages/page-00.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/20260905-05/evidence/06-attachment/attachment.txt b/corpus/native/20260905-05/evidence/06-attachment/attachment.txt new file mode 120000 index 0000000000000000000000000000000000000000..80d33108154b94cf2eb494d920ee3acd6d9fe8b5 --- /dev/null +++ b/corpus/native/20260905-05/evidence/06-attachment/attachment.txt @@ -0,0 +1 @@ +../../assets/fictitious-attachment.txt \ No newline at end of file diff --git a/corpus/native/20260905-05/evidence/06-attachment/hierarchy.xml b/corpus/native/20260905-05/evidence/06-attachment/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..ef455b0912e54498cb2fd5ae96b6fb68bf2bc418 --- /dev/null +++ b/corpus/native/20260905-05/evidence/06-attachment/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/06-attachment/native.json b/corpus/native/20260905-05/evidence/06-attachment/native.json new file mode 100644 index 0000000000000000000000000000000000000000..e347f249bbfa1d988b43b88c65fceae0323de51f --- /dev/null +++ b/corpus/native/20260905-05/evidence/06-attachment/native.json @@ -0,0 +1,12 @@ +{ + "fixture": "06-attachment", + "notebook_id": "{97320152-F16F-4B23-9EE4-DAB12780CFC4}{1}{B0}", + "section_id": "{DBB044A3-E570-06B3-04CF-BDFD9C8021D8}{1}{B0}", + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{F7F9B725-6CBB-45A2-83A8-156C60B83DC7}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/06-attachment/pages/page-00.xml b/corpus/native/20260905-05/evidence/06-attachment/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..b43119c917d5d120c59e2d7dfb41d89e752cc8a3 --- /dev/null +++ b/corpus/native/20260905-05/evidence/06-attachment/pages/page-00.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/20260905-05/evidence/06-attachment/reopened/hierarchy.xml b/corpus/native/20260905-05/evidence/06-attachment/reopened/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..5b87810bdafb94410740ec193f11c5e3c0ac1af8 --- /dev/null +++ b/corpus/native/20260905-05/evidence/06-attachment/reopened/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/06-attachment/reopened/native.json b/corpus/native/20260905-05/evidence/06-attachment/reopened/native.json new file mode 100644 index 0000000000000000000000000000000000000000..5a45a0d75c0b8e036b871a9fcb889f868987195f --- /dev/null +++ b/corpus/native/20260905-05/evidence/06-attachment/reopened/native.json @@ -0,0 +1,11 @@ +{ + "expected_page_count": 1, + "actual_page_count": 1, + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{F772582B-D657-4623-B783-220CEA0E8CD7}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/06-attachment/reopened/pages/page-00.xml b/corpus/native/20260905-05/evidence/06-attachment/reopened/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..577ec495fc073444b3c3773e928ec3a8168a4cbd --- /dev/null +++ b/corpus/native/20260905-05/evidence/06-attachment/reopened/pages/page-00.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/20260905-05/evidence/07-table/hierarchy.xml b/corpus/native/20260905-05/evidence/07-table/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..edde66346d992762dc6c2651d24a243571df6f3d --- /dev/null +++ b/corpus/native/20260905-05/evidence/07-table/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/07-table/native.json b/corpus/native/20260905-05/evidence/07-table/native.json new file mode 100644 index 0000000000000000000000000000000000000000..721149a62714acb4ca3f17688fca248e2befcc8f --- /dev/null +++ b/corpus/native/20260905-05/evidence/07-table/native.json @@ -0,0 +1,12 @@ +{ + "fixture": "07-table", + "notebook_id": "{FF086732-4968-4A51-8C01-5EDFE6DA8207}{1}{B0}", + "section_id": "{11D22281-460E-0999-06F6-9BFE9C650DEB}{1}{B0}", + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{3D9BD107-CFC5-4A88-8191-336F605D11F4}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/07-table/pages/page-00.xml b/corpus/native/20260905-05/evidence/07-table/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..b8111d9b1160b48d42d1ed844370634978fdc12d --- /dev/null +++ b/corpus/native/20260905-05/evidence/07-table/pages/page-00.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/20260905-05/evidence/07-table/reopened/hierarchy.xml b/corpus/native/20260905-05/evidence/07-table/reopened/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..1b4142ed677e5a4d2459aff27cd1f9a760ff563d --- /dev/null +++ b/corpus/native/20260905-05/evidence/07-table/reopened/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/07-table/reopened/native.json b/corpus/native/20260905-05/evidence/07-table/reopened/native.json new file mode 100644 index 0000000000000000000000000000000000000000..b5b51f804d498bff155eeff07d06b652c7c611de --- /dev/null +++ b/corpus/native/20260905-05/evidence/07-table/reopened/native.json @@ -0,0 +1,11 @@ +{ + "expected_page_count": 1, + "actual_page_count": 1, + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{2227F5F8-03FB-4764-8375-21E165F5BE3D}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/07-table/reopened/pages/page-00.xml b/corpus/native/20260905-05/evidence/07-table/reopened/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6896184d4d78a8a0f1d3e9de8468e5e9ed498c8 --- /dev/null +++ b/corpus/native/20260905-05/evidence/07-table/reopened/pages/page-00.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/20260905-05/evidence/08-onepkg/hierarchy.xml b/corpus/native/20260905-05/evidence/08-onepkg/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..02b868f72680dd7fc4c2128599ab473ba02e60cc --- /dev/null +++ b/corpus/native/20260905-05/evidence/08-onepkg/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/08-onepkg/native.json b/corpus/native/20260905-05/evidence/08-onepkg/native.json new file mode 100644 index 0000000000000000000000000000000000000000..4dac0b6979060482c4e71705b04b3110f861667d --- /dev/null +++ b/corpus/native/20260905-05/evidence/08-onepkg/native.json @@ -0,0 +1,12 @@ +{ + "fixture": "08-onepkg", + "notebook_id": "{C8EE19AD-91E0-41CA-85E4-E878444124CF}{1}{B0}", + "section_id": "{C492F1FE-F062-01AA-3B64-DA544197518C}{1}{B0}", + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{E8DB0278-79A9-42BB-BC03-72C5BDAF4D93}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/08-onepkg/pages/page-00.xml b/corpus/native/20260905-05/evidence/08-onepkg/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..8039c924c3424afe9b153206607d4780aa697d2a --- /dev/null +++ b/corpus/native/20260905-05/evidence/08-onepkg/pages/page-00.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/20260905-05/evidence/08-onepkg/reopened/hierarchy.xml b/corpus/native/20260905-05/evidence/08-onepkg/reopened/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..f6445253cd0d34f6adc2ad6914ac183d126854c3 --- /dev/null +++ b/corpus/native/20260905-05/evidence/08-onepkg/reopened/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/20260905-05/evidence/08-onepkg/reopened/native.json b/corpus/native/20260905-05/evidence/08-onepkg/reopened/native.json new file mode 100644 index 0000000000000000000000000000000000000000..22f14b004de14917b64a395a24fa98fb122aec8e --- /dev/null +++ b/corpus/native/20260905-05/evidence/08-onepkg/reopened/native.json @@ -0,0 +1,11 @@ +{ + "expected_page_count": 1, + "actual_page_count": 1, + "hierarchy_file": "hierarchy.xml", + "pages": [ + { + "id": "{5B08FC72-6A3F-4765-BC20-335B8C8F3992}{1}{B0}", + "file": "pages\\\\page-00.xml" + } + ] +} diff --git a/corpus/native/20260905-05/evidence/08-onepkg/reopened/pages/page-00.xml b/corpus/native/20260905-05/evidence/08-onepkg/reopened/pages/page-00.xml new file mode 100644 index 0000000000000000000000000000000000000000..c11558f1aa99246d728b605d34bfbbb5a8a74130 --- /dev/null +++ b/corpus/native/20260905-05/evidence/08-onepkg/reopened/pages/page-00.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/20260905-05/inputs/02-text.xml b/corpus/native/20260905-05/inputs/02-text.xml new file mode 100644 index 0000000000000000000000000000000000000000..188e27ac0e4263d21ed80db35e55353fc317243a --- /dev/null +++ b/corpus/native/20260905-05/inputs/02-text.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/corpus/native/20260905-05/inputs/03-format-unicode.xml b/corpus/native/20260905-05/inputs/03-format-unicode.xml new file mode 100644 index 0000000000000000000000000000000000000000..b09f6a135135a9801adacfb77021bf53e062b9a5 --- /dev/null +++ b/corpus/native/20260905-05/inputs/03-format-unicode.xml @@ -0,0 +1 @@ +Fictitious: café, 東京, مرحبا]]> \ No newline at end of file diff --git a/corpus/native/20260905-05/inputs/04-positioned-outline.xml b/corpus/native/20260905-05/inputs/04-positioned-outline.xml new file mode 100644 index 0000000000000000000000000000000000000000..2d654fd62cf76e9f732415caad9ae30115d544a4 --- /dev/null +++ b/corpus/native/20260905-05/inputs/04-positioned-outline.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/corpus/native/20260905-05/inputs/05-image.xml b/corpus/native/20260905-05/inputs/05-image.xml new file mode 100644 index 0000000000000000000000000000000000000000..c6963c0bc574ac7b04ae46317525691a862ad18b --- /dev/null +++ b/corpus/native/20260905-05/inputs/05-image.xml @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoAAAAASUVORK5CYII= \ No newline at end of file diff --git a/corpus/native/20260905-05/inputs/06-attachment.xml b/corpus/native/20260905-05/inputs/06-attachment.xml new file mode 100644 index 0000000000000000000000000000000000000000..03d2017d6801601a9b8db7392da516a3fd762020 --- /dev/null +++ b/corpus/native/20260905-05/inputs/06-attachment.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/corpus/native/20260905-05/inputs/07-table.xml b/corpus/native/20260905-05/inputs/07-table.xml new file mode 100644 index 0000000000000000000000000000000000000000..394fe568c0bdf537c259c67a5ac2c793d2415933 --- /dev/null +++ b/corpus/native/20260905-05/inputs/07-table.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/corpus/native/20260905-05/manifest.json b/corpus/native/20260905-05/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..27e32b237db37bdb96802359d3adc77dd051abc1 --- /dev/null +++ b/corpus/native/20260905-05/manifest.json @@ -0,0 +1,132 @@ +{ + "format": "onenote-native-stage1-v1", + "status": "completed", + "root": "C:\\one-tests\\runs\\20260905-05", + "created_at_utc": "2026-09-05T05:06:51.6546507Z", + "office": { + "prog_id": "OneNote.Application", + "clsid": "{D7FAC39E-7FF1-49AA-98CF-A1DDD316337E}", + "local_server": "C:\\PROGRA~1\\MICROS~1\\Office14\\ONENOTE.EXE", + "executable": "C:\\PROGRA~1\\MICROS~1\\Office14\\ONENOTE.EXE", + "file_version": "14.0.7015.1000", + "xml_schema": "xs2010", + "xml_schema_value": 1, + "xml_namespace": "http://schemas.microsoft.com/office/onenote/2010/onenote" + }, + "harness": { + "source_path": "C:\\one-tests\\corpus-current.ps1", + "source_sha256": "2cd9906d578377b1a5e17fe92048feb7042936e38c00009a7b07850deee080d6" + }, + "notebook": { + "path": "notebook", + "section": "synthetic.one" + }, + "fixtures": [ + { + "name": "00-empty", + "status": "captured", + "description": "New notebook and section.", + "at_utc": "2026-09-05T05:06:54.3238034Z", + "details": { + "evidence": "evidence\\00-empty", + "reopened_evidence": "evidence\\00-empty\\reopened", + "snapshot": "snapshots\\00-empty" + } + }, + { + "name": "01-blank-page", + "status": "captured", + "description": "Blank page with no title.", + "at_utc": "2026-09-05T05:06:55.3868642Z", + "details": { + "evidence": "evidence\\01-blank-page", + "reopened_evidence": "evidence\\01-blank-page\\reopened", + "snapshot": "snapshots\\01-blank-page" + } + }, + { + "name": "02-text", + "status": "captured", + "description": "Plain text outline.", + "at_utc": "2026-09-05T05:06:56.2119114Z", + "details": { + "evidence": "evidence\\02-text", + "reopened_evidence": "evidence\\02-text\\reopened", + "snapshot": "snapshots\\02-text" + } + }, + { + "name": "03-format-unicode", + "status": "captured", + "description": "Formatted Unicode text replacing the fetched outline.", + "at_utc": "2026-09-05T05:06:57.3769780Z", + "details": { + "evidence": "evidence\\03-format-unicode", + "reopened_evidence": "evidence\\03-format-unicode\\reopened", + "snapshot": "snapshots\\03-format-unicode" + } + }, + { + "name": "04-positioned-outline", + "status": "captured", + "description": "Positioned text outline.", + "at_utc": "2026-09-05T05:06:58.2790296Z", + "details": { + "evidence": "evidence\\04-positioned-outline", + "reopened_evidence": "evidence\\04-positioned-outline\\reopened", + "snapshot": "snapshots\\04-positioned-outline" + } + }, + { + "name": "05-image", + "status": "captured", + "description": "Generated PNG in a positioned outline.", + "at_utc": "2026-09-05T05:06:59.3880930Z", + "details": { + "evidence": "evidence\\05-image", + "reopened_evidence": "evidence\\05-image\\reopened", + "snapshot": "snapshots\\05-image" + } + }, + { + "name": "06-attachment", + "status": "captured", + "description": "Generated attachment in a positioned outline.", + "at_utc": "2026-09-05T05:07:00.4511539Z", + "details": { + "evidence": "evidence\\06-attachment", + "reopened_evidence": "evidence\\06-attachment\\reopened", + "snapshot": "snapshots\\06-attachment" + } + }, + { + "name": "07-table", + "status": "captured", + "description": "Two-cell native table.", + "at_utc": "2026-09-05T05:07:01.4212093Z", + "details": { + "evidence": "evidence\\07-table", + "reopened_evidence": "evidence\\07-table\\reopened", + "snapshot": "snapshots\\07-table" + } + }, + { + "name": "08-onepkg", + "status": "captured", + "description": "Published OneNote package.", + "at_utc": "2026-09-05T05:07:03.4253240Z", + "details": { + "capture": { + "evidence": "evidence\\08-onepkg", + "reopened_evidence": "evidence\\08-onepkg\\reopened", + "snapshot": "snapshots\\08-onepkg" + }, + "bytes": 4564, + "sha256": "3ab9a28370cce2548d74c5d2e57af80c4e046bd847bbd770b46ab39eab81cc2e", + "package": "notebook.onepkg" + } + } + ], + "operation_log": "operation-log.jsonl", + "completed_at_utc": "2026-09-05T05:07:03.4673264Z" +} diff --git a/corpus/native/20260905-05/notebook.onepkg b/corpus/native/20260905-05/notebook.onepkg new file mode 100644 index 0000000000000000000000000000000000000000..cef0af41368aab66e01a8b625da26796ef798812 Binary files /dev/null and b/corpus/native/20260905-05/notebook.onepkg differ diff --git a/corpus/native/20260905-05/notebook/Open Notebook.onetoc2 b/corpus/native/20260905-05/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..a33d3bfd210f844e3db618e648ac898adeee09c6 Binary files /dev/null and b/corpus/native/20260905-05/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native/20260905-05/notebook/synthetic.one b/corpus/native/20260905-05/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..b7dcc3a99d47519fd6e3dc7504e292a2ef271955 Binary files /dev/null and b/corpus/native/20260905-05/notebook/synthetic.one differ diff --git a/corpus/native/20260905-05/operation-log.jsonl b/corpus/native/20260905-05/operation-log.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..3881f4ac6ea85178f082372ea7aaf19fe7ce28dc --- /dev/null +++ b/corpus/native/20260905-05/operation-log.jsonl @@ -0,0 +1,101 @@ +{"at_utc":"2026-09-05T05:06:52.3796922Z","fixture":"","action":"connect_com","details":{"prog_id":"OneNote.Application","schema":1}} +{"at_utc":"2026-09-05T05:06:52.4216946Z","fixture":"","action":"generate_assets","details":{"image":"assets\\fictitious-image.png","attachment":"assets\\fictitious-attachment.txt"}} +{"at_utc":"2026-09-05T05:06:52.4326952Z","fixture":"00-empty","action":"begin_fixture","details":{"description":"New notebook and section."}} +{"at_utc":"2026-09-05T05:06:52.6047051Z","fixture":"00-empty","action":"create_notebook_section","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","notebook_id":"{2D70D1EA-76FA-4896-9B5E-F9BB582364DB}{1}{B0}","section_id":"{1EA20A4B-1B17-4366-B87E-DA1D0DFC7A6B}{1}{B0}"}} +{"at_utc":"2026-09-05T05:06:52.8707203Z","fixture":"00-empty","action":"sync_hierarchy","details":{"notebook_id":"{2D70D1EA-76FA-4896-9B5E-F9BB582364DB}{1}{B0}","phase":"stabilize"}} +{"at_utc":"2026-09-05T05:06:52.9447245Z","fixture":"00-empty","action":"close_notebook","details":{"phase":"stabilize","notebook_id":"{2D70D1EA-76FA-4896-9B5E-F9BB582364DB}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:53.2587425Z","fixture":"00-empty","action":"copy_snapshot","details":{"file_count":2,"byte_count":8832,"sha256":"82f0f4c011de271c0ce91a385e38e09950b58f2ae08713e570ca71d4d09f5d0a"}} +{"at_utc":"2026-09-05T05:06:53.8387756Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":0,"notebook_id":"{D1F5A6FB-4A78-4C8A-87D0-3262527DD134}{1}{B0}","actual_page_count":0}} +{"at_utc":"2026-09-05T05:06:53.8997791Z","fixture":"00-empty","action":"capture_native_api","details":{"schema":1,"page_count":0}} +{"at_utc":"2026-09-05T05:06:53.9047794Z","fixture":"00-empty","action":"sync_hierarchy","details":{"notebook_id":"{D1F5A6FB-4A78-4C8A-87D0-3262527DD134}{1}{B0}","phase":"persist"}} +{"at_utc":"2026-09-05T05:06:53.9307809Z","fixture":"00-empty","action":"close_notebook","details":{"phase":"persist","notebook_id":"{D1F5A6FB-4A78-4C8A-87D0-3262527DD134}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:54.2858012Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":0,"notebook_id":"{80EC7AFC-536F-46CE-932F-B31F680CF2BD}{1}{B0}","actual_page_count":0}} +{"at_utc":"2026-09-05T05:06:54.3028022Z","fixture":"00-empty","action":"reopen_ready","details":{"expected_page_count":0,"actual_page_count":0}} +{"at_utc":"2026-09-05T05:06:54.3378042Z","fixture":"01-blank-page","action":"begin_fixture","details":{"description":"Blank page with no title."}} +{"at_utc":"2026-09-05T05:06:54.3858069Z","fixture":"01-blank-page","action":"create_new_page","details":{"style":"npsBlankPageNoTitle","page_id":"{58371A82-DF77-4D92-AC08-610A43B7B530}{1}{B0}","value":2}} +{"at_utc":"2026-09-05T05:06:54.4508107Z","fixture":"01-blank-page","action":"sync_hierarchy","details":{"notebook_id":"{80EC7AFC-536F-46CE-932F-B31F680CF2BD}{1}{B0}","phase":"stabilize"}} +{"at_utc":"2026-09-05T05:06:54.5848183Z","fixture":"01-blank-page","action":"close_notebook","details":{"phase":"stabilize","notebook_id":"{80EC7AFC-536F-46CE-932F-B31F680CF2BD}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:54.6398215Z","fixture":"01-blank-page","action":"copy_snapshot","details":{"file_count":2,"byte_count":12824,"sha256":"d7d7380c3e7861b2cc6ed59b4e548e860a75f80d8c186b381134bb47af3617df"}} +{"at_utc":"2026-09-05T05:06:54.9818410Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{EB00B959-9882-45B1-908C-44DFF6F2B55A}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:55.0178431Z","fixture":"01-blank-page","action":"capture_native_api","details":{"schema":1,"page_count":1}} +{"at_utc":"2026-09-05T05:06:55.0218433Z","fixture":"01-blank-page","action":"sync_hierarchy","details":{"notebook_id":"{EB00B959-9882-45B1-908C-44DFF6F2B55A}{1}{B0}","phase":"persist"}} +{"at_utc":"2026-09-05T05:06:55.0428445Z","fixture":"01-blank-page","action":"close_notebook","details":{"phase":"persist","notebook_id":"{EB00B959-9882-45B1-908C-44DFF6F2B55A}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:55.3348612Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{2BEBEE9E-4409-456D-B6DA-1EA6BADED53F}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:55.3828640Z","fixture":"01-blank-page","action":"reopen_ready","details":{"expected_page_count":1,"actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:55.3918645Z","fixture":"02-text","action":"begin_fixture","details":{"description":"Plain text outline."}} +{"at_utc":"2026-09-05T05:06:55.5818753Z","fixture":"02-text","action":"update_page_content","details":{"input":"inputs\\\\02-text.xml","page_id":"{911F02E6-1398-4E1F-902B-E534CB21DBE5}{1}{B0}","kind":"plain_text_outline"}} +{"at_utc":"2026-09-05T05:06:55.6258779Z","fixture":"02-text","action":"sync_hierarchy","details":{"notebook_id":"{2BEBEE9E-4409-456D-B6DA-1EA6BADED53F}{1}{B0}","phase":"stabilize"}} +{"at_utc":"2026-09-05T05:06:55.7138829Z","fixture":"02-text","action":"close_notebook","details":{"phase":"stabilize","notebook_id":"{2BEBEE9E-4409-456D-B6DA-1EA6BADED53F}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:55.7688860Z","fixture":"02-text","action":"copy_snapshot","details":{"file_count":2,"byte_count":16624,"sha256":"2d1c92b20e08b36ff4bf98314e3d214a4944430e0a0b0901423428da3f44d9f2"}} +{"at_utc":"2026-09-05T05:06:56.0979049Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{58149BE9-F814-428F-BBD2-FC45BCC296CF}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:56.1149058Z","fixture":"02-text","action":"capture_native_api","details":{"schema":1,"page_count":1}} +{"at_utc":"2026-09-05T05:06:56.1189061Z","fixture":"02-text","action":"sync_hierarchy","details":{"notebook_id":"{58149BE9-F814-428F-BBD2-FC45BCC296CF}{1}{B0}","phase":"persist"}} +{"at_utc":"2026-09-05T05:06:56.1369071Z","fixture":"02-text","action":"close_notebook","details":{"phase":"persist","notebook_id":"{58149BE9-F814-428F-BBD2-FC45BCC296CF}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:56.1919102Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{FA2408D8-760F-4B00-8794-DF83984C07B0}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:56.2079112Z","fixture":"02-text","action":"reopen_ready","details":{"expected_page_count":1,"actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:56.2169117Z","fixture":"03-format-unicode","action":"begin_fixture","details":{"description":"Formatted Unicode text replacing the fetched outline."}} +{"at_utc":"2026-09-05T05:06:56.4879272Z","fixture":"03-format-unicode","action":"update_page_content","details":{"input":"inputs\\\\03-format-unicode.xml","page_id":"{318E4E64-D5D5-408B-B701-8D88D0536D18}{1}{B0}","object_id":"{5642E6D8-9EA0-433D-B8F3-01532FCF8879}{10}{B0}","kind":"full_outline_replace"}} +{"at_utc":"2026-09-05T05:06:56.5289295Z","fixture":"03-format-unicode","action":"sync_hierarchy","details":{"notebook_id":"{FA2408D8-760F-4B00-8794-DF83984C07B0}{1}{B0}","phase":"stabilize"}} +{"at_utc":"2026-09-05T05:06:56.6189347Z","fixture":"03-format-unicode","action":"close_notebook","details":{"phase":"stabilize","notebook_id":"{FA2408D8-760F-4B00-8794-DF83984C07B0}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:56.6709376Z","fixture":"03-format-unicode","action":"copy_snapshot","details":{"file_count":2,"byte_count":19544,"sha256":"18f0f9cbe70375c370bc35fb0f1e56514e3f09da26e4a18b30e8c5db932a6eb1"}} +{"at_utc":"2026-09-05T05:06:56.9729549Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{A0DD33AA-0468-4676-A6E5-B9ECBA4C63E4}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:56.9939561Z","fixture":"03-format-unicode","action":"capture_native_api","details":{"schema":1,"page_count":1}} +{"at_utc":"2026-09-05T05:06:56.9979563Z","fixture":"03-format-unicode","action":"sync_hierarchy","details":{"notebook_id":"{A0DD33AA-0468-4676-A6E5-B9ECBA4C63E4}{1}{B0}","phase":"persist"}} +{"at_utc":"2026-09-05T05:06:57.0179575Z","fixture":"03-format-unicode","action":"close_notebook","details":{"phase":"persist","notebook_id":"{A0DD33AA-0468-4676-A6E5-B9ECBA4C63E4}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:57.3319754Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{4FF564B2-2F73-47D9-9140-0944C84A2A9F}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:57.3729778Z","fixture":"03-format-unicode","action":"reopen_ready","details":{"expected_page_count":1,"actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:57.3819783Z","fixture":"04-positioned-outline","action":"begin_fixture","details":{"description":"Positioned text outline."}} +{"at_utc":"2026-09-05T05:06:57.4279809Z","fixture":"04-positioned-outline","action":"update_page_content","details":{"y":96,"page_id":"{BC08407A-E46F-4D09-A789-565DF2DD72B0}{1}{B0}","input":"inputs\\\\04-positioned-outline.xml","x":144}} +{"at_utc":"2026-09-05T05:06:57.4559825Z","fixture":"04-positioned-outline","action":"sync_hierarchy","details":{"notebook_id":"{4FF564B2-2F73-47D9-9140-0944C84A2A9F}{1}{B0}","phase":"stabilize"}} +{"at_utc":"2026-09-05T05:06:57.5229864Z","fixture":"04-positioned-outline","action":"close_notebook","details":{"phase":"stabilize","notebook_id":"{4FF564B2-2F73-47D9-9140-0944C84A2A9F}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:57.5799896Z","fixture":"04-positioned-outline","action":"copy_snapshot","details":{"file_count":2,"byte_count":20368,"sha256":"95446de023992c6dd8557d57c9992eca81565b14fc7b664f8865e0f725ce2e5a"}} +{"at_utc":"2026-09-05T05:06:57.8840070Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{D8DBA7A8-AE6E-4BAF-B8D6-4829E1133A50}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:57.9010080Z","fixture":"04-positioned-outline","action":"capture_native_api","details":{"schema":1,"page_count":1}} +{"at_utc":"2026-09-05T05:06:57.9050082Z","fixture":"04-positioned-outline","action":"sync_hierarchy","details":{"notebook_id":"{D8DBA7A8-AE6E-4BAF-B8D6-4829E1133A50}{1}{B0}","phase":"persist"}} +{"at_utc":"2026-09-05T05:06:57.9240093Z","fixture":"04-positioned-outline","action":"close_notebook","details":{"phase":"persist","notebook_id":"{D8DBA7A8-AE6E-4BAF-B8D6-4829E1133A50}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:58.2330270Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{8F6D3029-F262-4184-8607-BB24A0DF2C89}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:58.2750294Z","fixture":"04-positioned-outline","action":"reopen_ready","details":{"expected_page_count":1,"actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:58.2850300Z","fixture":"05-image","action":"begin_fixture","details":{"description":"Generated PNG in a positioned outline."}} +{"at_utc":"2026-09-05T05:06:58.3830356Z","fixture":"05-image","action":"update_page_content","details":{"y":192,"input":"inputs\\\\05-image.xml","page_id":"{26228515-D185-46B8-BD44-853D77018EDC}{1}{B0}","asset":"assets\\fictitious-image.png","x":144}} +{"at_utc":"2026-09-05T05:06:58.4830413Z","fixture":"05-image","action":"sync_hierarchy","details":{"notebook_id":"{8F6D3029-F262-4184-8607-BB24A0DF2C89}{1}{B0}","phase":"stabilize"}} +{"at_utc":"2026-09-05T05:06:58.5210435Z","fixture":"05-image","action":"close_notebook","details":{"phase":"stabilize","notebook_id":"{8F6D3029-F262-4184-8607-BB24A0DF2C89}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:58.6090485Z","fixture":"05-image","action":"copy_snapshot","details":{"file_count":2,"byte_count":22960,"sha256":"f0954ac3b586c8372b7f8da0821c668364ccb591aabbd2b59ebd431ede713245"}} +{"at_utc":"2026-09-05T05:06:59.0050711Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{48D3CF06-7D14-487B-88C3-F8E48BE1A121}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:59.0230722Z","fixture":"05-image","action":"capture_native_api","details":{"schema":1,"page_count":1}} +{"at_utc":"2026-09-05T05:06:59.0270724Z","fixture":"05-image","action":"sync_hierarchy","details":{"notebook_id":"{48D3CF06-7D14-487B-88C3-F8E48BE1A121}{1}{B0}","phase":"persist"}} +{"at_utc":"2026-09-05T05:06:59.0470735Z","fixture":"05-image","action":"close_notebook","details":{"phase":"persist","notebook_id":"{48D3CF06-7D14-487B-88C3-F8E48BE1A121}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:59.3650917Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{2564F4D2-105C-4565-8A9B-A60B80FC54F0}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:59.3840928Z","fixture":"05-image","action":"reopen_ready","details":{"expected_page_count":1,"actual_page_count":1}} +{"at_utc":"2026-09-05T05:06:59.3950934Z","fixture":"06-attachment","action":"begin_fixture","details":{"description":"Generated attachment in a positioned outline."}} +{"at_utc":"2026-09-05T05:06:59.6001052Z","fixture":"06-attachment","action":"update_page_content","details":{"y":192,"input":"inputs\\\\06-attachment.xml","page_id":"{B59254CB-C661-46C4-BB14-E73E598AA01C}{1}{B0}","asset":"assets\\fictitious-attachment.txt","x":264}} +{"at_utc":"2026-09-05T05:06:59.6331071Z","fixture":"06-attachment","action":"sync_hierarchy","details":{"notebook_id":"{2564F4D2-105C-4565-8A9B-A60B80FC54F0}{1}{B0}","phase":"stabilize"}} +{"at_utc":"2026-09-05T05:06:59.6811098Z","fixture":"06-attachment","action":"close_notebook","details":{"phase":"stabilize","notebook_id":"{2564F4D2-105C-4565-8A9B-A60B80FC54F0}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:06:59.7351129Z","fixture":"06-attachment","action":"copy_snapshot","details":{"file_count":2,"byte_count":26048,"sha256":"a295434c5907913601c5299febb9b24aab9e54665be11cc0f6ecceb7c0cf5a96"}} +{"at_utc":"2026-09-05T05:07:00.0421305Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{97320152-F16F-4B23-9EE4-DAB12780CFC4}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:07:00.0671319Z","fixture":"06-attachment","action":"capture_attachment_cache","details":{"bytes":43}} +{"at_utc":"2026-09-05T05:07:00.0991337Z","fixture":"06-attachment","action":"capture_native_api","details":{"schema":1,"page_count":1}} +{"at_utc":"2026-09-05T05:07:00.1031339Z","fixture":"06-attachment","action":"sync_hierarchy","details":{"notebook_id":"{97320152-F16F-4B23-9EE4-DAB12780CFC4}{1}{B0}","phase":"persist"}} +{"at_utc":"2026-09-05T05:07:00.1221350Z","fixture":"06-attachment","action":"close_notebook","details":{"phase":"persist","notebook_id":"{97320152-F16F-4B23-9EE4-DAB12780CFC4}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:07:00.4291526Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{6E4BD2A7-26FC-4985-94A3-8ECC2081F131}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:07:00.4471536Z","fixture":"06-attachment","action":"reopen_ready","details":{"expected_page_count":1,"actual_page_count":1}} +{"at_utc":"2026-09-05T05:07:00.4571542Z","fixture":"07-table","action":"begin_fixture","details":{"description":"Two-cell native table."}} +{"at_utc":"2026-09-05T05:07:00.5621602Z","fixture":"07-table","action":"update_page_content","details":{"y":312,"kind":"two_cell_table","page_id":"{F772582B-D657-4623-B783-220CEA0E8CD7}{1}{B0}","input":"inputs\\\\07-table.xml","x":144}} +{"at_utc":"2026-09-05T05:07:00.6081628Z","fixture":"07-table","action":"sync_hierarchy","details":{"notebook_id":"{6E4BD2A7-26FC-4985-94A3-8ECC2081F131}{1}{B0}","phase":"stabilize"}} +{"at_utc":"2026-09-05T05:07:00.6761667Z","fixture":"07-table","action":"close_notebook","details":{"phase":"stabilize","notebook_id":"{6E4BD2A7-26FC-4985-94A3-8ECC2081F131}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:07:00.7301698Z","fixture":"07-table","action":"copy_snapshot","details":{"file_count":2,"byte_count":28304,"sha256":"6bcc61b560f2f32595a5fd8311c58c8ba5417b6ae182d99f73f274181583f9e3"}} +{"at_utc":"2026-09-05T05:07:01.0431877Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{FF086732-4968-4A51-8C01-5EDFE6DA8207}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:07:01.0601887Z","fixture":"07-table","action":"capture_native_api","details":{"schema":1,"page_count":1}} +{"at_utc":"2026-09-05T05:07:01.0641889Z","fixture":"07-table","action":"sync_hierarchy","details":{"notebook_id":"{FF086732-4968-4A51-8C01-5EDFE6DA8207}{1}{B0}","phase":"persist"}} +{"at_utc":"2026-09-05T05:07:01.0831900Z","fixture":"07-table","action":"close_notebook","details":{"phase":"persist","notebook_id":"{FF086732-4968-4A51-8C01-5EDFE6DA8207}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:07:01.3982080Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{FF93F995-F8D1-4378-98BA-17D0BE52B0CF}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:07:01.4172091Z","fixture":"07-table","action":"reopen_ready","details":{"expected_page_count":1,"actual_page_count":1}} +{"at_utc":"2026-09-05T05:07:02.5242724Z","fixture":"08-onepkg","action":"sync_hierarchy","details":{"notebook_id":"{FF93F995-F8D1-4378-98BA-17D0BE52B0CF}{1}{B0}","phase":"stabilize"}} +{"at_utc":"2026-09-05T05:07:02.5472737Z","fixture":"08-onepkg","action":"close_notebook","details":{"phase":"stabilize","notebook_id":"{FF93F995-F8D1-4378-98BA-17D0BE52B0CF}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:07:02.6012768Z","fixture":"08-onepkg","action":"copy_snapshot","details":{"file_count":2,"byte_count":28304,"sha256":"6bcc61b560f2f32595a5fd8311c58c8ba5417b6ae182d99f73f274181583f9e3"}} +{"at_utc":"2026-09-05T05:07:02.9682978Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{C8EE19AD-91E0-41CA-85E4-E878444124CF}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:07:02.9902991Z","fixture":"08-onepkg","action":"capture_native_api","details":{"schema":1,"page_count":1}} +{"at_utc":"2026-09-05T05:07:02.9952994Z","fixture":"08-onepkg","action":"sync_hierarchy","details":{"notebook_id":"{C8EE19AD-91E0-41CA-85E4-E878444124CF}{1}{B0}","phase":"persist"}} +{"at_utc":"2026-09-05T05:07:03.0133004Z","fixture":"08-onepkg","action":"close_notebook","details":{"phase":"persist","notebook_id":"{C8EE19AD-91E0-41CA-85E4-E878444124CF}{1}{B0}","confirmed":true}} +{"at_utc":"2026-09-05T05:07:03.3783213Z","fixture":"","action":"open_notebook","details":{"path":"C:\\one-tests\\runs\\20260905-05\\notebook","expected_page_count":1,"notebook_id":"{CB79D4B5-DEB0-4C2C-A11A-398AC498FECD}{1}{B0}","actual_page_count":1}} +{"at_utc":"2026-09-05T05:07:03.4213237Z","fixture":"08-onepkg","action":"reopen_ready","details":{"expected_page_count":1,"actual_page_count":1}} +{"at_utc":"2026-09-05T05:07:03.4353245Z","fixture":"08-onepkg","action":"publish_package","details":{"bytes":4564,"sha256":"3ab9a28370cce2548d74c5d2e57af80c4e046bd847bbd770b46ab39eab81cc2e","package":"notebook.onepkg"}} diff --git a/corpus/native/20260905-05/snapshots/00-empty/notebook/Open Notebook.onetoc2 b/corpus/native/20260905-05/snapshots/00-empty/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..bc99fc30f611c338575197d5f013fa6752d3886a --- /dev/null +++ b/corpus/native/20260905-05/snapshots/00-empty/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/00-empty/notebook/synthetic.one b/corpus/native/20260905-05/snapshots/00-empty/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..88f488fb6ac0182b41f2acf1f1ad56b4177efd44 Binary files /dev/null and b/corpus/native/20260905-05/snapshots/00-empty/notebook/synthetic.one differ diff --git a/corpus/native/20260905-05/snapshots/00-empty/snapshot.json b/corpus/native/20260905-05/snapshots/00-empty/snapshot.json new file mode 100644 index 0000000000000000000000000000000000000000..dab56317c476ca40a5241cb08d7d4b43f0f3b0b9 --- /dev/null +++ b/corpus/native/20260905-05/snapshots/00-empty/snapshot.json @@ -0,0 +1,29 @@ +{ + "source_before": { + "file_count": 2, + "byte_count": 8832, + "sha256": "82f0f4c011de271c0ce91a385e38e09950b58f2ae08713e570ca71d4d09f5d0a" + }, + "copied": { + "file_count": 2, + "byte_count": 8832, + "sha256": "82f0f4c011de271c0ce91a385e38e09950b58f2ae08713e570ca71d4d09f5d0a" + }, + "source_after": { + "file_count": 2, + "byte_count": 8832, + "sha256": "82f0f4c011de271c0ce91a385e38e09950b58f2ae08713e570ca71d4d09f5d0a" + }, + "files": [ + { + "path": "Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "synthetic.one", + "bytes": 4016, + "sha256": "c68a53117d80b3acde6b789e67d17e6dcd360ab1bc6571e521082ab181fa1682" + } + ] +} diff --git a/corpus/native/20260905-05/snapshots/01-blank-page/notebook/Open Notebook.onetoc2 b/corpus/native/20260905-05/snapshots/01-blank-page/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..bc99fc30f611c338575197d5f013fa6752d3886a --- /dev/null +++ b/corpus/native/20260905-05/snapshots/01-blank-page/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/01-blank-page/notebook/synthetic.one b/corpus/native/20260905-05/snapshots/01-blank-page/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..bdc22b6714b8767d6c8932216b76e51c154ccb09 Binary files /dev/null and b/corpus/native/20260905-05/snapshots/01-blank-page/notebook/synthetic.one differ diff --git a/corpus/native/20260905-05/snapshots/01-blank-page/snapshot.json b/corpus/native/20260905-05/snapshots/01-blank-page/snapshot.json new file mode 100644 index 0000000000000000000000000000000000000000..b88124dfe0f1f89a22bd068bb20f9cf676686e42 --- /dev/null +++ b/corpus/native/20260905-05/snapshots/01-blank-page/snapshot.json @@ -0,0 +1,29 @@ +{ + "source_before": { + "file_count": 2, + "byte_count": 12824, + "sha256": "d7d7380c3e7861b2cc6ed59b4e548e860a75f80d8c186b381134bb47af3617df" + }, + "copied": { + "file_count": 2, + "byte_count": 12824, + "sha256": "d7d7380c3e7861b2cc6ed59b4e548e860a75f80d8c186b381134bb47af3617df" + }, + "source_after": { + "file_count": 2, + "byte_count": 12824, + "sha256": "d7d7380c3e7861b2cc6ed59b4e548e860a75f80d8c186b381134bb47af3617df" + }, + "files": [ + { + "path": "Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "synthetic.one", + "bytes": 8008, + "sha256": "2a726875c73b0de5827e3bf66fc810d66418622c1e35d43dcf1e96f948f7fbc3" + } + ] +} diff --git a/corpus/native/20260905-05/snapshots/02-text/notebook/Open Notebook.onetoc2 b/corpus/native/20260905-05/snapshots/02-text/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..bc99fc30f611c338575197d5f013fa6752d3886a --- /dev/null +++ b/corpus/native/20260905-05/snapshots/02-text/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one b/corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..faf12267517d45b287d8dc0d8b96b8fc1633723a Binary files /dev/null and b/corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one differ diff --git a/corpus/native/20260905-05/snapshots/02-text/snapshot.json b/corpus/native/20260905-05/snapshots/02-text/snapshot.json new file mode 100644 index 0000000000000000000000000000000000000000..42df8492507f8180ab1c937d44e57584a0cda933 --- /dev/null +++ b/corpus/native/20260905-05/snapshots/02-text/snapshot.json @@ -0,0 +1,29 @@ +{ + "source_before": { + "file_count": 2, + "byte_count": 16624, + "sha256": "2d1c92b20e08b36ff4bf98314e3d214a4944430e0a0b0901423428da3f44d9f2" + }, + "copied": { + "file_count": 2, + "byte_count": 16624, + "sha256": "2d1c92b20e08b36ff4bf98314e3d214a4944430e0a0b0901423428da3f44d9f2" + }, + "source_after": { + "file_count": 2, + "byte_count": 16624, + "sha256": "2d1c92b20e08b36ff4bf98314e3d214a4944430e0a0b0901423428da3f44d9f2" + }, + "files": [ + { + "path": "Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "synthetic.one", + "bytes": 11808, + "sha256": "2237e5fdfeb8d71410b585159bdfb6724599f40dfcda2795794d8e1e47a20058" + } + ] +} diff --git a/corpus/native/20260905-05/snapshots/03-format-unicode/notebook/Open Notebook.onetoc2 b/corpus/native/20260905-05/snapshots/03-format-unicode/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..bc99fc30f611c338575197d5f013fa6752d3886a --- /dev/null +++ b/corpus/native/20260905-05/snapshots/03-format-unicode/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one b/corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..5d2750c99ac4739e1554d136fc975cfa477e53c6 Binary files /dev/null and b/corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one differ diff --git a/corpus/native/20260905-05/snapshots/03-format-unicode/snapshot.json b/corpus/native/20260905-05/snapshots/03-format-unicode/snapshot.json new file mode 100644 index 0000000000000000000000000000000000000000..237dcc639ac3b006a5243e72de842978e3d93801 --- /dev/null +++ b/corpus/native/20260905-05/snapshots/03-format-unicode/snapshot.json @@ -0,0 +1,29 @@ +{ + "source_before": { + "file_count": 2, + "byte_count": 19544, + "sha256": "18f0f9cbe70375c370bc35fb0f1e56514e3f09da26e4a18b30e8c5db932a6eb1" + }, + "copied": { + "file_count": 2, + "byte_count": 19544, + "sha256": "18f0f9cbe70375c370bc35fb0f1e56514e3f09da26e4a18b30e8c5db932a6eb1" + }, + "source_after": { + "file_count": 2, + "byte_count": 19544, + "sha256": "18f0f9cbe70375c370bc35fb0f1e56514e3f09da26e4a18b30e8c5db932a6eb1" + }, + "files": [ + { + "path": "Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "synthetic.one", + "bytes": 14728, + "sha256": "65299c48ccd7d0c59a09f1fc9f770e45611bf8fa14f89ddf1b0aedbbab5ef7fe" + } + ] +} diff --git a/corpus/native/20260905-05/snapshots/04-positioned-outline/notebook/Open Notebook.onetoc2 b/corpus/native/20260905-05/snapshots/04-positioned-outline/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..bc99fc30f611c338575197d5f013fa6752d3886a --- /dev/null +++ b/corpus/native/20260905-05/snapshots/04-positioned-outline/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/04-positioned-outline/notebook/synthetic.one b/corpus/native/20260905-05/snapshots/04-positioned-outline/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..bc23a3e3242a3ab60869b4cce5470d921b24f95f Binary files /dev/null and b/corpus/native/20260905-05/snapshots/04-positioned-outline/notebook/synthetic.one differ diff --git a/corpus/native/20260905-05/snapshots/04-positioned-outline/snapshot.json b/corpus/native/20260905-05/snapshots/04-positioned-outline/snapshot.json new file mode 100644 index 0000000000000000000000000000000000000000..88076c8794f49b856b9b2c2da34d3fdb07f941cc --- /dev/null +++ b/corpus/native/20260905-05/snapshots/04-positioned-outline/snapshot.json @@ -0,0 +1,29 @@ +{ + "source_before": { + "file_count": 2, + "byte_count": 20368, + "sha256": "95446de023992c6dd8557d57c9992eca81565b14fc7b664f8865e0f725ce2e5a" + }, + "copied": { + "file_count": 2, + "byte_count": 20368, + "sha256": "95446de023992c6dd8557d57c9992eca81565b14fc7b664f8865e0f725ce2e5a" + }, + "source_after": { + "file_count": 2, + "byte_count": 20368, + "sha256": "95446de023992c6dd8557d57c9992eca81565b14fc7b664f8865e0f725ce2e5a" + }, + "files": [ + { + "path": "Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "synthetic.one", + "bytes": 15552, + "sha256": "291ba06c6c9ac3ff79fab0e91410610db4d2bed5762dd515eba96386715b1f61" + } + ] +} diff --git a/corpus/native/20260905-05/snapshots/05-image/notebook/Open Notebook.onetoc2 b/corpus/native/20260905-05/snapshots/05-image/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..bc99fc30f611c338575197d5f013fa6752d3886a --- /dev/null +++ b/corpus/native/20260905-05/snapshots/05-image/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/05-image/notebook/synthetic.one b/corpus/native/20260905-05/snapshots/05-image/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..7aebc7ac33f9a605a246f489cf287e17f248a81d Binary files /dev/null and b/corpus/native/20260905-05/snapshots/05-image/notebook/synthetic.one differ diff --git a/corpus/native/20260905-05/snapshots/05-image/snapshot.json b/corpus/native/20260905-05/snapshots/05-image/snapshot.json new file mode 100644 index 0000000000000000000000000000000000000000..bd5a5dc7c8a1ebbaa05b0548d1b45c13ff496ff9 --- /dev/null +++ b/corpus/native/20260905-05/snapshots/05-image/snapshot.json @@ -0,0 +1,29 @@ +{ + "source_before": { + "file_count": 2, + "byte_count": 22960, + "sha256": "f0954ac3b586c8372b7f8da0821c668364ccb591aabbd2b59ebd431ede713245" + }, + "copied": { + "file_count": 2, + "byte_count": 22960, + "sha256": "f0954ac3b586c8372b7f8da0821c668364ccb591aabbd2b59ebd431ede713245" + }, + "source_after": { + "file_count": 2, + "byte_count": 22960, + "sha256": "f0954ac3b586c8372b7f8da0821c668364ccb591aabbd2b59ebd431ede713245" + }, + "files": [ + { + "path": "Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "synthetic.one", + "bytes": 18144, + "sha256": "67e662d4bbe765f407ddfce226d635d945be2a1a9b2ba7a4b93ca32375c32b8a" + } + ] +} diff --git a/corpus/native/20260905-05/snapshots/06-attachment/notebook/Open Notebook.onetoc2 b/corpus/native/20260905-05/snapshots/06-attachment/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..bc99fc30f611c338575197d5f013fa6752d3886a --- /dev/null +++ b/corpus/native/20260905-05/snapshots/06-attachment/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/06-attachment/notebook/synthetic.one b/corpus/native/20260905-05/snapshots/06-attachment/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..ecf3614f10bfd93f8a6f3f124cd9ee01d54c50f8 Binary files /dev/null and b/corpus/native/20260905-05/snapshots/06-attachment/notebook/synthetic.one differ diff --git a/corpus/native/20260905-05/snapshots/06-attachment/snapshot.json b/corpus/native/20260905-05/snapshots/06-attachment/snapshot.json new file mode 100644 index 0000000000000000000000000000000000000000..285d8212f3c9d9c26f31eb30683940f3064b24af --- /dev/null +++ b/corpus/native/20260905-05/snapshots/06-attachment/snapshot.json @@ -0,0 +1,29 @@ +{ + "source_before": { + "file_count": 2, + "byte_count": 26048, + "sha256": "a295434c5907913601c5299febb9b24aab9e54665be11cc0f6ecceb7c0cf5a96" + }, + "copied": { + "file_count": 2, + "byte_count": 26048, + "sha256": "a295434c5907913601c5299febb9b24aab9e54665be11cc0f6ecceb7c0cf5a96" + }, + "source_after": { + "file_count": 2, + "byte_count": 26048, + "sha256": "a295434c5907913601c5299febb9b24aab9e54665be11cc0f6ecceb7c0cf5a96" + }, + "files": [ + { + "path": "Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "synthetic.one", + "bytes": 21232, + "sha256": "75980a1130e35dcb7a913936c63bbbb70c5499bb260a3fc4f718bc89360e5516" + } + ] +} diff --git a/corpus/native/20260905-05/snapshots/07-table/notebook/Open Notebook.onetoc2 b/corpus/native/20260905-05/snapshots/07-table/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..bc99fc30f611c338575197d5f013fa6752d3886a --- /dev/null +++ b/corpus/native/20260905-05/snapshots/07-table/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/07-table/notebook/synthetic.one b/corpus/native/20260905-05/snapshots/07-table/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..aa90aa0232315b864c6ffdc5cc55264f08380fcf --- /dev/null +++ b/corpus/native/20260905-05/snapshots/07-table/notebook/synthetic.one @@ -0,0 +1 @@ +../../../notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/07-table/snapshot.json b/corpus/native/20260905-05/snapshots/07-table/snapshot.json new file mode 100644 index 0000000000000000000000000000000000000000..8a1c7fda4c2691ea37dcc1238bbd31974fbb2162 --- /dev/null +++ b/corpus/native/20260905-05/snapshots/07-table/snapshot.json @@ -0,0 +1,29 @@ +{ + "source_before": { + "file_count": 2, + "byte_count": 28304, + "sha256": "6bcc61b560f2f32595a5fd8311c58c8ba5417b6ae182d99f73f274181583f9e3" + }, + "copied": { + "file_count": 2, + "byte_count": 28304, + "sha256": "6bcc61b560f2f32595a5fd8311c58c8ba5417b6ae182d99f73f274181583f9e3" + }, + "source_after": { + "file_count": 2, + "byte_count": 28304, + "sha256": "6bcc61b560f2f32595a5fd8311c58c8ba5417b6ae182d99f73f274181583f9e3" + }, + "files": [ + { + "path": "Open Notebook.onetoc2", + "bytes": 4816, + "sha256": "b2f857961b76258a1582b402c048b340e89962257681426b3bfc58df8e0adbfa" + }, + { + "path": "synthetic.one", + "bytes": 23488, + "sha256": "65ac8ff8421e424a7ac05599284ca66cbcdbec131dce4c21700b2e65d89d0925" + } + ] +} diff --git a/corpus/native/20260905-05/snapshots/08-onepkg/notebook/Open Notebook.onetoc2 b/corpus/native/20260905-05/snapshots/08-onepkg/notebook/Open Notebook.onetoc2 new file mode 120000 index 0000000000000000000000000000000000000000..bc99fc30f611c338575197d5f013fa6752d3886a --- /dev/null +++ b/corpus/native/20260905-05/snapshots/08-onepkg/notebook/Open Notebook.onetoc2 @@ -0,0 +1 @@ +../../../notebook/Open Notebook.onetoc2 \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/08-onepkg/notebook/synthetic.one b/corpus/native/20260905-05/snapshots/08-onepkg/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..aa90aa0232315b864c6ffdc5cc55264f08380fcf --- /dev/null +++ b/corpus/native/20260905-05/snapshots/08-onepkg/notebook/synthetic.one @@ -0,0 +1 @@ +../../../notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/20260905-05/snapshots/08-onepkg/snapshot.json b/corpus/native/20260905-05/snapshots/08-onepkg/snapshot.json new file mode 120000 index 0000000000000000000000000000000000000000..df0019299eb0a3b1ce69f98b4cf7d59b0b9c011a --- /dev/null +++ b/corpus/native/20260905-05/snapshots/08-onepkg/snapshot.json @@ -0,0 +1 @@ +../07-table/snapshot.json \ No newline at end of file diff --git a/corpus/native/cold-05-00-empty/notebook/Open Notebook.one b/corpus/native/cold-05-00-empty/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..f9657a457aa1bfe9499502c1f9235d67877bca4c Binary files /dev/null and b/corpus/native/cold-05-00-empty/notebook/Open Notebook.one differ diff --git a/corpus/native/cold-05-00-empty/notebook/Open Notebook.onetoc2 b/corpus/native/cold-05-00-empty/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..2a940bb48a2135d11a91f9c0b744c23744ab712e Binary files /dev/null and b/corpus/native/cold-05-00-empty/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native/cold-05-00-empty/notebook/synthetic.one b/corpus/native/cold-05-00-empty/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..5dc431da454a3923ddef367ea4c25255b28c5564 --- /dev/null +++ b/corpus/native/cold-05-00-empty/notebook/synthetic.one @@ -0,0 +1 @@ +../../20260905-05/snapshots/00-empty/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/cold-05-00-empty/read/hierarchy.xml b/corpus/native/cold-05-00-empty/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..ab62184b6c81a7d87248ff58ab49e73123a23944 --- /dev/null +++ b/corpus/native/cold-05-00-empty/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-01-blank-page/notebook/Open Notebook.one b/corpus/native/cold-05-01-blank-page/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..5cdfd29af113dae65b5ffbc71accf0a2f78ee8f0 Binary files /dev/null and b/corpus/native/cold-05-01-blank-page/notebook/Open Notebook.one differ diff --git a/corpus/native/cold-05-01-blank-page/notebook/Open Notebook.onetoc2 b/corpus/native/cold-05-01-blank-page/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..dcabd60c06136f6a4a5ca0ea311d60556b771a75 Binary files /dev/null and b/corpus/native/cold-05-01-blank-page/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native/cold-05-01-blank-page/notebook/synthetic.one b/corpus/native/cold-05-01-blank-page/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..b03b37c0a88cd71d2560bb9f423476062ff17ad1 --- /dev/null +++ b/corpus/native/cold-05-01-blank-page/notebook/synthetic.one @@ -0,0 +1 @@ +../../20260905-05/snapshots/01-blank-page/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/cold-05-01-blank-page/read/hierarchy.xml b/corpus/native/cold-05-01-blank-page/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..228335ffcea4874dc7d94d0413eb2e1ae55c02e6 --- /dev/null +++ b/corpus/native/cold-05-01-blank-page/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-01-blank-page/read/page-000.xml b/corpus/native/cold-05-01-blank-page/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..71e1d43e867639a87b654513db80a783cac0748c --- /dev/null +++ b/corpus/native/cold-05-01-blank-page/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-02-text/notebook/Open Notebook.one b/corpus/native/cold-05-02-text/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..f3b4f4fe11087e2bd34a64e993225a65bd2945e4 Binary files /dev/null and b/corpus/native/cold-05-02-text/notebook/Open Notebook.one differ diff --git a/corpus/native/cold-05-02-text/notebook/Open Notebook.onetoc2 b/corpus/native/cold-05-02-text/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..4708c95485c11e94af0f36677c43905a383d395b Binary files /dev/null and b/corpus/native/cold-05-02-text/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native/cold-05-02-text/notebook/synthetic.one b/corpus/native/cold-05-02-text/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..56c6136e57d18b2dfca322122b6aabce33c06c1d --- /dev/null +++ b/corpus/native/cold-05-02-text/notebook/synthetic.one @@ -0,0 +1 @@ +../../20260905-05/snapshots/02-text/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/cold-05-02-text/read/hierarchy.xml b/corpus/native/cold-05-02-text/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e502be8eddcf7405716b4b86b12c48f22a8fcc5 --- /dev/null +++ b/corpus/native/cold-05-02-text/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-02-text/read/page-000.xml b/corpus/native/cold-05-02-text/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..cabfe92663f6b243c4a7083cf29b1a5e082943c8 --- /dev/null +++ b/corpus/native/cold-05-02-text/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-03-format-unicode/notebook/Open Notebook.one b/corpus/native/cold-05-03-format-unicode/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..848bf55405b90944be4fb61fef6273f3dfd8e02d Binary files /dev/null and b/corpus/native/cold-05-03-format-unicode/notebook/Open Notebook.one differ diff --git a/corpus/native/cold-05-03-format-unicode/notebook/Open Notebook.onetoc2 b/corpus/native/cold-05-03-format-unicode/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..25f9258a8b6248560a0315729fc74e44112dd102 Binary files /dev/null and b/corpus/native/cold-05-03-format-unicode/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native/cold-05-03-format-unicode/notebook/synthetic.one b/corpus/native/cold-05-03-format-unicode/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..eff673cfde6afa1c64aeab722d7882126aa87895 --- /dev/null +++ b/corpus/native/cold-05-03-format-unicode/notebook/synthetic.one @@ -0,0 +1 @@ +../../20260905-05/snapshots/03-format-unicode/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/cold-05-03-format-unicode/read/hierarchy.xml b/corpus/native/cold-05-03-format-unicode/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..570de3538c250c7423d6c086d284410d5df23fcd --- /dev/null +++ b/corpus/native/cold-05-03-format-unicode/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-03-format-unicode/read/page-000.xml b/corpus/native/cold-05-03-format-unicode/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..a48b52e806de2cec9a3995b42ad30c93b741bca1 --- /dev/null +++ b/corpus/native/cold-05-03-format-unicode/read/page-000.xml @@ -0,0 +1,7 @@ + +Fictitious: café, 東京, مرحبا]]> diff --git a/corpus/native/cold-05-04-positioned-outline/notebook/Open Notebook.one b/corpus/native/cold-05-04-positioned-outline/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..fd6d12332215fcb7f06b2b0bada33e0ad97dc6ca Binary files /dev/null and b/corpus/native/cold-05-04-positioned-outline/notebook/Open Notebook.one differ diff --git a/corpus/native/cold-05-04-positioned-outline/notebook/Open Notebook.onetoc2 b/corpus/native/cold-05-04-positioned-outline/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..12633f3984177f1abe1c65f62f8208cc67d92c24 Binary files /dev/null and b/corpus/native/cold-05-04-positioned-outline/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native/cold-05-04-positioned-outline/notebook/synthetic.one b/corpus/native/cold-05-04-positioned-outline/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..58bfd15cc562b67dfdddb25d97daf87a215bafc7 --- /dev/null +++ b/corpus/native/cold-05-04-positioned-outline/notebook/synthetic.one @@ -0,0 +1 @@ +../../20260905-05/snapshots/04-positioned-outline/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/cold-05-04-positioned-outline/read/hierarchy.xml b/corpus/native/cold-05-04-positioned-outline/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..12383d1aca263e713aa40046a185ad1d36a4bfe3 --- /dev/null +++ b/corpus/native/cold-05-04-positioned-outline/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-04-positioned-outline/read/page-000.xml b/corpus/native/cold-05-04-positioned-outline/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..c7945ec036ed50a7d1ee4e488d2fc1c2182945b9 --- /dev/null +++ b/corpus/native/cold-05-04-positioned-outline/read/page-000.xml @@ -0,0 +1,7 @@ + +Fictitious: café, 東京, مرحبا]]> diff --git a/corpus/native/cold-05-05-image/notebook/Open Notebook.one b/corpus/native/cold-05-05-image/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..e0aeafd6fcf505959202166ab52c23b5e7f0fd41 Binary files /dev/null and b/corpus/native/cold-05-05-image/notebook/Open Notebook.one differ diff --git a/corpus/native/cold-05-05-image/notebook/Open Notebook.onetoc2 b/corpus/native/cold-05-05-image/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..da202da48e973bdf52f01e79f07f1a51d8b93c7e Binary files /dev/null and b/corpus/native/cold-05-05-image/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native/cold-05-05-image/notebook/synthetic.one b/corpus/native/cold-05-05-image/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..e211d7d9d194553344c1d81285644f7d40be7cd4 --- /dev/null +++ b/corpus/native/cold-05-05-image/notebook/synthetic.one @@ -0,0 +1 @@ +../../20260905-05/snapshots/05-image/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/cold-05-05-image/read/hierarchy.xml b/corpus/native/cold-05-05-image/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..147ba3eb8387ffa04e0a20498c2b27aeddf0acda --- /dev/null +++ b/corpus/native/cold-05-05-image/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-05-image/read/page-000.xml b/corpus/native/cold-05-05-image/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..cd835713443c734fb8f1399d677b57ba03a94b39 --- /dev/null +++ b/corpus/native/cold-05-05-image/read/page-000.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/cold-05-06-attachment/notebook/Open Notebook.one b/corpus/native/cold-05-06-attachment/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..b73b36136a54cd94e50bcde5c37d3a589412c2bb Binary files /dev/null and b/corpus/native/cold-05-06-attachment/notebook/Open Notebook.one differ diff --git a/corpus/native/cold-05-06-attachment/notebook/Open Notebook.onetoc2 b/corpus/native/cold-05-06-attachment/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..79b05c18fee1c401b03f84e7e4ea441485bdcb42 Binary files /dev/null and b/corpus/native/cold-05-06-attachment/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native/cold-05-06-attachment/notebook/synthetic.one b/corpus/native/cold-05-06-attachment/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..bc348e703eb28144da92b560d3e3c927dd8b4fe4 --- /dev/null +++ b/corpus/native/cold-05-06-attachment/notebook/synthetic.one @@ -0,0 +1 @@ +../../20260905-05/snapshots/06-attachment/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/cold-05-06-attachment/read/hierarchy.xml b/corpus/native/cold-05-06-attachment/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..b31e5b0f12f8dcaf32d9818cd3f58d8105f7cd90 --- /dev/null +++ b/corpus/native/cold-05-06-attachment/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-06-attachment/read/page-000.xml b/corpus/native/cold-05-06-attachment/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..224c7c3d07fff03eabf891f8ce90e34e638610ed --- /dev/null +++ b/corpus/native/cold-05-06-attachment/read/page-000.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/cold-05-07-table/notebook/Open Notebook.one b/corpus/native/cold-05-07-table/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..0bcfba18a14a5689b844146b2fd62439206aaae7 Binary files /dev/null and b/corpus/native/cold-05-07-table/notebook/Open Notebook.one differ diff --git a/corpus/native/cold-05-07-table/notebook/Open Notebook.onetoc2 b/corpus/native/cold-05-07-table/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..7dffb2bd152d75e1f6b5dd50851556171c392e5f Binary files /dev/null and b/corpus/native/cold-05-07-table/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native/cold-05-07-table/notebook/synthetic.one b/corpus/native/cold-05-07-table/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..871d1a164a0aed28eb2ff9e6c15e54e3804afd8c --- /dev/null +++ b/corpus/native/cold-05-07-table/notebook/synthetic.one @@ -0,0 +1 @@ +../../20260905-05/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/cold-05-07-table/read/hierarchy.xml b/corpus/native/cold-05-07-table/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..d96f95080b95d2b3b1d0ace223212a859d98202d --- /dev/null +++ b/corpus/native/cold-05-07-table/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-07-table/read/page-000.xml b/corpus/native/cold-05-07-table/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..3643bd630f51523262f3d3f3568682935a56adfe --- /dev/null +++ b/corpus/native/cold-05-07-table/read/page-000.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/native/cold-05-08-onepkg/notebook/Open Notebook.one b/corpus/native/cold-05-08-onepkg/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..34692b73bc17872d822a9c088aa3ad3d21375246 Binary files /dev/null and b/corpus/native/cold-05-08-onepkg/notebook/Open Notebook.one differ diff --git a/corpus/native/cold-05-08-onepkg/notebook/Open Notebook.onetoc2 b/corpus/native/cold-05-08-onepkg/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..d571c3e3d1e29d50898b7581ce3f43f409ce5637 Binary files /dev/null and b/corpus/native/cold-05-08-onepkg/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/native/cold-05-08-onepkg/notebook/synthetic.one b/corpus/native/cold-05-08-onepkg/notebook/synthetic.one new file mode 120000 index 0000000000000000000000000000000000000000..871d1a164a0aed28eb2ff9e6c15e54e3804afd8c --- /dev/null +++ b/corpus/native/cold-05-08-onepkg/notebook/synthetic.one @@ -0,0 +1 @@ +../../20260905-05/notebook/synthetic.one \ No newline at end of file diff --git a/corpus/native/cold-05-08-onepkg/read/hierarchy.xml b/corpus/native/cold-05-08-onepkg/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..07ea54d03adafe9766ba4ca9a017e4fa859fe0d5 --- /dev/null +++ b/corpus/native/cold-05-08-onepkg/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/native/cold-05-08-onepkg/read/page-000.xml b/corpus/native/cold-05-08-onepkg/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..963cc9155474c12159ead0971b844340448487fd --- /dev/null +++ b/corpus/native/cold-05-08-onepkg/read/page-000.xml @@ -0,0 +1,8 @@ + +Fictitious: café, 東京, مرحبا]]>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/writer/cold-complex-01/notebook/Open Notebook.one b/corpus/writer/cold-complex-01/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..45dc94abda31f43a1d4be185d18274e2f00a0cf7 Binary files /dev/null and b/corpus/writer/cold-complex-01/notebook/Open Notebook.one differ diff --git a/corpus/writer/cold-complex-01/notebook/Open Notebook.onetoc2 b/corpus/writer/cold-complex-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..9c79334dee4d057d8674e57e94bf73c14ceb9e59 Binary files /dev/null and b/corpus/writer/cold-complex-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/writer/cold-complex-01/notebook/synthetic.one b/corpus/writer/cold-complex-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..8e1f26f945086093a080b1dc94de5ef4cbc8e790 Binary files /dev/null and b/corpus/writer/cold-complex-01/notebook/synthetic.one differ diff --git a/corpus/writer/cold-complex-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment b/corpus/writer/cold-complex-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment new file mode 100644 index 0000000000000000000000000000000000000000..66b6151e91f90df6a61a19ef2f4447da278e07b2 --- /dev/null +++ b/corpus/writer/cold-complex-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment @@ -0,0 +1 @@ +Fictitious attachment for native corpus. \ No newline at end of file diff --git a/corpus/writer/cold-complex-01/read/hierarchy.xml b/corpus/writer/cold-complex-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..b19eb81e802bec67e0a6ea9dae2827cf1c2a7743 --- /dev/null +++ b/corpus/writer/cold-complex-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/writer/cold-complex-01/read/page-000.xml b/corpus/writer/cold-complex-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..2427fff679084e9652902e41c2b0cc326b6cc3e6 --- /dev/null +++ b/corpus/writer/cold-complex-01/read/page-000.xml @@ -0,0 +1,26 @@ + +Compatible: café, 東京, مرحبا]]>AK4FHQSiAaIBAWAqABofi0JwRYR1gL7QRdkE+oeVMvLsF0G4wBa/8yv0et67E4vlXrNInJuhJVq3 +URK/7HHMzCKxQYkOuxMs7nqhWM9UiuaXxU+PBvi60uGbIsRmbacNslhJmh1OQDQGbBADBkgQRSNG +IwUIC2VPZmdoZGkZFDIIAIAeAiHi4kEzCADwEAKLxeJBZAMVRgBACpUE/QGH81d3mq7mkzgM0mcB +mk1gEBgEBgEBgE1mUAgMzmUAmsygE1mUzmkBmc0gMzmk1mUAmsyTOaTWZQCazKZgALSmiazKATWZ +QCAwCAwBAZpM4DAJlNYBMprAJlNZpM4DNJmmU1mkzgM0mcBmkzmU1gEyAAFpTSAzOaQGZzRAYBAY +BAYBMprAIDNJnAZpM0yms0mcBmkzgM0mcymsAmU1gEyms0maZAACZTSawCZTWATKawCAoBAYBAZn +NIDAJrMoBNZlAJrMpnMoBNZlAJrMpnNIDM5pAZnNJrMkzmk1AACH8C7XgWnmkzgM0msAmU1gEBgE +BgEBTOaQGATWZQCazKATWZTOaTWZTNNJrMpmmUzTSaplM00mqZTOaTVMpmmk1TKATKazSawCAzSZ +wGAQFAIDAJrMoBAZnNIDM5pAZnMpnNJrMpmmk1mUzTSaplM00mqZTNNJrMpmmk1TKZplhuAzKATW +ZQCazKAIDAIDAIDNJnAYBMprAJlM4DNJnMprNJnMk1mkzmSazRM5kms0TOZJnMprNEzmSazQtKaQ +GZzRNZlAIDAIDAIDAJlNYAmU1gEymsAmU1mkzmU1miZzKazRM5kmcyTWaJnMk1mkzmSazRM5kAUU +RgBAAAAJBAUURgAAAAASABEgXhT+65lz/EiPi+8SFvjqCAk+gEcDAa/89Qd0AxVGAEAKABEg2R87 +QQrSFUA=AOECHQJSegFgKgAaH4tCcEWEdYC+0EXZBPqHlTLy7BdBuMAWv/Mr9HreuxOL5V6zSJyboSVat1ES +v+xxzMwisUGJDrsTLO56oVjPVIrml8VPjwb4utLhmyLEZm2nDbJYSZodTkA0BmwQAwZIEEUjRiMF +CAtlT2ZnaGRpGRQyCACAHgIh4uJBMwgA8BACi8XiQWQDFUYAQArKAUuH88s3nkzmkzgM0mcBmkzg +KAQGAQGATWZQCAzOaQGZzKATWZTOaQGZzSAzOaTWZQCazJM5pNZlAJrMpmAAAACH8D9XgeBJlM0z +mRNZpNZpM4DAJlNYBAUAgMAgMzmkBgE1mUAmsyTOaTWZTOaTVMpnNJqmUzTSaplM00mqZTOZTNNJ +qmUzTSagBRRGAIAAAAkEBRRGAAAAABIAESDPTQ4xwIZyTqQ8FVDbHxeKCj9AI5rARvPPUDugAxVG +AEAKABEgLMlfQdkfI0A=iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA +AAAASUVORK5CYII= diff --git a/corpus/writer/cold-edit-01/notebook/Open Notebook.one b/corpus/writer/cold-edit-01/notebook/Open Notebook.one new file mode 100644 index 0000000000000000000000000000000000000000..dc05e10e451eb5355fe70890c1393fdec898a409 Binary files /dev/null and b/corpus/writer/cold-edit-01/notebook/Open Notebook.one differ diff --git a/corpus/writer/cold-edit-01/notebook/Open Notebook.onetoc2 b/corpus/writer/cold-edit-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..22e6567c39a0de9e97a189b5a7286390149fc634 Binary files /dev/null and b/corpus/writer/cold-edit-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/writer/cold-edit-01/notebook/synthetic.one b/corpus/writer/cold-edit-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..4ddf808e4fbf296a121cd3e602990673877af7a3 Binary files /dev/null and b/corpus/writer/cold-edit-01/notebook/synthetic.one differ diff --git a/corpus/writer/cold-edit-01/read/hierarchy.xml b/corpus/writer/cold-edit-01/read/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..c41a0619aec3161692f8dcb070a627db9120ff83 --- /dev/null +++ b/corpus/writer/cold-edit-01/read/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/writer/cold-edit-01/read/page-000.xml b/corpus/writer/cold-edit-01/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..27a82ce40ccce8a46ae37bdd046f95594e32fe00 --- /dev/null +++ b/corpus/writer/cold-edit-01/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/writer/cold-edit-02/read/page-000.xml b/corpus/writer/cold-edit-02/read/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..c06e7ea5b076b14ef199411187524d9c20893e54 --- /dev/null +++ b/corpus/writer/cold-edit-02/read/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/writer/complex-01/notebook/synthetic.one b/corpus/writer/complex-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..8e1f26f945086093a080b1dc94de5ef4cbc8e790 Binary files /dev/null and b/corpus/writer/complex-01/notebook/synthetic.one differ diff --git a/corpus/writer/create-05/native-saved.one b/corpus/writer/create-05/native-saved.one new file mode 100644 index 0000000000000000000000000000000000000000..9d8e70138e00159d264f338743f32d557f545ae0 Binary files /dev/null and b/corpus/writer/create-05/native-saved.one differ diff --git a/corpus/writer/create-05/notebook/synthetic.one b/corpus/writer/create-05/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..88d497e8f7e38d92e7386c41f7f6c2ad1da31050 Binary files /dev/null and b/corpus/writer/create-05/notebook/synthetic.one differ diff --git a/corpus/writer/create-05/page-000.xml b/corpus/writer/create-05/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..ca2ad81395d1d839d133ec397187fbdc4efeb794 --- /dev/null +++ b/corpus/writer/create-05/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/writer/create-05/returned-page.xml b/corpus/writer/create-05/returned-page.xml new file mode 100644 index 0000000000000000000000000000000000000000..1bd3df5c06e2bebe7ae0c50f66b054cf238beef1 --- /dev/null +++ b/corpus/writer/create-05/returned-page.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/writer/create-05/rust-after-native.one b/corpus/writer/create-05/rust-after-native.one new file mode 100644 index 0000000000000000000000000000000000000000..606a0a1ceb87a94cec6a1c38a2a054b9ab8cc025 Binary files /dev/null and b/corpus/writer/create-05/rust-after-native.one differ diff --git a/corpus/writer/create-notebook-01/hierarchy.xml b/corpus/writer/create-notebook-01/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..1f27e173487b330a9881d5ad0eba445a11270974 --- /dev/null +++ b/corpus/writer/create-notebook-01/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/writer/create-notebook-01/notebook/Open Notebook.onetoc2 b/corpus/writer/create-notebook-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..904223814bdd25f6a91d1dce778e3430b0f8874f Binary files /dev/null and b/corpus/writer/create-notebook-01/notebook/Open Notebook.onetoc2 differ diff --git a/corpus/writer/create-notebook-01/notebook/synthetic.one b/corpus/writer/create-notebook-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..d0a9ad57b6c68f5231b63fa13204acdc6d1a91bd Binary files /dev/null and b/corpus/writer/create-notebook-01/notebook/synthetic.one differ diff --git a/corpus/writer/create-notebook-01/page-000.xml b/corpus/writer/create-notebook-01/page-000.xml new file mode 100644 index 0000000000000000000000000000000000000000..7d8036be1aafd5dd76e27b30758a9593aadf63e5 --- /dev/null +++ b/corpus/writer/create-notebook-01/page-000.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/writer/edit-01/notebook/synthetic.one b/corpus/writer/edit-01/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..4ddf808e4fbf296a121cd3e602990673877af7a3 Binary files /dev/null and b/corpus/writer/edit-01/notebook/synthetic.one differ diff --git a/corpus/writer/edit-02/notebook/synthetic.one b/corpus/writer/edit-02/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..f727a6c62d2e6e4fdb2681b3d1bdd766d3d40029 Binary files /dev/null and b/corpus/writer/edit-02/notebook/synthetic.one differ diff --git a/corpus/writer/manifest.json b/corpus/writer/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..7c6f759019d610c8a418d3f50033aa8e56f51d97 --- /dev/null +++ b/corpus/writer/manifest.json @@ -0,0 +1,157 @@ +{ + "captured_utc": "2026-09-05T06:38:24.554376+00:00", + "native_build": "14.0.7015.1000", + "source_fixture": "../native/20260905-05/snapshots/02-text/notebook/synthetic.one", + "operations": [ + "Rust write_demo: equal-length plain-text replacement to edit-01", + "read-current.ps1 fresh-cache writer-edit-01: one page with Portable plain text...", + "edit-existing.ps1 fresh-cache writer-native-edit-02: replace Portable plain text... with Fictitious plain text.; sync and close", + "Rust inventory of native-edit-02: Fictitious plain text.", + "Rust write_demo: replace again in edit-02", + "read-current.ps1 fresh-cache writer-edit-02: one page with Portable plain text...", + "Rust edit_property on native ink fixture: replace Fictitious with Compatible in the Unicode rich-text property", + "read-current.ps1 fresh-cache writer-complex-01: four text objects and two ink strokes; only edited outline height reflows", + "Rust edit_property on native TOC: change notebook color from 9595aa00 to 33669900; fresh-cache writer-toc-01 reports #336699 and one page", + "Rust create_section without a template: Unicode paragraph Created in Rust: café 東京 🦀; fresh-cache writer-create-05 returns exact text and Fixture Author", + "Fresh-cache edit-existing.ps1 on writer-created-native-edit replaces that paragraph with Native edited the created page.; Rust inventory confirms native save", + "Rust edit_property changes native-saved text to Rust edited it again, with a longer paragraph.; fresh-cache writer-created-return confirms exact text", + "Rust create_notebook creates both synthetic.one and Open Notebook.onetoc2; fresh-cache writer-create-notebook-01 returns A notebook created in Rust." + ], + "files": [ + { + "path": "cold-complex-01/notebook/Open Notebook.one", + "bytes": 4016, + "sha256": "cd7ef0daf82bf88f106b4b7f23f48f57df6d42c2b8c889f0b8ed6af730e562db" + }, + { + "path": "cold-complex-01/notebook/Open Notebook.onetoc2", + "bytes": 4944, + "sha256": "f02e260a1cd50a7963199fb76a31d58f8dbfa5a67fce59149a793691efd15ecd" + }, + { + "path": "cold-complex-01/notebook/synthetic.one", + "bytes": 30448, + "sha256": "d2c373dca4927d0072e867842544126337e6ad09897ec552013d7f82031f0ac4" + }, + { + "path": "cold-complex-01/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment", + "bytes": 43, + "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7" + }, + { + "path": "cold-complex-01/read/hierarchy.xml", + "bytes": 963, + "sha256": "f41d6342ac112724b03ce0e11b2d51913ceb371816ac681033fc69a87e9d1c7f" + }, + { + "path": "cold-complex-01/read/page-000.xml", + "bytes": 7402, + "sha256": "a28a5f923c8e10208ac7ded1bec283f596b068d0ca5bb3a067b92f683b2b702d" + }, + { + "path": "cold-edit-01/notebook/Open Notebook.one", + "bytes": 4016, + "sha256": "d95a9e04a906cb786d73d61934204bc094ffeb3c586ddcc7d11f487b2d153190" + }, + { + "path": "cold-edit-01/notebook/Open Notebook.onetoc2", + "bytes": 4944, + "sha256": "fff8991ccd803718a1ff12335bb7f636574882d455ff4299bbe01c9b249b0322" + }, + { + "path": "cold-edit-01/notebook/synthetic.one", + "bytes": 13368, + "sha256": "44a9ca3131e0a1baa05a2b64968c32ce59ac97a59bfa9e1329cc7a6096b6fc3f" + }, + { + "path": "cold-edit-01/read/hierarchy.xml", + "bytes": 939, + "sha256": "cbe277489b094e22de6624f6c02212b73ba440514b6346c965930d7470bc432c" + }, + { + "path": "cold-edit-01/read/page-000.xml", + "bytes": 1209, + "sha256": "7141b2236e1f8f1aecfd77914b2ec7564ef4056bd4b4aa1f05f0e3a25871f631" + }, + { + "path": "cold-edit-02/read/page-000.xml", + "bytes": 1209, + "sha256": "2067abd992a1403ecda3127f12c683bf3804569db44e5b88dcd6c71a2808f04c" + }, + { + "path": "complex-01/notebook/synthetic.one", + "bytes": 30448, + "sha256": "d2c373dca4927d0072e867842544126337e6ad09897ec552013d7f82031f0ac4" + }, + { + "path": "create-05/native-saved.one", + "bytes": 10268, + "sha256": "28767fb84b110804aa0c1c1c5b211e649539ca077414e47f678081de8d16ee0d" + }, + { + "path": "create-05/notebook/synthetic.one", + "bytes": 3348, + "sha256": "a8c44edfcad463ec0a05686febd3da6cd58efd6c529ca77bef031f0528838935" + }, + { + "path": "create-05/page-000.xml", + "bytes": 1132, + "sha256": "e2a5c2eda8e7949a100b9816031283d87ec4561d9eaf59202a114c028ca4dd97" + }, + { + "path": "create-05/returned-page.xml", + "bytes": 1266, + "sha256": "b82fb6f47f8b153c6f3067a02a09747ab11956a1dcfc03d9fcb9d5c4b3de93b2" + }, + { + "path": "create-05/rust-after-native.one", + "bytes": 11456, + "sha256": "3de701a3d2199c3021b46e692a07d9ca7e2374825c4adb5613986b4d5499f356" + }, + { + "path": "create-notebook-01/hierarchy.xml", + "bytes": 753, + "sha256": "f4f805113ebba8dfd21cbbf30770d4bdbbd8ece06953c5fac2921ef5a56773e1" + }, + { + "path": "create-notebook-01/notebook/Open Notebook.onetoc2", + "bytes": 1612, + "sha256": "fafa5dcb3cd827c7edd30c8ea2fbc957a59fb4d2a8b28b667a3c551c8261ab86" + }, + { + "path": "create-notebook-01/notebook/synthetic.one", + "bytes": 3348, + "sha256": "b0662387c3fdc256d8dbe809e3b8f73b3586559696467fb1fff8f589095fa797" + }, + { + "path": "create-notebook-01/page-000.xml", + "bytes": 1113, + "sha256": "9086775b199f14ea7d1daf29292c4e055bbfd4e9a92f3c3abc9d29983a1ea065" + }, + { + "path": "edit-01/notebook/synthetic.one", + "bytes": 13368, + "sha256": "44a9ca3131e0a1baa05a2b64968c32ce59ac97a59bfa9e1329cc7a6096b6fc3f" + }, + { + "path": "edit-02/notebook/synthetic.one", + "bytes": 18288, + "sha256": "692c353ee7bcc9b00afe210edfc4ae06e77d836124920b045515657f6ddce331" + }, + { + "path": "native-edit-02/notebook/synthetic.one", + "bytes": 16384, + "sha256": "94cf8ffdb70403df072c9d562b5fa54c47910e44133cc0ec5186bec277888796" + }, + { + "path": "toc-01/hierarchy.xml", + "bytes": 724, + "sha256": "7f62ba95f82c53153afeeb7122ab7476370278198a8521b295439e0f97a0a752" + }, + { + "path": "toc-01/notebook/Open Notebook.onetoc2", + "bytes": 5904, + "sha256": "a7ec443d7534f5aeef5eb7fce09d133f5acfad4f1ac494417691297f5179e6fa" + } + ] +} diff --git a/corpus/writer/native-edit-02/notebook/synthetic.one b/corpus/writer/native-edit-02/notebook/synthetic.one new file mode 100644 index 0000000000000000000000000000000000000000..8019d3d50669bc447e58447e991081d89b563a1f Binary files /dev/null and b/corpus/writer/native-edit-02/notebook/synthetic.one differ diff --git a/corpus/writer/toc-01/hierarchy.xml b/corpus/writer/toc-01/hierarchy.xml new file mode 100644 index 0000000000000000000000000000000000000000..ff5fe725aaf3370c29a16b4472d9b8cdab5cfae8 --- /dev/null +++ b/corpus/writer/toc-01/hierarchy.xml @@ -0,0 +1,2 @@ + + diff --git a/corpus/writer/toc-01/notebook/Open Notebook.onetoc2 b/corpus/writer/toc-01/notebook/Open Notebook.onetoc2 new file mode 100644 index 0000000000000000000000000000000000000000..ba846829be0a0b98ff101357e2ab94077be5ac7e Binary files /dev/null and b/corpus/writer/toc-01/notebook/Open Notebook.onetoc2 differ diff --git a/crates/onestore/Cargo.toml b/crates/onestore/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..913bbfdecce76d9cc2e1309d3357d392b756871b --- /dev/null +++ b/crates/onestore/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "onestore" +version = "0.1.0" +edition = "2024" +publish = false + +[dependencies] +md5 = "0.8.1" +getrandom = "0.4.3" +serde = { version = "1.0.229", features = ["derive"] } + +[target.'cfg(target_os = "macos")'.dependencies] +nix = { version = "0.31.3", default-features = false, features = ["fs"] } + +[dev-dependencies] +serde_json = "1.0.151" diff --git a/crates/onestore/examples/concurrent_client.rs b/crates/onestore/examples/concurrent_client.rs new file mode 100644 index 0000000000000000000000000000000000000000..f3ed8bcba59731740c85847f347e20536f5ea8da --- /dev/null +++ b/crates/onestore/examples/concurrent_client.rs @@ -0,0 +1,211 @@ +#[path = "../src/flush.rs"] +mod flush; + +use onestore::{ + CommitState, ExGuid, RevisionIndex, Store, + document::{Document, Kind}, +}; +use serde_json::json; +use std::{ + env, fs, + io::{self, Write}, + path::Path, + thread, + time::{Duration, Instant, SystemTime, UNIX_EPOCH}, +}; + +fn main() -> Result<(), Box> { + let args: Vec<_> = env::args().skip(1).collect(); + if args.len() == 2 && args[0] == "init" { + let bytes = + onestore::create_section("synthetic.one", "Concurrent edits:", "Concurrency test")?; + let mut file = fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(&args[1])?; + file.write_all(&bytes)?; + flush::flush(&file)?; + return Ok(()); + } + if args.len() != 7 || !["read", "write", "edit"].contains(&args[0].as_str()) { + return Err("Usage: concurrent_client init FILE | read|write|edit FILE ACTOR OPERATIONS START_FILE STOP_FILE SEED".into()); + } + let mut random: u64 = args[6].parse()?; + let operations: usize = args[3].parse()?; + if operations == 0 { + return Err("Choose at least one operation.".into()); + } + let deadline = Instant::now() + Duration::from_secs(600); + let mut output = io::stdout().lock(); + let mut log = |event: serde_json::Value| -> io::Result<()> { + writeln!(output, "{event}")?; + output.flush() + }; + log(json!({"event": "ready", "pid": std::process::id(), "actor": args[2]}))?; + while !Path::new(&args[4]).exists() { + if Instant::now() > deadline { + return Err("Start barrier timed out.".into()); + } + thread::sleep(Duration::from_millis(5)); + } + let mut completed = 0; + let mut attempts = 0; + while completed < operations || (args[0] == "read" && !Path::new(&args[5]).exists()) { + if Instant::now() > deadline { + return Err("Concurrent client timed out.".into()); + } + attempts += 1; + random = random + .wrapping_mul(6364136223846793005) + .wrapping_add(1442695040888963407); + thread::sleep(Duration::from_millis((random >> 32) % 7)); + let started = SystemTime::now().duration_since(UNIX_EPOCH)?.as_micros(); + let source = match onestore::read_file(&args[1]) { + Ok(source) => source, + Err(error) + if [ + io::ErrorKind::WouldBlock, + io::ErrorKind::PermissionDenied, + io::ErrorKind::NotFound, + ] + .contains(&error.kind()) => + { + log( + json!({"event": "read_busy", "attempt": attempts, "kind": format!("{:?}", error.kind())}), + )?; + thread::sleep(Duration::from_millis(100)); + continue; + } + Err(error) => { + log( + json!({"event": "read_error", "attempt": attempts, "kind": format!("{:?}", error.kind())}), + )?; + return Err(error.into()); + } + }; + let preserve = |error: onestore::Error| { + let path = Path::new(&args[4]) + .parent() + .unwrap() + .join(format!("invalid-{}-{attempts}.one", std::process::id())); + if let Err(failure) = fs::write(&path, &source) { + eprintln!( + "Could not save invalid snapshot {}: {failure}", + path.display() + ); + } + error + }; + let store = Store::parse(&source).map_err(preserve)?; + if !store.checksum_mismatches.is_empty() { + return Err(preserve(onestore::Error { + offset: store.checksum_mismatches[0], + message: "A reader observed transaction checksum damage.", + }) + .into()); + } + let index = RevisionIndex::parse(&store).map_err(preserve)?; + index.validate_current().map_err(preserve)?; + let document = Document::parse(&index).map_err(preserve)?; + let mut targets = Vec::new(); + for (sid, page) in document.pages().map_err(preserve)? { + let space = &document.spaces[&sid]; + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + let mut pending = vec![page]; + let mut seen = std::collections::BTreeSet::new(); + while let Some(oid) = pending.pop() { + if !seen.insert(oid) { + continue; + } + let node = &revision.nodes[&oid]; + pending.extend( + node.children + .iter() + .chain(&node.content) + .chain(&node.structure) + .copied(), + ); + if let Kind::RichText { text, .. } = &node.kind + && text.starts_with("Concurrent edits:") + { + revision.text_runs(oid).map_err(preserve)?; + targets.push((sid, oid, text)); + } + } + } + let [(sid, oid, text)] = targets.as_slice() else { + return Err(preserve(onestore::Error { + offset: 0, + message: "Expected one concurrent-edit paragraph.", + }) + .into()); + }; + let read_finished = SystemTime::now().duration_since(UNIX_EPOCH)?.as_micros(); + log( + json!({"event": "read", "attempt": attempts, "started_us": started, "finished_us": read_finished, + "transaction": store.header.transaction_count, "text": text}), + )?; + if args[0] == "read" { + completed += 1; + continue; + } + let token = format!(" [{}:{}]", args[2], completed); + let offset = u32::try_from(text.encode_utf16().count())?; + let mut range = offset..offset; + let mut replacement = token.clone(); + if args[0] == "edit" { + let prefix = "Concurrent edits:"; + let mut boundaries = vec![u32::try_from(prefix.encode_utf16().count())?]; + for character in text[prefix.len()..].chars() { + boundaries.push(boundaries.last().unwrap() + character.len_utf16() as u32); + } + let first = ((random >> 16) % boundaries.len() as u64) as usize; + let second = ((random >> 40) % boundaries.len() as u64) as usize; + range = boundaries[first.min(second)]..boundaries[first.max(second)]; + replacement = format!(" café 🦀{token}"); + } + log( + json!({"event": "intent", "attempt": attempts, "operation": completed, + "source_transaction": store.header.transaction_count, "before": text, + "range": [range.start, range.end], "replacement": replacement, "token": token}), + )?; + thread::sleep(Duration::from_millis((random >> 48) % 13)); + let commit_started = SystemTime::now().duration_since(UNIX_EPOCH)?.as_micros(); + let result = onestore::commit_file_text(&args[1], &source, *sid, *oid, range, &replacement); + let finished = SystemTime::now().duration_since(UNIX_EPOCH)?.as_micros(); + match result { + Ok(()) => { + log( + json!({"event": "commit", "attempt": attempts, "operation": completed, "token": token, + "started_us": commit_started, "finished_us": finished, "source_transaction": store.header.transaction_count}), + )?; + completed += 1; + } + Err(error) + if error.state == CommitState::NotCommitted + && [ + io::ErrorKind::WouldBlock, + io::ErrorKind::ResourceBusy, + io::ErrorKind::PermissionDenied, + io::ErrorKind::NotFound, + ] + .contains(&error.error.kind()) => + { + log( + json!({"event": "retry", "attempt": attempts, "started_us": commit_started, + "finished_us": finished, "kind": format!("{:?}", error.error.kind())}), + )?; + } + Err(error) => { + log( + json!({"event": "commit_error", "attempt": attempts, "operation": completed, + "token": token, "state": format!("{:?}", error.state), "kind": format!("{:?}", error.error.kind()), + "started_us": commit_started, "finished_us": finished}), + )?; + return Err(error.into()); + } + } + } + log(json!({"event": "done", "completed": completed, "attempts": attempts}))?; + Ok(()) +} diff --git a/crates/onestore/examples/create_notebook.rs b/crates/onestore/examples/create_notebook.rs new file mode 100644 index 0000000000000000000000000000000000000000..bb6e894071185d37124808b3b1f67c638f2e0f6b --- /dev/null +++ b/crates/onestore/examples/create_notebook.rs @@ -0,0 +1,26 @@ +#[path = "../src/flush.rs"] +mod flush; + +use std::{env, fs, io::Write, path::Path}; +fn main() -> Result<(), Box> { + let args: Vec<_> = env::args().skip(1).collect(); + if args.len() != 3 { + return Err("Usage: create_notebook DIRECTORY TEXT AUTHOR".into()); + } + let section = onestore::create_section("synthetic.one", &args[1], &args[2])?; + let identity = onestore::Store::parse(§ion)?.header.file_id; + let toc = onestore::create_table_of_contents( + "Open Notebook.onetoc2", + &[("synthetic.one", identity)], + )?; + fs::create_dir(&args[0])?; + for (name, data) in [("synthetic.one", section), ("Open Notebook.onetoc2", toc)] { + let mut file = fs::OpenOptions::new() + .create_new(true) + .write(true) + .open(Path::new(&args[0]).join(name))?; + file.write_all(&data)?; + flush::flush(&file)?; + } + Ok(()) +} diff --git a/crates/onestore/examples/create_section.rs b/crates/onestore/examples/create_section.rs new file mode 100644 index 0000000000000000000000000000000000000000..2c4e2804e97aaea951283817459bc3eca55d9aaf --- /dev/null +++ b/crates/onestore/examples/create_section.rs @@ -0,0 +1,22 @@ +#[path = "../src/flush.rs"] +mod flush; + +use std::{env, fs::OpenOptions, io::Write, path::Path}; +fn main() -> Result<(), Box> { + let args: Vec<_> = env::args().skip(1).collect(); + if args.len() != 3 { + return Err("Usage: create_section OUTPUT TEXT AUTHOR".into()); + } + let name = Path::new(&args[0]) + .file_name() + .and_then(|name| name.to_str()) + .ok_or("Invalid section name")?; + let bytes = onestore::create_section(name, &args[1], &args[2])?; + let mut file = OpenOptions::new() + .create_new(true) + .write(true) + .open(&args[0])?; + file.write_all(&bytes)?; + flush::flush(&file)?; + Ok(()) +} diff --git a/crates/onestore/examples/document.rs b/crates/onestore/examples/document.rs new file mode 100644 index 0000000000000000000000000000000000000000..b498706e84f3aba71b831bd62466cc16f57773c7 --- /dev/null +++ b/crates/onestore/examples/document.rs @@ -0,0 +1,65 @@ +use onestore::{ + FileDataReference, RevisionIndex, Store, + document::{Document, Kind}, +}; +use std::{collections::BTreeSet, env, fs, io, path::PathBuf}; + +fn main() -> Result<(), Box> { + let mut args = env::args_os().skip(1); + let path = args.next().ok_or("Provide a .one or .onetoc2 file.")?; + let destination = args.next().map(PathBuf::from); + if args.next().is_some() { + return Err("Provide a source file and an optional new export directory.".into()); + } + let bytes = onestore::read_file(path)?; + let store = Store::parse(&bytes)?; + let index = RevisionIndex::parse(&store)?; + let document = Document::parse(&index)?; + if let Some(destination) = destination { + fs::create_dir(&destination)?; + fs::create_dir(destination.join("assets"))?; + let mut assets = Vec::new(); + let mut seen = BTreeSet::new(); + for node in document + .spaces + .values() + .flat_map(|s| s.revisions.values()) + .flat_map(|r| r.nodes.values()) + { + if let Kind::File { + reference: FileDataReference::Internal(guid), + payload: Some(data), + .. + } = &node.kind + && seen.insert(guid) + { + let path = format!("assets/{}.bin", assets.len()); + fs::write(destination.join(&path), data)?; + assets.push(serde_json::json!({"reference": FileDataReference::Internal(*guid), "path": path})); + } + } + serde_json::to_writer(fs::File::create(destination.join("assets.json"))?, &assets)?; + let mut text = std::collections::BTreeMap::new(); + for (sid, space) in &document.spaces { + let mut revisions = std::collections::BTreeMap::new(); + for (rid, revision) in &space.revisions { + let mut objects = std::collections::BTreeMap::new(); + for (oid, node) in &revision.nodes { + if matches!(node.kind, Kind::RichText { .. }) { + objects.insert(*oid, revision.text_runs(*oid)?); + } + } + revisions.insert(*rid, objects); + } + text.insert(*sid, revisions); + } + serde_json::to_writer(fs::File::create(destination.join("text.json"))?, &text)?; + serde_json::to_writer( + fs::File::create(destination.join("document.json"))?, + &document, + )?; + } else { + serde_json::to_writer(io::stdout().lock(), &document)?; + } + Ok(()) +} diff --git a/crates/onestore/examples/edit_property.rs b/crates/onestore/examples/edit_property.rs new file mode 100644 index 0000000000000000000000000000000000000000..a2a8402cef734f39429c1e9a8fd214aed9fcb429 --- /dev/null +++ b/crates/onestore/examples/edit_property.rs @@ -0,0 +1,74 @@ +#[path = "../src/flush.rs"] +mod flush; + +use onestore::{ + ExGuid, ObjectData, PropertySets, RevisionIndex, Store, Value, commit_file_property, + replace_property_bytes, +}; +use std::{env, fs, io::Write}; + +fn hex(text: &str) -> Result, Box> { + if !text.is_ascii() || !text.len().is_multiple_of(2) { + return Err("Expected an even number of hexadecimal digits".into()); + } + text.as_bytes() + .chunks_exact(2) + .map(|pair| Ok(u8::from_str_radix(std::str::from_utf8(pair)?, 16)?)) + .collect() +} + +fn main() -> Result<(), Box> { + let args: Vec<_> = env::args().skip(1).collect(); + if args.len() != 6 && args.len() != 8 { + return Err( + "Usage: edit_property INPUT OUTPUT|--in-place JCID PROPERTY EXPECTED_HEX VALUE_HEX [SPACE OBJECT]" + .into(), + ); + } + let jcid = u32::from_str_radix(&args[2], 16)?; + let id = u32::from_str_radix(&args[3], 16)?; + let expected = hex(&args[4])?; + let value = hex(&args[5])?; + let bytes = onestore::read_file(&args[0])?; + let store = Store::parse(&bytes)?; + let index = RevisionIndex::parse(&store)?; + index.validate_current()?; + let mut selected = None; + for (osid, space) in &index.spaces { + let Some(&rid) = space.labels.get(&(ExGuid::default(), 1)) else { + continue; + }; + let revision = index.resolve(*osid, rid)?; + for oid in revision.reachable()? { + if args.len() == 8 && (args[6] != osid.to_string() || args[7] != oid.to_string()) { + continue; + } + let object = &revision.objects[&oid]; + if object.jcid == jcid + && let ObjectData::Properties(data) = object.data + { + for property in &PropertySets::parse(data)?.sets[0] { + if property.id == id + && property.value == Value::Bytes(&expected) + && selected.replace((*osid, oid)).is_some() + { + return Err("Multiple matching objects".into()); + } + } + } + } + } + let (space, object) = selected.ok_or("No matching object")?; + if args[1] == "--in-place" { + commit_file_property(&args[0], &bytes, space, object, id, &value)?; + return Ok(()); + } + let written = replace_property_bytes(&bytes, space, object, id, &value)?; + let mut output = fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(&args[1])?; + output.write_all(&written)?; + flush::flush(&output)?; + Ok(()) +} diff --git a/crates/onestore/examples/header_faults.rs b/crates/onestore/examples/header_faults.rs new file mode 100644 index 0000000000000000000000000000000000000000..5ef222ae5af5b1ffcebe31d48e2ca94baa17892e --- /dev/null +++ b/crates/onestore/examples/header_faults.rs @@ -0,0 +1,40 @@ +use onestore::*; +fn main() -> Result<(), Box> { + let source = + std::fs::read("corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one")?; + let store = Store::parse(&source)?; + let index = RevisionIndex::parse(&store)?; + let mut target = None; + for (osid, space) in &index.spaces { + let revision = index.resolve(*osid, space.labels[&(ExGuid::default(), 1)])?; + for (oid, object) in revision.objects { + if let ObjectData::Properties(data) = object.data { + for p in &PropertySets::parse(data)?.sets[0] { + if p.value == Value::Bytes(b"Fictitious plain text.") { + target = Some((*osid, oid, p.id)); + } + } + } + } + } + let (osid, oid, property) = target.unwrap(); + let output = replace_property_bytes(&source, osid, oid, property, b"A durable edit.")?; + let mut invalid = Vec::new(); + for prefix in 0..=1024 { + let mut torn = output.clone(); + torn[prefix..1024].copy_from_slice(&source[prefix..1024]); + let result = Store::parse(&torn).and_then(|store| { + let index = RevisionIndex::parse(&store)?; + index.validate_current() + }); + if result.is_err() { + invalid.push(prefix); + } + } + println!( + "Header prefix tears: {} invalid out of 1025; offsets {:?}", + invalid.len(), + invalid + ); + Ok(()) +} diff --git a/crates/onestore/examples/inspect.rs b/crates/onestore/examples/inspect.rs new file mode 100644 index 0000000000000000000000000000000000000000..ff01798c73fd4aa6f76fb78f52c9fc72d3e78d30 --- /dev/null +++ b/crates/onestore/examples/inspect.rs @@ -0,0 +1,19 @@ +use onestore::Store; +use std::{env, fs}; + +fn main() -> Result<(), Box> { + for path in env::args_os().skip(1) { + let bytes = fs::read(&path)?; + let store = Store::parse(&bytes)?; + let nodes: usize = store.lists.values().map(|list| list.nodes.len()).sum(); + println!( + "{:?}: {:?}, {} transactions, {} lists, {nodes} nodes, {} checksum mismatches", + path, + store.header.file_type, + store.header.transaction_count, + store.lists.len(), + store.checksum_mismatches.len() + ); + } + Ok(()) +} diff --git a/crates/onestore/examples/inventory.rs b/crates/onestore/examples/inventory.rs new file mode 100644 index 0000000000000000000000000000000000000000..eae080b905cc6fe95785a2c0b82a3f6cbb16642f --- /dev/null +++ b/crates/onestore/examples/inventory.rs @@ -0,0 +1,78 @@ +use onestore::{ExGuid, FileDataReference, ObjectData, PropertySets, RevisionIndex, Store, Value}; +use std::{ + collections::BTreeSet, + env, + io::{self, Write}, +}; + +fn main() -> Result<(), Box> { + let mut output = io::BufWriter::new(io::stdout().lock()); + for path in env::args_os().skip(1) { + let bytes = onestore::read_file(path)?; + let store = Store::parse(&bytes)?; + let index = RevisionIndex::parse(&store)?; + index.validate_current()?; + let mut seen = BTreeSet::new(); + let mut pending = vec![index.root]; + while let Some(osid) = pending.pop() { + if !seen.insert(osid) { + continue; + } + let rid = index.spaces[&osid].labels[&(ExGuid::default(), 1)]; + let revision = index.resolve(osid, rid)?; + for oid in revision.reachable()? { + let object = &revision.objects[&oid]; + pending.extend(object.references()?.object_spaces); + if object.jcid == 0x6000b { + let metadata = revision + .roots + .get(&2) + .map(|oid| revision.objects[oid].jcid) + .unwrap_or(0); + writeln!(output, "page\t{osid}\t{metadata:x}")?; + } + let mut record = None; + if object.jcid == 0x6000e + && let ObjectData::Properties(data) = object.data + { + let properties = PropertySets::parse(data)?; + let boiler = properties.sets[0] + .iter() + .any(|p| matches!(p.id, 0x88001c87 | 0x88001c88 | 0x88001cb5)); + record = Some(("ascii", &[][..])); + let property = properties.sets[0] + .iter() + .find(|property| property.id == 0x1c001c22) + .or_else(|| { + properties.sets[0] + .iter() + .find(|property| property.id == 0x1c003498) + }); + if let Some(property) = property + && let Value::Bytes(data) = property.value + { + record = Some(( + if property.id == 0x1c001c22 { + if boiler { "boiler-unicode" } else { "unicode" } + } else { + if boiler { "boiler-ascii" } else { "ascii" } + }, + data, + )); + } + } + if let Some(FileDataReference::Internal(guid)) = object.file_reference()? { + record = Some(("file", store.file_data(guid)?)); + } + if let Some((kind, data)) = record { + write!(output, "{kind}\t{osid}\t")?; + for byte in data { + write!(output, "{byte:02x}")?; + } + writeln!(output)?; + } + } + } + } + Ok(()) +} diff --git a/crates/onestore/examples/large_notebook.rs b/crates/onestore/examples/large_notebook.rs new file mode 100644 index 0000000000000000000000000000000000000000..13fdcab53083b0b024a510fc8c9bdcd26b04b00d --- /dev/null +++ b/crates/onestore/examples/large_notebook.rs @@ -0,0 +1,54 @@ +use onestore::{Store, create_section, create_table_of_contents}; +use std::{env, fs, path::PathBuf}; + +fn main() -> Result<(), Box> { + let mut args = env::args().skip(1); + let destination = PathBuf::from(args.next().ok_or("Provide a new destination directory.")?); + let count: usize = args.next().ok_or("Provide a section count.")?.parse()?; + let length: usize = args + .next() + .ok_or("Provide a text length in Unicode scalars.")? + .parse()?; + if args.next().is_some() || !(1..=1024).contains(&count) || !(1..=1_000_000).contains(&length) { + return Err("Use 1–1024 sections and 1–1000000 Unicode scalars per page.".into()); + } + fs::create_dir(&destination)?; + let notebook = destination.join("notebook"); + fs::create_dir(¬ebook)?; + let alphabet: Vec<_> = "Repeated text · café 東京 مرحبا 😀 e\u{301} <>&\" " + .chars() + .collect(); + let mut sections = Vec::new(); + let mut expected = Vec::new(); + for index in 0..count { + let name = format!("Section {index:03}.one"); + let text: String = (0..length) + .map(|offset| { + if offset % 250 == 249 { + '\r' + } else { + alphabet[(offset + index) % alphabet.len()] + } + }) + .collect(); + let bytes = create_section(&name, &text, "Fictitious scale fixture")?; + let identity = Store::parse(&bytes)?.header.file_id; + fs::write(notebook.join(&name), bytes)?; + expected.push(serde_json::json!({"section": name, "text": text})); + sections.push((name, identity)); + } + let entries: Vec<_> = sections + .iter() + .rev() + .map(|(name, id)| (name.as_str(), *id)) + .collect(); + fs::write( + notebook.join("Open Notebook.onetoc2"), + create_table_of_contents("Open Notebook.onetoc2", &entries)?, + )?; + serde_json::to_writer( + fs::File::create(destination.join("expected.json"))?, + &expected, + )?; + Ok(()) +} diff --git a/crates/onestore/examples/power_loss.rs b/crates/onestore/examples/power_loss.rs new file mode 100644 index 0000000000000000000000000000000000000000..caf3b31fbf90488b00b3a41d1d90502f0dbc633e --- /dev/null +++ b/crates/onestore/examples/power_loss.rs @@ -0,0 +1,335 @@ +#[path = "../tests/support/checkpoint.rs"] +mod checkpoint; + +use onestore::{ + CommitIo, ExGuid, RevisionIndex, Store, + document::{Document, Kind}, +}; +use std::{collections::BTreeMap, fs, io, path::PathBuf}; + +enum Event { + Write(usize, Vec), + Flush, +} + +struct Trace { + bytes: Vec, + events: Vec, +} + +impl CommitIo for Trace { + fn read_at(&mut self, offset: u64, output: &mut [u8]) -> io::Result { + let offset = offset as usize; + let count = output.len().min(self.bytes.len().saturating_sub(offset)); + output[..count].copy_from_slice(&self.bytes[offset..offset + count]); + Ok(count) + } + fn write_at(&mut self, offset: u64, bytes: &[u8]) -> io::Result { + let offset = offset as usize; + let count = bytes.len().min(4096); + self.bytes.resize(self.bytes.len().max(offset + count), 0); + self.bytes[offset..offset + count].copy_from_slice(&bytes[..count]); + self.events + .push(Event::Write(offset, bytes[..count].to_vec())); + Ok(count) + } + fn flush(&mut self) -> io::Result<()> { + self.events.push(Event::Flush); + Ok(()) + } +} + +fn current(bytes: &[u8]) -> BTreeMap { + let store = Store::parse(bytes).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + Document::parse(&index).unwrap(); + index + .spaces + .iter() + .map(|(sid, space)| { + let rid = space.labels[&(ExGuid::default(), 1)]; + let revision = index.resolve(*sid, rid).unwrap(); + for object in revision.objects.values() { + if let Some(onestore::FileDataReference::Internal(guid)) = + object.file_reference().unwrap() + { + store.file_data(guid).unwrap(); + } + } + (*sid, format!("{revision:?}")) + }) + .collect() +} + +fn main() -> Result<(), Box> { + let destination = PathBuf::from( + std::env::args_os() + .nth(1) + .ok_or("Provide a new evidence directory")?, + ); + fs::create_dir(&destination)?; + let fixtures = [ + ( + "unicode", + "corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one", + ), + ( + "rollover-256", + "corpus/append/round-01/tx-255/notebook/synthetic.one", + ), + ( + "rollover-65536", + "corpus/append/round-01/tx-65535/notebook/synthetic.one", + ), + ( + "attachment", + "corpus/native/20260905-05/snapshots/06-attachment/notebook/synthetic.one", + ), + ( + "checkpoint", + "corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one", + ), + ( + "toc", + "corpus/native/20260905-05/snapshots/02-text/notebook/Open Notebook.onetoc2", + ), + ( + "toc-rollover", + "corpus/native/20260905-05/snapshots/02-text/notebook/Open Notebook.onetoc2", + ), + ( + "toc-checkpoint", + "corpus/native/20260905-05/snapshots/02-text/notebook/Open Notebook.onetoc2", + ), + ]; + let mut records = Vec::new(); + let mut saved = BTreeMap::new(); + for (name, path) in fixtures { + if std::env::args().nth(2).as_deref() == Some("--toc") && !name.starts_with("toc") { + continue; + } + println!("Checking {name}"); + let mut source = fs::read(path)?; + let store = Store::parse(&source)?; + let index = RevisionIndex::parse(&store)?; + let document = Document::parse(&index)?; + let toc = store.header.file_type == onestore::FileType::TableOfContents; + let (sid, oid) = if toc { + let root = &document.spaces[&document.root]; + ( + document.root, + root.revisions[&root.contexts[&ExGuid::default()]].roots[&1], + ) + } else { + document + .spaces + .iter() + .find_map(|(sid, space)| { + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + revision + .nodes + .iter() + .find_map(|(oid, node)| match &node.kind { + Kind::RichText { text, .. } + if text.starts_with("Fictitious") || text == "Transaction 255" => + { + Some((*sid, *oid)) + } + _ => None, + }) + }) + .ok_or("Missing native fixture text")? + }; + if name.ends_with("checkpoint") { + source = + checkpoint::pending(&source, sid, oid, if toc { 0x14001cbe } else { 0x14001d7a }); + } + if name == "toc-rollover" { + loop { + let count = Store::parse(&source)?.header.transaction_count; + if count == 255 { + break; + } + assert!(count < 255); + source = onestore::replace_property_bytes( + &source, + sid, + oid, + 0x14001cbe, + &count.to_le_bytes(), + )?; + } + } + let apply = |io: &mut Trace, + bytes: &[u8], + recovering: bool| + -> Result<(), Box> { + if toc { + let value = if recovering { + [0x44, 0x55, 0x66, 0] + } else { + [0x33, 0x66, 0x99, 0] + }; + onestore::commit_property_bytes(io, bytes, sid, oid, 0x14001cbe, &value)?; + } else { + let store = Store::parse(bytes)?; + let index = RevisionIndex::parse(&store)?; + let doc = Document::parse(&index)?; + let space = &doc.spaces[&sid]; + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + let Kind::RichText { text, .. } = &revision.nodes[&oid].kind else { + unreachable!() + }; + let end = u32::try_from(text.encode_utf16().count())?; + onestore::commit_text( + io, + bytes, + sid, + oid, + end..end, + if recovering { + " [recovered]" + } else { + " [durable café 🦀]" + }, + )?; + } + Ok(()) + }; + fs::write(destination.join(format!("{name}-source.bin")), &source)?; + let before = current(&source); + let mut trace = Trace { + bytes: source.clone(), + events: Vec::new(), + }; + apply(&mut trace, &source, false)?; + let after = current(&trace.bytes); + assert_ne!(before, after); + let mut durable = source.clone(); + let mut pending = Vec::new(); + let mut flushes = 0; + for (step, event) in trace.events.iter().enumerate() { + if let Event::Write(offset, data) = event { + pending.push((*offset, data)); + } + for policy in 0..6 { + let mut image = durable.clone(); + // Unflushed writes may reach storage out of order and only in part. + for (offset, data) in pending.iter().rev() { + for (i, byte) in data.iter().enumerate() { + let persist = match policy { + 0 => false, + 1 => true, + 2 => i < data.len() / 2, + 3 => i >= data.len() / 2, + 4 => ((offset + i) / 512) % 2 == 0, + _ => (offset + i).wrapping_mul(0x9e3779b9).count_ones() % 2 == 0, + }; + if persist { + image.resize(image.len().max(offset + i + 1), 0); + image[offset + i] = *byte; + } + } + } + let checked = + std::panic::catch_unwind(|| -> Result> { + let observed = current(&image); + assert!( + observed == before || observed == after, + "{name} step {step} policy {policy}" + ); + if flushes >= 3 { + assert_eq!(observed, after, "Acknowledged publication was lost"); + } + let committed = observed == after; + let mut recovered = Trace { + bytes: image.clone(), + events: Vec::new(), + }; + apply(&mut recovered, &image, true)?; + let recovered_store = Store::parse(&recovered.bytes)?; + let recovered_index = RevisionIndex::parse(&recovered_store)?; + let recovered_doc = Document::parse(&recovered_index)?; + let space = &recovered_doc.spaces[&sid]; + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + match &revision.nodes[&oid].kind { + Kind::RichText { text, .. } => assert!(text.ends_with(" [recovered]")), + Kind::Toc { color, .. } => assert_eq!(*color, Some(0x665544)), + _ => unreachable!(), + } + Ok(committed) + }); + let committed = match checked { + Ok(Ok(committed)) => committed, + failure => { + fs::write(destination.join("failure.one"), &image)?; + fs::write( + destination.join("failure.json"), + serde_json::to_vec_pretty( + &serde_json::json!({"case": name, "step": step, "policy": policy, "completed_flushes": flushes}), + )?, + )?; + match failure { + Ok(Err(error)) => return Err(error), + Err(panic) => std::panic::resume_unwind(panic), + _ => unreachable!(), + } + } + }; + let digest = format!("{:x}", md5::compute(&image)); + if matches!(event, Event::Flush) + && (policy == 0 || policy == 1) + && !saved.contains_key(&digest) + { + let directory = format!("{name}-{step}-{policy}"); + let notebook = destination.join(&directory).join("notebook"); + fs::create_dir_all(¬ebook)?; + if toc { + fs::write(notebook.join("Open Notebook.onetoc2"), &image)?; + fs::copy( + PathBuf::from(path).parent().unwrap().join("synthetic.one"), + notebook.join("synthetic.one"), + )?; + } else { + fs::write(notebook.join("synthetic.one"), &image)?; + let identity = Store::parse(&image)?.header.file_id; + fs::write( + notebook.join("Open Notebook.onetoc2"), + onestore::create_table_of_contents( + "Open Notebook.onetoc2", + &[("synthetic.one", identity)], + )?, + )?; + } + saved.insert(digest.clone(), directory); + } + records.push(serde_json::json!({"case":name,"step":step,"completed_flushes":flushes,"policy":policy,"committed":committed,"md5":digest})); + } + if matches!(event, Event::Flush) { + for (offset, data) in pending.drain(..) { + durable.resize(durable.len().max(offset + data.len()), 0); + durable[offset..offset + data.len()].copy_from_slice(data); + } + flushes += 1; + current(&durable); + } + } + assert_eq!(current(&durable), after); + } + fs::write( + destination.join("matrix.json"), + serde_json::to_vec_pretty(&records)?, + )?; + fs::write( + destination.join("native-cases.json"), + serde_json::to_vec_pretty(&saved)?, + )?; + println!( + "Passed {} persisted images and subsequent edits; {} native cases retained", + records.len(), + saved.len() + ); + Ok(()) +} diff --git a/crates/onestore/examples/properties.rs b/crates/onestore/examples/properties.rs new file mode 100644 index 0000000000000000000000000000000000000000..be034fa5adb7229421060de86dde8a96dae4289f --- /dev/null +++ b/crates/onestore/examples/properties.rs @@ -0,0 +1,41 @@ +use onestore::{PropertySets, Reference, Store}; +use std::{env, fs}; + +fn main() -> Result<(), Box> { + for path in env::args_os().skip(1) { + let bytes = fs::read(&path)?; + let store = Store::parse(&bytes)?; + let mut count = 0; + for list in store.lists.values() { + for node in &list.nodes { + if node.id == 0x7c { + return Err("Encrypted object space requires revision-aware inspection".into()); + } + if matches!( + node.id, + 0xa4 | 0xa5 | 0xc4 | 0xc5 | 0x2d | 0x2e | 0x41 | 0x42 + ) && let Some(Reference::Data(chunk)) = node.reference + { + let start = usize::try_from(chunk.offset)?; + let end = start + .checked_add(usize::try_from(chunk.length)?) + .ok_or("Property range exceeds address space")?; + let properties = PropertySets::parse( + bytes + .get(start..end) + .ok_or("Property range extends outside the file")?, + ) + .map_err(|error| { + format!( + "{:?}, node {:#x}, data {start:#x}: {error}", + path, node.offset + ) + })?; + count += properties.sets.iter().map(Vec::len).sum::(); + } + } + } + println!("{:?}: {count} properties", path); + } + Ok(()) +} diff --git a/crates/onestore/examples/random_edit.rs b/crates/onestore/examples/random_edit.rs new file mode 100644 index 0000000000000000000000000000000000000000..4a93ec13169510713cf9731ce052b94614727c3f --- /dev/null +++ b/crates/onestore/examples/random_edit.rs @@ -0,0 +1,171 @@ +#[path = "../src/flush.rs"] +mod flush; + +use onestore::{ + ExGuid, RevisionIndex, Store, + document::{Document, Kind}, +}; +use std::{ + collections::BTreeSet, + env, fs, + io::Write, + time::{SystemTime, UNIX_EPOCH}, +}; + +fn main() -> Result<(), Box> { + let args: Vec<_> = env::args().skip(1).collect(); + if !(3..=4).contains(&args.len()) { + return Err("Usage: random_edit FILE OUTPUT|--in-place SEED [PAGE_ID]".into()); + } + let started = SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis(); + let seed: u64 = args[2].parse()?; + let mut state = seed; + let mut next = || { + state = state.wrapping_add(0x9e3779b97f4a7c15); + let mut value = state; + value = (value ^ (value >> 30)).wrapping_mul(0xbf58476d1ce4e5b9); + value = (value ^ (value >> 27)).wrapping_mul(0x94d049bb133111eb); + value ^ (value >> 31) + }; + let source = onestore::read_file(&args[0])?; + let store = Store::parse(&source)?; + let index = RevisionIndex::parse(&store)?; + index.validate_current()?; + let document = Document::parse(&index)?; + let mut candidates = Vec::new(); + for (sid, page) in document.pages()? { + if args.get(3).is_some_and(|id| *id != page.to_string()) { + continue; + } + let space = &document.spaces[&sid]; + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + let mut pending = vec![page]; + let mut seen = BTreeSet::new(); + while let Some(oid) = pending.pop() { + if !seen.insert(oid) { + continue; + } + let node = &revision.nodes[&oid]; + pending.extend( + node.children + .iter() + .chain(&node.content) + .chain(&node.structure) + .copied(), + ); + if let Kind::RichText { + runs, + boilerplate: false, + .. + } = &node.kind + { + for (run, resolved) in runs.iter().zip(revision.text_runs(oid)?) { + if [ + resolved.format.hidden, + resolved.format.hyperlink, + resolved.format.math, + resolved.format.embedded_object, + ] + .contains(&Some(true)) + { + continue; + } + candidates.push((sid, page, oid, run.start, resolved.text)); + } + } + } + } + for i in (1..candidates.len()).rev() { + candidates.swap(i, (next() % (i as u64 + 1)) as usize); + } + let mut rejected = Vec::new(); + for (sid, page, oid, offset, text) in candidates { + let mut boundaries = vec![0]; + for character in text.chars() { + boundaries.push(boundaries.last().unwrap() + character.len_utf16() as u32); + } + let first = (next() % boundaries.len() as u64) as usize; + let second = (next() % boundaries.len() as u64) as usize; + let mode = next() % 3; + let start = if mode == 0 { first } else { first.min(second) }; + let end = if mode == 0 { first } else { first.max(second) }; + let insertion = match next() % 4 { + 0 => " revised ", + 1 => " café ", + 2 => " 東京 🦀 ", + _ => " e\u{301} ", + }; + let replacement = if mode == 1 && start != end { + "" + } else { + insertion + }; + let end = if text + .chars() + .skip(start) + .take(end - start) + .eq(replacement.chars()) + { + start + } else { + end + }; + let range = offset + boundaries[start]..offset + boundaries[end]; + let written = match onestore::replace_text(&source, sid, oid, range.clone(), replacement) { + Ok(written) => written, + Err(error) => { + rejected.push(error.to_string()); + continue; + } + }; + let space = &document.spaces[&sid]; + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + let Kind::RichText { runs, .. } = &revision.nodes[&oid].kind else { + unreachable!() + }; + let selected = runs + .iter() + .rposition(|run| run.start <= range.start && range.end <= run.end) + .unwrap(); + let actual = revision.text_runs(oid)?; + let mut record = serde_json::json!({"seed": seed, "source": args[0], "page": page, "space": sid, + "object": oid, "range": [range.start, range.end], "replacement": replacement, + "run_before": actual[selected].text, "run_start": runs[selected].start, "source_md5": format!("{:x}", md5::compute(&source)), + "started_ms": started, "rejected_candidates": rejected}); + let failed = if args[1] == "--in-place" { + match onestore::commit_file_text(&args[0], &source, sid, oid, range, replacement) { + Ok(()) => { + record["state"] = "Committed".into(); + false + } + Err(error) => { + record["state"] = format!("{:?}", error.state).into(); + record["error"] = error.error.to_string().into(); + true + } + } + } else { + let mut file = fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(&args[1])?; + file.write_all(&written)?; + flush::flush(&file)?; + record["state"] = "Created".into(); + record["output"] = args[1].clone().into(); + false + }; + record["finished_ms"] = + u64::try_from(SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis())?.into(); + println!("{}", serde_json::to_string(&record)?); + if failed { + std::process::exit(2); + } + return Ok(()); + } + Err(format!( + "No supported text edit on the selected page: {}", + rejected.join("; ") + ) + .into()) +} diff --git a/crates/onestore/examples/revisions.rs b/crates/onestore/examples/revisions.rs new file mode 100644 index 0000000000000000000000000000000000000000..192911b6aee72171ae15aac02b0a951e1f721306 --- /dev/null +++ b/crates/onestore/examples/revisions.rs @@ -0,0 +1,44 @@ +use onestore::{RevisionIndex, Store}; +use std::{env, fs}; + +fn main() -> Result<(), Box> { + for path in env::args_os().skip(1) { + let bytes = fs::read(&path)?; + let store = Store::parse(&bytes)?; + let index = RevisionIndex::parse(&store)?; + index + .validate_current() + .map_err(|error| format!("{path:?}: {error}"))?; + for (id, space) in &index.spaces { + for rid in space.revisions.keys() { + let resolved = index + .resolve(*id, *rid) + .map_err(|error| format!("{path:?}: {id} / {rid}: {error}"))?; + resolved + .reachable() + .map_err(|error| format!("{path:?}: {id} / {rid}: {error}"))?; + for object in resolved.objects.values() { + if let Some(onestore::FileDataReference::Internal(guid)) = + object.file_reference()? + { + store.file_data(guid)?; + } + if let onestore::ObjectData::Properties(bytes) = object.data { + onestore::PropertySets::parse(bytes)?; + } + } + } + } + let revisions: usize = index + .spaces + .values() + .map(|space| space.revisions.len()) + .sum(); + println!( + "{:?}: {} object spaces, {revisions} revisions", + path, + index.spaces.len() + ); + } + Ok(()) +} diff --git a/crates/onestore/src/bytes.rs b/crates/onestore/src/bytes.rs new file mode 100644 index 0000000000000000000000000000000000000000..47d7d138e577352fa8ffc55ca3369f678411381b --- /dev/null +++ b/crates/onestore/src/bytes.rs @@ -0,0 +1,28 @@ +use crate::Error; + +type Result = std::result::Result; + +pub(crate) struct Cursor<'a> { + pub(crate) bytes: &'a [u8], + pub(crate) offset: usize, +} + +impl<'a> Cursor<'a> { + pub(crate) fn take(&mut self, len: usize) -> Result<&'a [u8]> { + let Some((head, tail)) = self.bytes.split_at_checked(len) else { + return Err(Error { + offset: self.offset, + message: "Truncated structure", + }); + }; + self.bytes = tail; + self.offset += len; + Ok(head) + } + + pub(crate) fn read(&mut self) -> Result<[u8; N]> { + let mut value = [0; N]; + value.copy_from_slice(self.take(N)?); + Ok(value) + } +} diff --git a/crates/onestore/src/commit.rs b/crates/onestore/src/commit.rs new file mode 100644 index 0000000000000000000000000000000000000000..ebda8b6cdd38fc09da58e012253ba3a71d44a1d9 --- /dev/null +++ b/crates/onestore/src/commit.rs @@ -0,0 +1,308 @@ +use crate::{ExGuid, replace_property_bytes}; +use std::io::{self, ErrorKind}; + +#[cfg(any(unix, windows))] +use std::{ + fs::File, + io::Read, + path::Path, + sync::{Mutex, MutexGuard}, +}; + +#[cfg(unix)] +use std::os::unix::fs::FileExt; +#[cfg(windows)] +use std::os::windows::fs::FileExt; + +#[cfg(any(unix, windows))] +struct FileIo { + file: File, + _process: MutexGuard<'static, ()>, + unlock_on_drop: bool, +} + +#[cfg(any(unix, windows))] +impl FileIo { + fn open(path: impl AsRef, write: bool) -> io::Result { + static PROCESS: Mutex<()> = Mutex::new(()); + let process = PROCESS + .lock() + .map_err(|_| io::Error::other("A file operation panicked in this process"))?; + let mut options = File::options(); + options.read(true).write(write); + #[cfg(target_os = "macos")] + { + use std::os::unix::fs::OpenOptionsExt; + // SMB can lose exclusion when separate opens race with flock. + options.custom_flags(nix::libc::O_EXLOCK | nix::libc::O_NONBLOCK); + } + let file = options.open(path)?; + #[cfg(not(target_os = "macos"))] + file.try_lock()?; + Ok(Self { + file, + _process: process, + unlock_on_drop: true, + }) + } + + fn release(&mut self) -> io::Result<()> { + // A failed unlock may have reached the server; Drop must not repeat it. + self.unlock_on_drop = false; + self.file.unlock() + } + + fn finish(mut self, result: Result<(), CommitError>) -> Result<(), CommitError> { + let released = self.release(); + result?; + released.map_err(|error| CommitError { + state: CommitState::Committed, + error, + }) + } +} + +#[cfg(any(unix, windows))] +impl Drop for FileIo { + fn drop(&mut self) { + if self.unlock_on_drop { + let _ = self.file.unlock(); + } + } +} + +/// Reads a snapshot under the same whole-file exclusion used for commits. +/// Native writers can expose incomplete graphs to unlocked filesystem reads. +#[cfg(any(unix, windows))] +pub fn read_file(path: impl AsRef) -> io::Result> { + let mut io = FileIo::open(path, false)?; + let mut bytes = Vec::new(); + let result = io.file.read_to_end(&mut bytes); + let released = io.release(); + result?; + released?; + Ok(bytes) +} + +#[cfg(any(unix, windows))] +impl CommitIo for FileIo { + fn read_at(&mut self, offset: u64, bytes: &mut [u8]) -> io::Result { + #[cfg(unix)] + return self.file.read_at(bytes, offset); + #[cfg(windows)] + return self.file.seek_read(bytes, offset); + } + + fn write_at(&mut self, offset: u64, bytes: &[u8]) -> io::Result { + #[cfg(unix)] + return self.file.write_at(bytes, offset); + #[cfg(windows)] + return self.file.seek_write(bytes, offset); + } + + fn flush(&mut self) -> io::Result<()> { + crate::flush::flush(&self.file) + } +} + +/// Commits under an exclusive whole-file lock; contention returns WouldBlock. +/// Calls are serialized within this process because macOS SMB locks are reentrant. +/// Durability relies on the filesystem and server honoring their flush contract. +/// A changed snapshot returns ResourceBusy without publishing the edit. +#[cfg(any(unix, windows))] +pub fn commit_file_property( + path: impl AsRef, + source: &[u8], + space: ExGuid, + object: ExGuid, + property: u32, + value: &[u8], +) -> Result<(), CommitError> { + let mut io = FileIo::open(path, true).map_err(|error| CommitError { + state: CommitState::NotCommitted, + error, + })?; + let result = commit_property_bytes(&mut io, source, space, object, property, value); + io.finish(result) +} + +/// Commits a text edit with the same exclusion and snapshot check as scalar edits. +#[cfg(any(unix, windows))] +pub fn commit_file_text( + path: impl AsRef, + source: &[u8], + space: ExGuid, + object: ExGuid, + range: std::ops::Range, + replacement: &str, +) -> Result<(), CommitError> { + let mut io = FileIo::open(path, true).map_err(|error| CommitError { + state: CommitState::NotCommitted, + error, + })?; + let result = commit_text(&mut io, source, space, object, range, replacement); + io.finish(result) +} + +/// Atomically publishes text and its dependent run boundaries under caller-held exclusion. +pub fn commit_text( + io: &mut impl CommitIo, + source: &[u8], + space: ExGuid, + object: ExGuid, + range: std::ops::Range, + replacement: &str, +) -> Result<(), CommitError> { + let written = + crate::replace_text(source, space, object, range, replacement).map_err(|error| { + CommitError { + state: CommitState::NotCommitted, + error: io::Error::new(ErrorKind::InvalidData, error), + } + })?; + commit_bytes(io, source, &written) +} + +/// The caller must hold OneNote-compatible exclusion for the entire operation. +/// Flush must make preceding writes durable before subsequent writes can persist. +pub trait CommitIo { + fn read_at(&mut self, offset: u64, bytes: &mut [u8]) -> io::Result; + fn write_at(&mut self, offset: u64, bytes: &[u8]) -> io::Result; + fn flush(&mut self) -> io::Result<()>; +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum CommitState { + /// Publication did not occur; preparation bytes may remain. Reread before retrying. + NotCommitted, + /// Publication may have persisted. Reread and reconcile the intent before retrying. + Unknown, + /// Publication was durably acknowledged, but cleanup failed. Do not replay the edit. + Committed, +} + +#[derive(Debug)] +pub struct CommitError { + pub state: CommitState, + pub error: io::Error, +} + +impl std::fmt::Display for CommitError { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "{:?}: {}", self.state, self.error) + } +} + +impl std::error::Error for CommitError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + Some(&self.error) + } +} + +fn write_all(io: &mut impl CommitIo, mut offset: usize, mut bytes: &[u8]) -> io::Result<()> { + while !bytes.is_empty() { + match io.write_at(offset as u64, bytes) { + Ok(0) => return Err(io::Error::from(ErrorKind::WriteZero)), + Ok(count) if count <= bytes.len() => { + offset += count; + bytes = &bytes[count..]; + } + Ok(_) => { + return Err(io::Error::new( + ErrorKind::InvalidData, + "Storage returned an excessive write count", + )); + } + Err(error) if error.kind() == ErrorKind::Interrupted => {} + Err(error) => return Err(error), + } + } + Ok(()) +} + +/// Publishes a scalar revision after checking the locked file against its snapshot. +/// Unknown outcomes require rereading; Committed errors affect counter cleanup or lock release. +pub fn commit_property_bytes( + io: &mut impl CommitIo, + source: &[u8], + space: ExGuid, + object: ExGuid, + property: u32, + value: &[u8], +) -> Result<(), CommitError> { + let written = + replace_property_bytes(source, space, object, property, value).map_err(|error| { + CommitError { + state: CommitState::NotCommitted, + error: io::Error::new(ErrorKind::InvalidData, error), + } + })?; + commit_bytes(io, source, &written) +} + +pub(crate) fn commit_bytes( + io: &mut impl CommitIo, + source: &[u8], + written: &[u8], +) -> Result<(), CommitError> { + let mut state = CommitState::NotCommitted; + let result = (|| -> io::Result<()> { + let mut buffer = [0; 65536]; + let mut offset = 0; + while offset < source.len() { + let size = buffer.len().min(source.len() - offset); + let count = match io.read_at(offset as u64, &mut buffer[..size]) { + Err(error) if error.kind() == ErrorKind::Interrupted => continue, + result => result?, + }; + if count == 0 { + return Err(io::Error::from(ErrorKind::UnexpectedEof)); + } + if count > size || buffer[..count] != source[offset..offset + count] { + return Err(io::Error::new( + ErrorKind::ResourceBusy, + "The locked file differs from the edit snapshot", + )); + } + offset += count; + } + if io.read_at(source.len() as u64, &mut buffer[..1])? != 0 { + return Err(io::Error::new( + ErrorKind::ResourceBusy, + "The locked file grew after the edit snapshot", + )); + } + if written == source { + state = CommitState::Unknown; + io.flush()?; + return Ok(()); + } + write_all(io, source.len(), &written[source.len()..])?; + let mut offset = 1024; + while offset < source.len() { + if source[offset] == written[offset] { + offset += 1; + continue; + } + let start = offset; + while offset < source.len() && source[offset] != written[offset] { + offset += 1; + } + write_all(io, start, &written[start..offset])?; + } + io.flush()?; + write_all(io, 100, &written[100..1024])?; + io.flush()?; + let highest = (96..100).rfind(|at| source[*at] != written[*at]).unwrap(); + state = CommitState::Unknown; + write_all(io, highest, &written[highest..highest + 1])?; + io.flush()?; + state = CommitState::Committed; + if highest > 96 { + write_all(io, 96, &written[96..highest])?; + io.flush()?; + } + Ok(()) + })(); + result.map_err(|error| CommitError { state, error }) +} diff --git a/crates/onestore/src/create.rs b/crates/onestore/src/create.rs new file mode 100644 index 0000000000000000000000000000000000000000..e84bf7bbccfb4edfa167deca785d39577138cbf3 --- /dev/null +++ b/crates/onestore/src/create.rs @@ -0,0 +1,554 @@ +use crate::{ + Chunk, Error, ExGuid, FileType, PropertySets, Reference, RevisionIndex, Store, + store::crc, + write::{append, append_list, fresh_guid, node}, +}; +use std::collections::BTreeMap; +use std::time::{SystemTime, UNIX_EPOCH}; + +type Result = std::result::Result; + +fn string(value: &str) -> Vec { + value + .encode_utf16() + .chain([0]) + .flat_map(u16::to_le_bytes) + .collect() +} + +fn properties(values: &[(u32, Vec)]) -> Result> { + let mut streams: [Vec; 3] = std::array::from_fn(|_| Vec::new()); + let mut fields = Vec::new(); + for (id, value) in values { + let kind = (id >> 26) & 0x1f; + match kind { + 1 | 2 => assert!(value.is_empty()), + 3..=6 => { + assert_eq!(value.len(), 1 << (kind - 3)); + fields.extend(value); + } + 7 => { + if value.len() >= 0x40000000 { + return Err(Error { + offset: 0, + message: "Property data exceeds the format length limit", + }); + } + fields.extend_from_slice(&(value.len() as u32).to_le_bytes()); + fields.extend(value); + } + 8..=13 => { + assert!(value.len().is_multiple_of(4)); + if kind & 1 == 0 { + assert_eq!(value.len(), 4); + } else { + fields + .extend_from_slice(&u32::try_from(value.len() / 4).unwrap().to_le_bytes()); + } + streams[((kind - 8) / 2) as usize].extend(value); + } + _ => unreachable!(), + } + } + let mut data = Vec::new(); + let extended = !streams[2].is_empty(); + let last = if extended { + 2 + } else if !streams[1].is_empty() { + 1 + } else { + 0 + }; + for (index, stream) in streams.iter().enumerate().take(last + 1) { + let mut header = u32::try_from(stream.len() / 4).unwrap(); + assert!(header <= 0xffffff); + if index == 0 && last == 0 { + header |= 0x80000000; + } + if index < 2 && extended { + header |= 0x40000000; + } + data.extend_from_slice(&header.to_le_bytes()); + data.extend(stream); + } + data.extend_from_slice(&u16::try_from(values.len()).unwrap().to_le_bytes()); + for (id, _) in values { + data.extend_from_slice(&id.to_le_bytes()); + } + data.extend(fields); + data.resize(data.len().next_multiple_of(8), 0); + PropertySets::parse(&data)?; + Ok(data) +} + +struct NewObject { + id: u32, + jcid: u32, + properties: Vec<(u32, Vec)>, +} + +struct NewSpace { + id: u32, + roots: Vec<(u32, u32)>, + objects: Vec, +} + +pub(crate) fn current_timestamps() -> Result<(u32, u64)> { + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .map_err(|_| Error { + offset: 0, + message: "System time precedes the Unix epoch", + })? + .as_secs(); + let modified = now + .checked_sub(315532800) + .and_then(|time| u32::try_from(time).ok()) + .ok_or(Error { + offset: 0, + message: "System time exceeds the OneNote Time32 range", + })?; + Ok((modified, (now + 11644473600) * 10000000)) +} + +/// Creates a section with one page and one plain-text paragraph, without a template. +/// Text must not contain NUL or line-feed characters. +pub fn create_section(file_name: &str, text: &str, author: &str) -> Result> { + if file_name.contains(['/', '\\', '\0']) + || !file_name.to_ascii_lowercase().ends_with(".one") + || text.contains(['\0', '\n']) + || author.contains('\0') + { + return Err(Error { + offset: 0, + message: "Invalid section name, paragraph text, or author", + }); + } + let (modified, timestamp) = current_timestamps()?; + let timestamp = timestamp.to_le_bytes().to_vec(); + let page_guid = fresh_guid()?; + let metadata = vec![ + (0x1c001c30, page_guid.to_vec()), + (0x1c001cf3, string(crate::edit::automatic_title(text))), + (0x14001d82, 40_u32.to_le_bytes().to_vec()), + (0x1400348b, 40_u32.to_le_bytes().to_vec()), + (0x14001dff, 1_u32.to_le_bytes().to_vec()), + (0x18001c65, timestamp.clone()), + ]; + let id = |value: u32| value.to_le_bytes().to_vec(); + let last_modified = || (0x14001d7a, modified.to_le_bytes().to_vec()); + let spaces = vec![ + NewSpace { + id: 1, + roots: vec![(1, 10), (2, 11)], + objects: vec![ + NewObject { + id: 10, + jcid: 0x60007, + properties: vec![ + (0x1c001c30, fresh_guid()?.to_vec()), + (0x18001c65, timestamp.clone()), + (0x24001c20, id(12)), + ], + }, + NewObject { + id: 11, + jcid: 0x20031, + properties: vec![ + (0x14001d82, id(40)), + (0x1400348b, id(40)), + (0x14001cbe, vec![0x8a, 0xa8, 0xe4, 0]), + ], + }, + NewObject { + id: 12, + jcid: 0x60008, + properties: vec![ + (0x1c001c30, fresh_guid()?.to_vec()), + (0x18001c65, timestamp), + (0x2c001d63, id(257)), + ], + }, + ], + }, + NewSpace { + id: 257, + roots: vec![(1, 20), (2, 21)], + objects: vec![ + NewObject { + id: 20, + jcid: 0x60037, + properties: vec![(0x24001c1f, id(22))], + }, + NewObject { + id: 21, + jcid: 0x20030, + properties: metadata, + }, + NewObject { + id: 22, + jcid: 0x6000b, + properties: vec![ + last_modified(), + (0x24001c20, id(23)), + (0x1c001d75, string(author)), + (0x1c001d3c, string(crate::edit::automatic_title(text))), + ], + }, + NewObject { + id: 23, + jcid: 0x6000c, + properties: vec![ + last_modified(), + (0x24001c20, id(24)), + (0x0c001c03, vec![1]), + (0x1c001c12, vec![1, 0, 0, 0, 0, 0, 0, 0]), + (0x14001c14, 1_f32.to_le_bytes().to_vec()), + (0x14001c15, 1_f32.to_le_bytes().to_vec()), + (0x14001c1b, 13_f32.to_le_bytes().to_vec()), + (0x14001c1c, 0.6_f32.to_le_bytes().to_vec()), + ], + }, + NewObject { + id: 24, + jcid: 0x6000d, + properties: vec![ + last_modified(), + (0x24001c1f, id(25)), + (0x0c001c03, vec![1]), + (0x20001d78, id(26)), + (0x20001d79, id(26)), + (0x14001d09, modified.to_le_bytes().to_vec()), + ], + }, + NewObject { + id: 25, + jcid: 0x6000e, + properties: vec![ + last_modified(), + (0x1c001c22, string(text)), + (0x24001e13, id(27)), + (0x10001cfe, 0x409_u16.to_le_bytes().to_vec()), + ], + }, + NewObject { + id: 26, + jcid: 0x120001, + properties: vec![(0x1c001d75, string(author))], + }, + NewObject { + id: 27, + jcid: 0x12004d, + properties: vec![ + (0x14001c3b, id(0x409)), + (0x1c001c0a, string("Calibri")), + (0x10001c0b, 22_u16.to_le_bytes().to_vec()), + ], + }, + ], + }, + ]; + create(file_name, FileType::Section, spaces) +} + +/// Creates a notebook table of contents from section filenames and file identities. +pub fn create_table_of_contents(file_name: &str, sections: &[(&str, [u8; 16])]) -> Result> { + if file_name.contains(['/', '\\', '\0']) + || !file_name.to_ascii_lowercase().ends_with(".onetoc2") + || sections.len() > 0xfffffe + { + return Err(Error { + offset: 0, + message: "Invalid table-of-contents filename or section count", + }); + } + let mut objects = Vec::new(); + let mut children = Vec::new(); + let mut names = std::collections::BTreeSet::new(); + let mut identities = std::collections::BTreeSet::new(); + for (index, (name, identity)) in sections.iter().enumerate() { + if name.contains(['/', '\\', '\0']) + || !name.to_ascii_lowercase().ends_with(".one") + || !names.insert(name.to_lowercase()) + || *identity == [0; 16] + || !identities.insert(*identity) + { + return Err(Error { + offset: 0, + message: "Invalid or duplicate section filename or identity", + }); + } + let id = (((index + 1) as u32) << 8) | 10; + children.extend_from_slice(&id.to_le_bytes()); + objects.push(NewObject { + id, + jcid: 0x20001, + properties: vec![ + (0x1c001d94, identity.to_vec()), + (0x14001cb9, ((index + 1) as u32).to_le_bytes().to_vec()), + (0x1c001d6b, string(name)), + (0x14001cbe, vec![0xff; 4]), + ], + }); + } + objects.push(NewObject { + id: 10, + jcid: 0x20001, + properties: vec![(0x24001cf6, children)], + }); + create( + file_name, + FileType::TableOfContents, + vec![NewSpace { + id: 1, + roots: vec![(1, 10)], + objects, + }], + ) +} + +fn create(file_name: &str, file_type: FileType, spaces: Vec) -> Result> { + let is_section = file_type == FileType::Section; + let maximum = spaces + .iter() + .flat_map(|space| { + std::iter::once(space.id).chain(space.objects.iter().map(|object| object.id)) + }) + .max() + .unwrap(); + let guids = (0..=(maximum >> 8)) + .map(|_| fresh_guid()) + .collect::>>()?; + let exguid = |compact: u32| ExGuid { + guid: guids[(compact >> 8) as usize], + n: compact & 255, + }; + let mut output = vec![0; 1024]; + let mut root_payload = Vec::new(); + exguid(spaces[0].id).encode(&mut root_payload); + let mut root = Vec::new(); + let mut log = Vec::new(); + let mut list_id = 16_u32; + let mut hashed = Vec::new(); + for space in spaces { + let mut counts = BTreeMap::::new(); + for (_, id) in &space.roots { + *counts.entry(*id).or_default() += 1; + } + for object in &space.objects { + for (property, value) in &object.properties { + if matches!((property >> 26) & 0x1f, 8 | 9) { + for id in value.chunks_exact(4) { + *counts + .entry(u32::from_le_bytes(id.try_into().unwrap())) + .or_default() += 1; + } + } + } + } + let group_id = ExGuid { + guid: fresh_guid()?, + n: 1, + }; + let mut group_payload = Vec::new(); + group_id.encode(&mut group_payload); + let mut group = if is_section { + vec![node(0xb4, None, &group_payload)?, node(0x22, None, &[])?] + } else { + vec![node(0x21, None, &[0])?] + }; + for (index, guid) in guids.iter().enumerate() { + let mut entry = (index as u32).to_le_bytes().to_vec(); + entry.extend_from_slice(guid); + group.push(node(0x24, None, &entry)?); + } + group.push(node(0x28, None, &[])?); + let mut override_crc = if is_section { u32::MAX } else { 0 }; + for object in space.objects { + let data = properties(&object.properties)?; + let chunk = append(&mut output, &data)?; + let mut payload = object.id.to_le_bytes().to_vec(); + let mut flags = 0; + for (property, value) in object.properties { + if !value.is_empty() { + match (property >> 26) & 0x1f { + 8 | 9 => flags |= 1, + 10..=13 => flags |= 2, + _ => {} + } + } + } + if is_section { + payload.extend_from_slice(&object.jcid.to_le_bytes()); + payload.push(flags); + } else { + let body = 1_u64 | (u64::from(flags & 1) << 16); + payload.extend_from_slice(&body.to_le_bytes()[..6]); + } + let count = counts.get(&object.id).copied().unwrap_or(0).to_le_bytes(); + payload.extend_from_slice(&count); + override_crc = crc(override_crc, &count, file_type); + let readonly = object.jcid & 0x100000 != 0; + if readonly { + let hash = md5::compute(&data).0; + payload.extend_from_slice(&hash); + hashed.push(node(0xc2, Some(Reference::Data(chunk)), &hash)?); + } + group.push(node( + if !is_section { + 0x2e + } else if readonly { + 0xc5 + } else { + 0xa5 + }, + Some(Reference::Data(chunk)), + &payload, + )?); + } + let group_chunk = if is_section { + group.push(node(0xb8, None, &[])?); + Some(append_list(&mut output, list_id, &group)?) + } else { + None + }; + let group_count = group.len(); + let mut start = Vec::new(); + exguid(space.id).encode(&mut start); + start.extend_from_slice(&0_u32.to_le_bytes()); + let mut revision = Vec::new(); + ExGuid { + guid: fresh_guid()?, + n: 1, + } + .encode(&mut revision); + ExGuid::default().encode(&mut revision); + if !is_section { + revision.extend_from_slice(&0_u64.to_le_bytes()); + } + revision.extend_from_slice(&1_u32.to_le_bytes()); + revision.extend_from_slice(&0_u16.to_le_bytes()); + let mut manifest = vec![ + node(0x14, None, &start)?, + node(if is_section { 0x1e } else { 0x1b }, None, &revision)?, + ]; + if let Some(chunk) = group_chunk { + manifest.push(node( + 0xb0, + Some(Reference::NodeList(chunk)), + &group_payload, + )?); + let mut overrides = vec![0; 8]; + overrides.extend_from_slice(&(!override_crc).to_le_bytes()); + manifest.push(node( + 0x84, + Some(Reference::Data(Chunk { + offset: u64::MAX, + length: 0, + })), + &overrides, + )?); + } else { + manifest.extend(group); + } + for (role, oid) in space.roots { + let mut payload = Vec::new(); + if is_section { + exguid(oid).encode(&mut payload); + } else { + payload.extend_from_slice(&oid.to_le_bytes()); + } + payload.extend_from_slice(&role.to_le_bytes()); + manifest.push(node(if is_section { 0x5a } else { 0x59 }, None, &payload)?); + } + manifest.push(node(0x1c, None, &[])?); + let manifest_chunk = append_list(&mut output, list_id + 1, &manifest)?; + let mut space_payload = Vec::new(); + exguid(space.id).encode(&mut space_payload); + let space_nodes = vec![ + node(0xc, None, &space_payload)?, + node(0x10, Some(Reference::NodeList(manifest_chunk)), &[])?, + ]; + let space_chunk = append_list(&mut output, list_id + 2, &space_nodes)?; + root.push(node( + 8, + Some(Reference::NodeList(space_chunk)), + &space_payload, + )?); + for (id, count) in [ + (list_id, group_count), + (list_id + 1, manifest.len()), + (list_id + 2, space_nodes.len()), + ] { + if id == list_id && !is_section { + continue; + } + log.extend_from_slice(&id.to_le_bytes()); + log.extend_from_slice(&u32::try_from(count).unwrap().to_le_bytes()); + } + list_id += 3; + } + root.push(node(4, None, &root_payload)?); + let root_chunk = append_list(&mut output, list_id, &root)?; + log.extend_from_slice(&list_id.to_le_bytes()); + log.extend_from_slice(&u32::try_from(root.len()).unwrap().to_le_bytes()); + let hashed_chunk = if !hashed.is_empty() { + let chunk = append_list(&mut output, list_id + 1, &hashed)?; + log.extend_from_slice(&(list_id + 1).to_le_bytes()); + log.extend_from_slice(&u32::try_from(hashed.len()).unwrap().to_le_bytes()); + Some(chunk) + } else { + None + }; + let checksum = if is_section { + !crc(u32::MAX, &log, file_type) + } else { + crc(0, &log, file_type) + }; + log.extend_from_slice(&1_u32.to_le_bytes()); + log.extend_from_slice(&checksum.to_le_bytes()); + log.extend_from_slice(&u64::MAX.to_le_bytes()); + log.extend_from_slice(&0_u32.to_le_bytes()); + let log_chunk = append(&mut output, &log)?; + output[..16].copy_from_slice(&[ + 0xe4, 0x52, 0x5c, 0x7b, 0x8c, 0xd8, 0xa7, 0x4d, 0xae, 0xb1, 0x53, 0x78, 0xd0, 0x29, 0x96, + 0xd3, + ]); + if !is_section { + output[..16].copy_from_slice(&[ + 0xa1, 0x2f, 0xff, 0x43, 0xd9, 0xef, 0x76, 0x4c, 0x9e, 0xe2, 0x10, 0xea, 0x57, 0x22, + 0x76, 0x5f, + ]); + } + output[16..32].copy_from_slice(&fresh_guid()?); + output[48..64].copy_from_slice(&[ + 0x3f, 0xdd, 0x9a, 0x10, 0x1b, 0x91, 0xf5, 0x49, 0xa5, 0xd0, 0x17, 0x91, 0xed, 0xc8, 0xae, + 0xd8, + ]); + for at in [64, 68, 72, 76] { + output[at..at + 4] + .copy_from_slice(&(if is_section { 42_u32 } else { 27_u32 }).to_le_bytes()); + } + for at in [88, 112] { + output[at..at + 4].copy_from_slice(&u32::MAX.to_le_bytes()); + } + output[96..100].copy_from_slice(&1_u32.to_le_bytes()); + output[144..148] + .copy_from_slice(&(!crc(u32::MAX, &string(file_name), FileType::Section)).to_le_bytes()); + for (at, chunk) in hashed_chunk + .map(|chunk| (148, chunk)) + .into_iter() + .chain([(160, log_chunk), (172, root_chunk)]) + { + output[at..at + 8].copy_from_slice(&chunk.offset.to_le_bytes()); + output[at + 8..at + 12].copy_from_slice(&(chunk.length as u32).to_le_bytes()); + } + let length = output.len() as u64; + output[196..204].copy_from_slice(&length.to_le_bytes()); + output[212..228].copy_from_slice(&fresh_guid()?); + output[228..236].copy_from_slice(&1_u64.to_le_bytes()); + output[236..252].copy_from_slice(&fresh_guid()?); + let store = Store::parse(&output)?; + RevisionIndex::parse(&store)?.validate_current()?; + Ok(output) +} diff --git a/crates/onestore/src/document.rs b/crates/onestore/src/document.rs new file mode 100644 index 0000000000000000000000000000000000000000..1b60009b33144190f283b4f2c1219cec65790e29 --- /dev/null +++ b/crates/onestore/src/document.rs @@ -0,0 +1,1126 @@ +//! Referenced MS-ONE document revisions. Coordinates are points; text offsets are UTF-16 units. +//! +//! These are inspection views of one section or table-of-contents file. Mutating +//! their public fields does not edit the notebook; use the crate's commit functions. + +use crate::{ + Error, ExGuid, FileDataReference, IdStream, Object, ObjectData, Property, PropertySets, + RevisionIndex, Store, Value, bytes::Cursor, +}; +use serde::Serialize; +use std::collections::{BTreeMap, BTreeSet}; + +type Result = std::result::Result; + +fn invalid(message: &'static str) -> Error { + Error { offset: 0, message } +} + +#[derive(Debug, Serialize)] +/// Borrows source payloads; retain the input snapshot and store while using this view. +pub struct Document<'a> { + pub file_id: [u8; 16], + pub root: ExGuid, + pub spaces: BTreeMap>, +} + +#[derive(Debug, Serialize)] +pub struct Space<'a> { + pub contexts: BTreeMap, + pub revisions: BTreeMap>, +} + +#[derive(Debug, Serialize)] +pub struct Revision<'a> { + pub roots: BTreeMap, + pub nodes: BTreeMap>, +} + +#[derive(Debug, Serialize)] +pub struct Element<'a> { + pub jcid: u32, + pub children: Vec, + pub content: Vec, + pub structure: Vec, + pub spaces: Vec, + /// Relative indentation level of child outline elements. + pub child_level: Option, + pub layout: Layout, + pub format: Format, + /// Time32 seconds since 1980-01-01 UTC. + pub created: Option, + /// Time32 seconds since 1980-01-01 UTC. + pub modified: Option, + pub original_author: Option, + pub latest_author: Option, + pub media_ids: Vec<[u8; 16]>, + pub media_time_ms: Option, + pub tags: Vec, + pub kind: Kind<'a>, + /// Uninterpreted fields retain their nested-set indices and decoded reference identities. + pub extra: Vec>>, +} + +#[derive(Debug, Default, Serialize)] +pub struct Layout { + pub x: Option, + pub y: Option, + pub max_width: Option, + pub max_height: Option, +} + +macro_rules! format_fields { + ($($field:ident: $value:ty),* $(,)?) => { + #[derive(Debug, Default, Serialize)] + pub struct Format { $(pub $field: Option<$value>),* } + + impl Format { + /// Explicit false values override inherited true values. + pub fn inherit(&self, parent: &Self) -> Self { + Self { $($field: self.$field.as_ref().or(parent.$field.as_ref()).cloned()),* } + } + } + }; +} + +format_fields! { + bold: bool, + italic: bool, + underline: bool, + strike: bool, + superscript: bool, + subscript: bool, + hidden: bool, + hyperlink: bool, + hyperlink_label: bool, + math: bool, + embedded_object: bool, + font: String, + font_size: f32, + color: u32, + highlight: u32, + language: u32, + alignment: u8, + rtl: bool, + space_before: f32, + space_after: f32, + line_spacing: f32, +} + +#[derive(Debug, Serialize)] +pub struct TextRun { + pub start: u32, + pub end: u32, + pub format: Option, + /// Index in the text element's extra arena for preserved TextRunData properties. + pub extra_set: Option, +} + +#[derive(Debug, Serialize)] +pub struct ResolvedTextRun<'a> { + pub text: &'a str, + pub format: Format, + pub link: Option<&'a str>, +} + +impl Revision<'_> { + /// Resolves inherited formatting without discarding hidden fields or their source text. + pub fn text_runs(&self, id: ExGuid) -> Result>> { + let node = self + .nodes + .get(&id) + .ok_or_else(|| invalid("Missing text object"))?; + let Kind::RichText { + text, + runs, + paragraph_style, + .. + } = &node.kind + else { + return Err(invalid("Expected a rich-text object")); + }; + let style = |id: ExGuid| -> Result<&Format> { + let node = self + .nodes + .get(&id) + .ok_or_else(|| invalid("Missing text style"))?; + if !matches!(node.kind, Kind::Style { .. }) { + return Err(invalid("Text formatting does not reference a style")); + } + Ok(&node.format) + }; + let default = Format::default(); + let parent = paragraph_style.map(style).transpose()?.unwrap_or(&default); + let base = node.format.inherit(parent); + let mut characters = text.char_indices(); + let (mut units, mut byte) = (0, 0); + let mut target = None; + let mut resolved = Vec::with_capacity(runs.len()); + for run in runs { + if run.start != units || run.end < units { + return Err(invalid("Text runs do not partition the text")); + } + let start = byte; + while units < run.end { + let (offset, character) = characters + .next() + .ok_or_else(|| invalid("Text run exceeds text"))?; + units = units + .checked_add(character.len_utf16() as u32) + .ok_or_else(|| invalid("Text exceeds UTF-16 offset range"))?; + byte = offset + character.len_utf8(); + } + if units != run.end { + return Err(invalid("Text-run boundary splits a surrogate pair")); + } + let fragment = &text[start..byte]; + let format = run + .format + .map(style) + .transpose()? + .unwrap_or(&default) + .inherit(&base); + let mut link = None; + if format.hyperlink != Some(true) { + target = None; + } else if format.hidden == Some(true) { + // OneNote's native field encoding is retained even when its syntax is unrecognized. + target = fragment + .strip_prefix("\u{fddf}HYPERLINK \"") + .and_then(|s| s.strip_suffix('"')); + } else if format.hyperlink_label == Some(true) { + link = target; + } else { + link = Some(fragment); + } + resolved.push(ResolvedTextRun { + text: fragment, + format, + link, + }); + } + if byte != text.len() { + return Err(invalid("Text runs do not cover the text")); + } + Ok(resolved) + } +} + +#[derive(Debug, Serialize)] +/// Tag dates count seconds since 1980-01-01 UTC; status retains the ActionItemStatus bits. +pub struct Tag { + pub definition: Option, + pub action_type: Option, + pub status: u16, + pub created: Option, + pub completed: Option, + pub start: Option, + pub due: Option, + pub task_id: Option<[u8; 16]>, + /// Index in the element's extra-property arena for uninterpreted tag fields. + pub extra_set: usize, +} + +#[derive(Debug, Serialize)] +#[serde(tag = "type")] +pub enum Kind<'a> { + Section { + default_template: Option, + }, + PageSeries, + Manifest { + history: Option, + }, + VersionHistory, + VersionProxy { + context: ExGuid, + modified_filetime: Option, + }, + VersionHistoryMetadata, + /// Native default-page template metadata, outside the published MS-ONE object list. + TemplateMetadata { + name: Option, + }, + Page { + alternate_title: Option, + level: Option, + width: Option, + height: Option, + margin_origin_x: Option, + margin_origin_y: Option, + rtl: Option, + }, + Metadata { + title: Option, + level: Option, + }, + ConflictMetadata { + title: Option, + level: Option, + author: Option, + }, + RevisionMetadata { + modified_filetime: Option, + }, + SectionMetadata { + name: Option, + color: Option, + }, + Title, + Outline { + indents: Vec, + }, + Paragraph { + lists: Vec, + paragraph_style: Option, + /// Native saved defaults: 0 expanded, 1 collapsed; other values remain uninterpreted. + collapse_state: Option, + }, + OutlineGroup, + /// Native ink properties remain uninterpreted in the element's extra arena. + Ink, + RichText { + text: String, + runs: Vec, + paragraph_style: Option, + boilerplate: bool, + }, + Style { + name: Option, + }, + List { + font: Option, + format: Option, + restart: Option, + bullet: Option, + }, + /// Column arrays and row children use visual left-to-right order, including on RTL pages. + Table { + rows: Option, + columns: Option, + widths: Vec, + locked: Vec, + borders: Option, + }, + Row, + Cell { + shading: Option, + }, + Image { + container: Option, + filename: Option, + alt: Option, + picture_width: Option, + picture_height: Option, + background: Option, + printout: Option, + link: Option, + }, + Attachment { + container: Option, + preview: Option, + filename: Option, + source_path: Option, + recording_id: Option<[u8; 16]>, + recording_type: Option, + }, + File { + reference: FileDataReference, + extension: String, + #[serde(skip)] + payload: Option<&'a [u8]>, + }, + Author { + name: Option, + }, + TagDefinition { + label: Option, + action_type: Option, + shape: Option, + color: Option, + highlight: Option, + }, + Toc { + entries: Vec, + filename: Option, + identity: Option<[u8; 16]>, + order: Option, + color: Option, + }, + Encrypted { + #[serde(serialize_with = "hex")] + ciphertext: &'a [u8], + }, + Unknown, +} + +#[derive(Debug, Serialize)] +pub struct Field<'a> { + pub id: u32, + pub value: FieldValue<'a>, +} + +#[derive(Debug, Serialize)] +pub enum FieldValue<'a> { + NoData, + Bytes(#[serde(serialize_with = "hex")] &'a [u8]), + Objects(Vec), + Spaces(Vec), + Contexts(Vec), + Sets(std::ops::Range), +} + +fn hex(bytes: &&[u8], serializer: S) -> std::result::Result { + use std::fmt::Write; + let mut text = String::with_capacity(bytes.len() * 2); + for byte in *bytes { + write!(text, "{byte:02x}").unwrap(); + } + serializer.serialize_str(&text) +} + +fn unicode(bytes: &[u8]) -> Result { + if !bytes.len().is_multiple_of(2) { + return Err(invalid("Odd UTF-16 document string length")); + } + let units: Vec<_> = bytes + .chunks_exact(2) + .map(|x| u16::from_le_bytes(x.try_into().unwrap())) + .collect(); + String::from_utf16(units.strip_suffix(&[0]).unwrap_or(&units)) + .map_err(|_| invalid("Invalid UTF-16 document string")) +} + +struct Fields<'a, 'o> { + sets: Vec>>, + ids: &'o BTreeMap, +} + +impl<'a, 'o> Fields<'a, 'o> { + fn new(object: &'o Object<'a>) -> Result { + let ObjectData::Properties(bytes) = object.data else { + return Err(invalid("Expected document properties")); + }; + let sets = PropertySets::parse(bytes)?.sets; + for set in &sets { + let mut seen = BTreeSet::new(); + if set.iter().any(|p| !seen.insert(p.id & 0x7fffffff)) { + return Err(invalid("Repeated document property")); + } + } + Ok(Self { + sets, + ids: &object.global_ids, + }) + } + + fn take(&mut self, id: u32) -> Option> { + let index = self.sets[0].iter().position(|p| p.id & 0x7fffffff == id)?; + Some(self.sets[0].remove(index)) + } + + fn bytes(&mut self, id: u32) -> Result> { + self.take(id) + .map(|p| match p.value { + Value::Bytes(bytes) => Ok(bytes), + _ => Err(invalid("Document property requires bytes")), + }) + .transpose() + } + + fn fixed(&mut self, id: u32) -> Result> { + self.bytes(id)? + .map(|b| { + b.try_into() + .map_err(|_| invalid("Document scalar has an invalid length")) + }) + .transpose() + } + + fn u32(&mut self, id: u32) -> Result> { + Ok(self.fixed(id)?.map(u32::from_le_bytes)) + } + fn u16(&mut self, id: u32) -> Result> { + Ok(self.fixed(id)?.map(u16::from_le_bytes)) + } + fn u8(&mut self, id: u32) -> Result> { + Ok(self.fixed::<1>(id)?.map(|b| b[0])) + } + fn float(&mut self, id: u32, scale: f32) -> Result> { + self.fixed(id)? + .map(|b| finite(f32::from_le_bytes(b) * scale)) + .transpose() + } + fn text(&mut self, id: u32) -> Result> { + self.bytes(id)?.map(unicode).transpose() + } + fn boolean(&mut self, id: u32) -> Result> { + self.take(id) + .map(|p| match p.value { + Value::NoData => Ok(p.id & 0x80000000 != 0), + _ => Err(invalid("Document flag requires a Boolean")), + }) + .transpose() + } + fn refs(&mut self, id: u32, expected: IdStream) -> Result> { + self.take(id) + .map(|p| match p.value { + Value::References { + stream, + compact_ids, + } if stream == expected => references(compact_ids, self.ids), + _ => Err(invalid("Document reference uses the wrong stream")), + }) + .transpose() + .map(Option::unwrap_or_default) + } + fn one(&mut self, id: u32) -> Result> { + let refs = self.refs(id, IdStream::Objects)?; + if refs.len() > 1 { + return Err(invalid("Document scalar has multiple references")); + } + Ok(refs.first().copied()) + } + fn remainder(self) -> Result>>> { + self.sets + .into_iter() + .map(|set| { + set.into_iter() + .map(|p| { + let value = match p.value { + Value::NoData => FieldValue::NoData, + Value::Bytes(b) => FieldValue::Bytes(b), + Value::Sets(r) => FieldValue::Sets(r), + Value::References { + stream, + compact_ids, + } => { + let refs = references(compact_ids, self.ids)?; + match stream { + IdStream::Objects => FieldValue::Objects(refs), + IdStream::ObjectSpaces => FieldValue::Spaces(refs), + IdStream::Contexts => FieldValue::Contexts(refs), + } + } + }; + Ok(Field { id: p.id, value }) + }) + .collect() + }) + .collect() + } +} + +fn references(bytes: &[u8], ids: &BTreeMap) -> Result> { + let mut cursor = Cursor { bytes, offset: 0 }; + let mut result = Vec::new(); + while !cursor.bytes.is_empty() { + result.push(cursor.compact(ids)?); + } + Ok(result) +} + +fn finite(value: f32) -> Result { + if value.is_finite() { + Ok(value) + } else { + Err(invalid("Non-finite document measurement")) + } +} + +fn measurements(bytes: Option<&[u8]>, header: usize) -> Result> { + let Some(bytes) = bytes else { + return Ok(Vec::new()); + }; + if bytes.len() < header || bytes.len() != header + usize::from(bytes[0]) * 4 { + return Err(invalid("Document measurement array has an invalid length")); + } + bytes[header..] + .chunks_exact(4) + .map(|b| finite(f32::from_le_bytes(b.try_into().unwrap()) * 36.0)) + .collect() +} + +impl<'a> Document<'a> { + /// Active (object space, page) identities in section order, excluding history and conflicts. + /// Encrypted sections return no visible pages; table-of-contents files return an error. + pub fn pages(&self) -> Result> { + let active = |sid| { + self.spaces + .get(&sid) + .and_then(|s| { + s.contexts + .get(&ExGuid::default()) + .and_then(|rid| s.revisions.get(rid)) + }) + .ok_or_else(|| invalid("Section page has no active revision")) + }; + let root = active(self.root)?; + let section = root + .roots + .get(&1) + .and_then(|id| root.nodes.get(id)) + .ok_or_else(|| invalid("Section root is unavailable"))?; + if matches!(section.kind, Kind::Encrypted { .. }) { + return Ok(Vec::new()); + } + if !matches!(section.kind, Kind::Section { .. }) { + return Err(invalid("Expected a section document")); + } + let mut pages = Vec::new(); + let mut seen = BTreeSet::new(); + for id in §ion.children { + let series = root + .nodes + .get(id) + .ok_or_else(|| invalid("Page series is unavailable"))?; + if !matches!(series.kind, Kind::PageSeries) { + return Err(invalid("Section child is not a page series")); + } + for sid in &series.spaces { + let revision = active(*sid)?; + let manifest = revision + .roots + .get(&1) + .and_then(|id| revision.nodes.get(id)) + .ok_or_else(|| invalid("Page manifest is unavailable"))?; + if !matches!(manifest.kind, Kind::Manifest { .. }) { + return Err(invalid("Page space has no manifest")); + } + for page in &manifest.content { + if !matches!( + revision.nodes.get(page).map(|n| &n.kind), + Some(Kind::Page { .. }) + ) || !seen.insert((*sid, *page)) + { + return Err(invalid( + "Section page is missing, duplicated or has the wrong type", + )); + } + pages.push((*sid, *page)); + } + } + } + Ok(pages) + } + + /// Rejects checksum damage and follows referenced contexts, retaining encrypted payloads opaquely. + pub fn parse(index: &RevisionIndex<'a>) -> Result { + if !index.store.checksum_mismatches.is_empty() { + return Err(invalid("Document transaction checksum mismatch")); + } + let mut spaces: BTreeMap> = BTreeMap::new(); + let mut pending = vec![(index.root, ExGuid::default())]; + while let Some((id, context)) = pending.pop() { + let space = spaces.entry(id).or_insert_with(|| Space { + contexts: BTreeMap::new(), + revisions: BTreeMap::new(), + }); + if space.contexts.contains_key(&context) { + continue; + } + let rid = *index + .spaces + .get(&id) + .and_then(|s| s.labels.get(&(context, 1))) + .ok_or_else(|| invalid("Document context has no revision"))?; + space.contexts.insert(context, rid); + if space.revisions.contains_key(&rid) { + continue; + } + let revision = index.resolve(id, rid)?; + let mut reachable = BTreeSet::new(); + let mut objects: Vec<_> = revision.roots.values().copied().collect(); + let mut encrypted = false; + while let Some(oid) = objects.pop() { + if !reachable.insert(oid) { + continue; + } + let object = revision + .objects + .get(&oid) + .ok_or_else(|| invalid("Document object has no declaration"))?; + if matches!(object.data, ObjectData::Encrypted(_)) { + encrypted = true; + } else { + objects.extend(object.references()?.objects); + } + } + if !encrypted { + revision.reachable()?; + } + let mut nodes = BTreeMap::new(); + for oid in reachable { + let object = &revision.objects[&oid]; + if !matches!(object.data, ObjectData::Encrypted(_)) { + let refs = object.references()?; + pending.extend( + refs.object_spaces + .into_iter() + .map(|sid| (sid, ExGuid::default())), + ); + pending.extend(refs.contexts.into_iter().map(|context| (id, context))); + } + nodes.insert(oid, Element::parse(object, index.store)?); + } + for node in nodes.values() { + if let Kind::RichText { + runs, + paragraph_style, + .. + } = &node.kind + { + for target in paragraph_style + .iter() + .chain(runs.iter().filter_map(|r| r.format.as_ref())) + { + if !matches!(nodes.get(target).map(|n| &n.kind), Some(Kind::Style { .. })) { + return Err(invalid("Text formatting does not reference a style")); + } + } + } + let mut tag_types = BTreeSet::new(); + for tag in &node.tags { + let action_type = if tag.status & 4 != 0 { + tag.action_type + } else { + match tag + .definition + .and_then(|id| nodes.get(&id)) + .map(|n| &n.kind) + { + Some(Kind::TagDefinition { action_type, .. }) => *action_type, + _ => { + return Err(invalid( + "Note tag does not reference a tag definition", + )); + } + } + } + .ok_or_else(|| invalid("Note tag has no action type"))?; + if !tag_types.insert(action_type) { + return Err(invalid("Repeated note tag action type")); + } + } + } + space.revisions.insert( + rid, + Revision { + roots: revision.roots, + nodes, + }, + ); + } + for space in spaces.values() { + for node in space.revisions.values().flat_map(|r| r.nodes.values()) { + let (context, history) = match &node.kind { + Kind::Manifest { + history: Some(context), + } => (*context, true), + Kind::VersionProxy { context, .. } => (*context, false), + _ => continue, + }; + let rid = space.contexts[&context]; + let revision = &space.revisions[&rid]; + let root = revision.roots.get(&1).and_then(|id| revision.nodes.get(id)); + if history { + if !matches!(root.map(|n| &n.kind), Some(Kind::VersionHistory)) { + return Err(invalid( + "History context does not resolve to version history", + )); + } + } else if !matches!(root.map(|n| &n.kind), Some(Kind::Manifest { .. })) + || space.contexts.get(&ExGuid::default()) == Some(&rid) + { + return Err(invalid( + "Version context does not resolve to a historical page", + )); + } + } + } + Ok(Self { + file_id: index.store.header.file_id, + root: index.root, + spaces, + }) + } +} + +impl<'a> Element<'a> { + fn parse(object: &Object<'a>, store: &Store<'a>) -> Result { + let empty = |kind| Self { + jcid: object.jcid, + children: vec![], + content: vec![], + structure: vec![], + spaces: vec![], + child_level: None, + layout: Layout::default(), + format: Format::default(), + created: None, + modified: None, + original_author: None, + latest_author: None, + media_ids: vec![], + media_time_ms: None, + tags: vec![], + kind, + extra: vec![], + }; + if let ObjectData::Encrypted(ciphertext) = object.data { + return Ok(empty(Kind::Encrypted { ciphertext })); + } + if let ObjectData::File { extension, .. } = object.data { + let reference = object + .file_reference()? + .ok_or_else(|| invalid("File object has no reference"))?; + let payload = if let FileDataReference::Internal(guid) = &reference { + Some(store.file_data(*guid)?) + } else { + None + }; + return Ok(empty(Kind::File { + reference, + extension: unicode(extension)?, + payload, + })); + } + let mut f = Fields::new(object)?; + let children = f.refs(0x24001c20, IdStream::Objects)?; + let content = f.refs(0x24001c1f, IdStream::Objects)?; + let structure = f.refs(0x24001d5f, IdStream::Objects)?; + let spaces = f.refs(0x2c001d63, IdStream::ObjectSpaces)?; + let child_level = f.u8(0x0c001c03)?; + if child_level.is_some_and(|level| !(1..=31).contains(&level)) { + return Err(invalid("Child indentation level is out of range")); + } + let layout = Layout { + x: f.float(0x14001c14, 36.0)?, + y: f.float(0x14001c15, 36.0)?, + max_width: f.float(0x14001c1b, 36.0)?, + max_height: f.float(0x14001c1c, 36.0)?, + }; + let format = Format { + bold: f.boolean(0x08001c04)?, + italic: f.boolean(0x08001c05)?, + underline: f.boolean(0x08001c06)?, + strike: f.boolean(0x08001c07)?, + superscript: f.boolean(0x08001c08)?, + subscript: f.boolean(0x08001c09)?, + hidden: f.boolean(0x08001e16)?, + hyperlink: f.boolean(0x08001e14)?, + hyperlink_label: f.boolean(0x08001e19)?, + math: f.boolean(0x08003401)?, + embedded_object: f.boolean(0x08001e22)?, + font: f.text(0x1c001c0a)?, + font_size: f.u16(0x10001c0b)?.map(|v| f32::from(v) / 2.0), + color: f.u32(0x14001c0c)?, + highlight: f.u32(0x14001c0d)?, + language: f.u32(0x14001c3b)?, + alignment: f.u8(0x0c003477)?, + rtl: f.boolean(0x08003476)?, + space_before: f.float(0x1400342e, 36.0)?, + space_after: f.float(0x1400342f, 36.0)?, + line_spacing: f.float(0x14003430, 36.0)?, + }; + let mut tags = Vec::new(); + if let Some(property) = f.take(0x40003489) { + let Value::Sets(range) = property.value else { + return Err(invalid("Note tags require property sets")); + }; + if range.len() > 9 { + return Err(invalid("An element has more than nine note tags")); + } + for extra_set in range { + let mut tag = Fields { + sets: vec![std::mem::take(&mut f.sets[extra_set])], + ids: f.ids, + }; + tags.push(Tag { + definition: tag.one(0x20003488)?, + action_type: tag.u16(0x10003463)?, + status: tag + .u16(0x10003470)? + .ok_or_else(|| invalid("Note tag has no status"))?, + created: tag.u32(0x1400346e)?, + completed: tag.u32(0x1400346f)?, + start: tag.u32(0x1400346a)?, + due: tag.u32(0x1400346b)?, + task_id: tag.fixed(0x1c003469)?, + extra_set, + }); + f.sets[extra_set] = tag.sets.remove(0); + } + } + let kind = match object.jcid { + 0x60007 => { + let templates = f.refs(0x2c001d62, IdStream::ObjectSpaces)?; + if templates.len() > 1 { + return Err(invalid("Section has multiple default page templates")); + } + Kind::Section { + default_template: templates.first().copied(), + } + } + 0x60008 => Kind::PageSeries, + 0x60037 => { + let contexts = f.refs(0x3400347b, IdStream::Contexts)?; + if contexts.len() > 1 { + return Err(invalid("Page manifest has multiple history contexts")); + } + Kind::Manifest { + history: contexts.first().copied(), + } + } + 0x6003c => Kind::VersionHistory, + 0x6003d => { + let contexts = f.refs(0x3400347b, IdStream::Contexts)?; + let [context] = contexts.as_slice() else { + return Err(invalid("Version proxy requires one context")); + }; + Kind::VersionProxy { + context: *context, + modified_filetime: f.fixed(0x18001d77)?.map(u64::from_le_bytes), + } + } + 0x20046 => Kind::VersionHistoryMetadata, + 0x2003e => Kind::TemplateMetadata { + name: f.text(0x1c001ca5)?, + }, + 0x6000b => Kind::Page { + alternate_title: f.text(0x1c001d3c)?, + level: f.u32(0x14001dff)?, + width: f.float(0x14001c01, 36.0)?, + height: f.float(0x14001c02, 36.0)?, + margin_origin_x: f.float(0x14001d0f, 36.0)?, + margin_origin_y: f.float(0x14001d10, 36.0)?, + rtl: f.boolean(0x08001c92)?, + }, + 0x20030 => Kind::Metadata { + title: f.text(0x1c001cf3)?, + level: f.u32(0x14001dff)?, + }, + 0x20038 => Kind::ConflictMetadata { + title: f.text(0x1c001cf3)?, + level: f.u32(0x14001dff)?, + author: f.text(0x1c001d9e)?, + }, + 0x60014 => Kind::Ink, + 0x20031 => Kind::SectionMetadata { + name: f.text(0x1c00349b)?, + color: f.u32(0x14001cbe)?, + }, + 0x20044 => Kind::RevisionMetadata { + modified_filetime: f.fixed(0x18001d77)?.map(u64::from_le_bytes), + }, + 0x6002c => Kind::Title, + 0x6000c => Kind::Outline { + indents: measurements(f.bytes(0x1c001c12)?, 4)?, + }, + 0x6000d => Kind::Paragraph { + lists: f.refs(0x24001c26, IdStream::Objects)?, + paragraph_style: f.one(0x2000342c)?, + collapse_state: f.u8(0x0c001c11)?, + }, + 0x60019 => Kind::OutlineGroup, + 0x6000e => { + let utf16 = f.bytes(0x1c001c22)?; + let ascii = f.bytes(0x1c003498)?; + let text = match utf16 { + Some(b) => unicode(b)?, + None => ascii + .unwrap_or_default() + .iter() + .map(|b| char::from(*b)) + .collect(), + }; + let length = u32::try_from(text.encode_utf16().count()) + .map_err(|_| invalid("Text exceeds UTF-16 offset range"))?; + let mut bounds = vec![0]; + if let Some(bytes) = f.bytes(0x1c001e12)? { + if !bytes.len().is_multiple_of(4) { + return Err(invalid("Text-run index has an invalid length")); + } + bounds.extend( + bytes + .chunks_exact(4) + .map(|b| u32::from_le_bytes(b.try_into().unwrap())), + ); + } + bounds.push(length); + if bounds.windows(2).any(|b| b[0] > b[1]) { + return Err(invalid("Text-run indices exceed text or are out of order")); + } + let mut boundaries = bounds.iter().copied().peekable(); + let mut position = 0; + for character in text.chars() { + while boundaries.peek() == Some(&position) { + boundaries.next(); + } + position += character.len_utf16() as u32; + if boundaries.peek().is_some_and(|next| *next < position) { + return Err(invalid("Text-run boundary splits a surrogate pair")); + } + } + let formats = f.refs(0x24001e13, IdStream::Objects)?; + if !formats.is_empty() && formats.len() != bounds.len() - 1 { + return Err(invalid("Text-run indices and formats disagree")); + } + let data = f + .take(0x40003499) + .map(|property| { + let Value::Sets(range) = property.value else { + return Err(invalid("Text-run data requires property sets")); + }; + if range.len() != bounds.len() - 1 { + return Err(invalid("Text-run indices and data disagree")); + } + Ok(range) + }) + .transpose()?; + let runs = bounds + .windows(2) + .enumerate() + .map(|(i, b)| TextRun { + start: b[0], + end: b[1], + format: formats.get(i).copied(), + extra_set: data.as_ref().map(|range| range.start + i), + }) + .collect(); + let boilerplate = f.boolean(0x08001c87)?.unwrap_or(false) + | f.boolean(0x08001c88)?.unwrap_or(false) + | f.boolean(0x08001cb5)?.unwrap_or(false); + Kind::RichText { + text, + runs, + paragraph_style: f.one(0x2000342c)?, + boilerplate, + } + } + 0x12004d => Kind::Style { + name: f.text(0x1c00345a)?, + }, + 0x60012 => { + let format = f + .bytes(0x1c001c1a)? + .map(|bytes| { + if bytes.len() < 2 + || bytes.len() + != 2 + usize::from(u16::from_le_bytes( + bytes[..2].try_into().unwrap(), + )) * 2 + { + return Err(invalid("List format has an invalid length")); + } + let units = bytes[2..] + .chunks_exact(2) + .map(|b| u16::from_le_bytes(b.try_into().unwrap())) + .collect::>(); + String::from_utf16(&units) + .map_err(|_| invalid("Invalid UTF-16 list format")) + }) + .transpose()?; + Kind::List { + font: f.text(0x1c001c52)?, + format, + restart: f.u32(0x14001cb7)?, + bullet: f.u16(0x10001d0e)?, + } + } + 0x60022 => { + let columns = f.u32(0x14001d58)?; + let widths = measurements(f.bytes(0x1c001d66)?, 1)?; + let mut locked = Vec::new(); + if let Some(bytes) = f.bytes(0x1c001d7d)? { + let count = usize::from( + *bytes + .first() + .ok_or_else(|| invalid("Empty table column locks"))?, + ); + if bytes.len() != 1 + count.div_ceil(8) || columns != Some(count as u32) { + return Err(invalid("Table column locks disagree with column count")); + } + locked.extend((0..count).map(|i| bytes[1 + i / 8] & (1 << (i % 8)) != 0)); + } + if !widths.is_empty() && columns != Some(widths.len() as u32) { + return Err(invalid("Table widths disagree with column count")); + } + Kind::Table { + rows: f.u32(0x14001d57)?, + columns, + widths, + locked, + borders: f.boolean(0x08001d5e)?, + } + } + 0x60023 => Kind::Row, + 0x60024 => Kind::Cell { + shading: f.u32(0x14001e26)?, + }, + 0x60011 => Kind::Image { + container: f.one(0x20001c3f)?, + filename: f.text(0x1c001dd7)?, + alt: f.text(0x1c001e58)?, + picture_width: f.float(0x140034cd, 36.0)?, + picture_height: f.float(0x140034ce, 36.0)?, + background: f.boolean(0x08001d13)?, + printout: f.boolean(0x08001d85)?, + link: f.text(0x1c001e20)?, + }, + 0x60035 => Kind::Attachment { + container: f.one(0x20001d9b)?, + preview: f.one(0x20001c3f)?, + filename: f.text(0x1c001d9c)?, + source_path: f.text(0x1c001d9d)?, + recording_id: f.fixed(0x1c001c97)?, + recording_type: f.u32(0x14001d24)?, + }, + 0x120001 => Kind::Author { + name: f.text(0x1c001d75)?, + }, + 0x120043 => Kind::TagDefinition { + label: f.text(0x1c003468)?, + action_type: f.u16(0x10003463)?, + shape: f.u16(0x10003464)?, + color: f.u32(0x14003466)?, + highlight: f.u32(0x14003465)?, + }, + 0x20001 if store.header.file_type == crate::FileType::TableOfContents => Kind::Toc { + entries: f.refs(0x24001cf6, IdStream::Objects)?, + filename: f.text(0x1c001d6b)?, + identity: f.fixed(0x1c001d94)?, + order: f.u32(0x14001cb9)?, + color: f.u32(0x14001cbe)?, + }, + _ => Kind::Unknown, + }; + let media_ids = f.bytes(0x1c001c98)?.unwrap_or_default(); + if !media_ids.len().is_multiple_of(16) { + return Err(invalid("Media identifiers have an invalid length")); + } + let media_ids = media_ids + .chunks_exact(16) + .map(|id| id.try_into().unwrap()) + .collect(); + Ok(Self { + jcid: object.jcid, + children, + content, + structure, + spaces, + child_level, + layout, + format, + created: f.u32(0x14001d09)?, + modified: f.u32(0x14001d7a)?, + original_author: f.one(0x20001d78)?, + latest_author: f.one(0x20001d79)?, + media_ids, + media_time_ms: f.u32(0x14001c99)?, + tags, + kind, + extra: f.remainder()?, + }) + } +} diff --git a/crates/onestore/src/edit.rs b/crates/onestore/src/edit.rs new file mode 100644 index 0000000000000000000000000000000000000000..bd4f1b958f1694e1484ddc2ef29eb260becbbac6 --- /dev/null +++ b/crates/onestore/src/edit.rs @@ -0,0 +1,373 @@ +use crate::document::{Document, Kind}; +use crate::{Error, ExGuid, ObjectData, PropertySets, RevisionIndex, Store}; +use std::ops::Range; + +fn title_line(text: &str) -> &str { + text.trim_start().split('\r').next().unwrap() +} + +pub(crate) fn automatic_title(text: &str) -> &str { + let line = title_line(text).trim_end(); + let mut units = 0; + for (byte, character) in line.char_indices() { + if units >= 255 { + return line[..byte].trim_end(); + } + units += character.len_utf16(); + } + line +} + +/// Replaces UTF-16 character positions within one ordinary text run. +/// The inserted text inherits that run's formatting; other runs retain their identities. +/// Insertion at a run boundary uses the following run, except at the end of text. +/// Returns a complete file image without I/O; use `commit_file_text` to update an existing file. +pub fn replace_text( + source: &[u8], + space: ExGuid, + object: ExGuid, + range: Range, + replacement: &str, +) -> Result, Error> { + let invalid = |message| Error { offset: 0, message }; + if range.start > range.end || replacement.contains(['\0', '\n', '\r', '\u{fffc}', '\u{fddf}']) { + return Err(invalid( + "Use a valid text range and ordinary paragraph text", + )); + } + let store = Store::parse(source)?; + let index = RevisionIndex::parse(&store)?; + index.validate_current()?; + let rid = *index + .spaces + .get(&space) + .and_then(|s| s.labels.get(&(ExGuid::default(), 1))) + .ok_or_else(|| invalid("Object space has no active default revision"))?; + let raw = index.resolve(space, rid)?; + if !raw.reachable()?.contains(&object) { + return Err(invalid("Object is not reachable in the active revision")); + } + let document = Document::parse(&index)?; + let revision = document + .spaces + .get(&space) + .and_then(|s| s.revisions.get(&rid)) + .ok_or_else(|| invalid("The active document revision is unavailable"))?; + let pages: Vec<_> = document + .pages()? + .into_iter() + .filter_map(|(sid, page)| (sid == space).then_some(page)) + .collect(); + let mut pending: Vec<_> = pages.iter().map(|page| (*page, false)).collect(); + let mut seen = std::collections::BTreeSet::new(); + let mut parents = std::collections::BTreeMap::<_, Vec<_>>::new(); + let mut editable = false; + while let Some((id, read_only)) = pending.pop() { + if !seen.insert((id, read_only)) { + continue; + } + let element = revision + .nodes + .get(&id) + .ok_or_else(|| invalid("Page content is unavailable"))?; + let read_only = read_only || element.extra[0].iter().any(|field| field.id == 0x88001cde); + if id == object { + if read_only { + return Err(invalid("This page or its content is read-only")); + } + editable = true; + } + for child in element + .children + .iter() + .chain(&element.content) + .chain(&element.structure) + { + parents.entry(*child).or_default().push(id); + pending.push((*child, read_only)); + } + } + if !editable { + return Err(invalid("Select text on an active editable page")); + } + let node = revision + .nodes + .get(&object) + .ok_or_else(|| invalid("The text object is unavailable"))?; + let Kind::RichText { + text, + runs, + boilerplate, + .. + } = &node.kind + else { + return Err(invalid("Select a rich-text object")); + }; + if *boilerplate { + return Err(invalid( + "Generated title fields cannot be edited as ordinary text", + )); + } + let selected = runs + .iter() + .rposition(|run| run.start <= range.start && range.end <= run.end) + .ok_or_else(|| invalid("The edit must stay within one text run"))?; + let resolved = revision.text_runs(object)?; + let format = &resolved[selected].format; + if [ + format.hidden, + format.hyperlink, + format.math, + format.embedded_object, + ] + .contains(&Some(true)) + || runs[selected] + .extra_set + .is_some_and(|set| !node.extra[set].is_empty()) + { + return Err(invalid("This text run contains a field or embedded data")); + } + let ObjectData::Properties(blob) = raw.objects[&object].data else { + unreachable!() + }; + let properties = PropertySets::parse(blob)?; + if properties.sets[0] + .iter() + .any(|p| p.id == 0x88001cde || p.id == 0x24003458) + { + return Err(invalid( + "This text object is read-only or contains associated run data", + )); + } + let mut units = 0; + let mut start = None; + let mut end = None; + for (byte, character) in text.char_indices() { + if units == range.start { + start = Some(byte); + } + if units == range.end { + end = Some(byte); + } + units += character.len_utf16() as u32; + } + if units == range.start { + start = Some(text.len()); + } + if units == range.end { + end = Some(text.len()); + } + let (Some(start), Some(end)) = (start, end) else { + return Err(invalid( + "The edit range splits a surrogate pair or exceeds the text", + )); + }; + if &text[start..end] == replacement { + return Ok(source.to_vec()); + } + let added = u32::try_from(replacement.encode_utf16().count()) + .map_err(|_| invalid("Replacement text exceeds the UTF-16 offset range"))?; + let removed = range.end - range.start; + units + .checked_sub(removed) + .and_then(|n| n.checked_add(added)) + .ok_or_else(|| invalid("Edited text exceeds the UTF-16 offset range"))?; + let mut boundaries = Vec::new(); + let mut previous = None; + for (i, run) in runs[..runs.len() - 1].iter().enumerate() { + let end = if i >= selected { + run.end - removed + added + } else { + run.end + }; + if previous.is_some_and(|p| p >= end) { + return Err(invalid("The edit would collapse a formatting boundary")); + } + previous = Some(end); + boundaries.extend_from_slice(&end.to_le_bytes()); + } + let mut changed = String::with_capacity(text.len() - (end - start) + replacement.len()); + changed.push_str(&text[..start]); + changed.push_str(replacement); + changed.push_str(&text[end..]); + let unicode = properties.sets[0].iter().any(|p| p.id == 0x1c001c22) + || !properties.sets[0].iter().any(|p| p.id == 0x1c003498) + || changed.chars().any(|c| c as u32 > 255); + let encoded = if unicode { + changed + .encode_utf16() + .chain([0]) + .flat_map(u16::to_le_bytes) + .collect::>() + } else { + changed.chars().map(|c| u8::try_from(c).unwrap()).collect() + }; + let text_property = if unicode { 0x1c001c22 } else { 0x1c003498 }; + let text_update = (text_property, encoded.as_slice()); + let mut updates = Vec::new(); + let insert = if properties.sets[0].iter().any(|p| p.id == text_property) { + updates.push(text_update); + None + } else { + Some(text_update) + }; + if properties.sets[0].iter().any(|p| p.id == 0x1c001e12) { + updates.push((0x1c001e12, &boundaries)); + } + let modified = crate::create::current_timestamps()?.0.to_le_bytes(); + updates.push((0x14001d7a, &modified)); + let mut edits = vec![crate::write::ObjectEdit { + object, + updates: &updates, + insert, + }]; + // Native conflict merges can discard descendant edits when ancestor timestamps stay stale. + let modified_update = [(0x14001d7a, modified.as_slice())]; + let mut ancestors = std::collections::BTreeSet::new(); + let mut pending = parents.get(&object).cloned().unwrap_or_default(); + while let Some(id) = pending.pop() { + if !ancestors.insert(id) { + continue; + } + if revision.nodes[&id].modified.is_some() { + edits.push(crate::write::ObjectEdit { + object: id, + updates: &modified_update, + insert: None, + }); + } + pending.extend(parents.get(&id).into_iter().flatten().copied()); + } + let titles: Vec<_> = revision + .nodes + .iter() + .filter_map(|(id, node)| { + if !(seen.contains(&(*id, false)) || seen.contains(&(*id, true))) + || !node.extra[0].iter().any(|field| field.id == 0x88001cb4) + { + return None; + } + match &node.kind { + Kind::RichText { + text, + boilerplate: false, + .. + } => Some((*id, text.as_str())), + _ => None, + } + }) + .collect(); + let title_text = match titles.as_slice() { + [] => "", + [(id, text)] => { + if *id == object { + changed.as_str() + } else { + text + } + } + _ => return Err(invalid("Title editing requires a single title text object")), + }; + let automatic = title_line(title_text).is_empty(); + if !automatic && titles[0].0 != object { + return crate::write::replace_objects(source, space, &edits); + } + let [page] = pages.as_slice() else { + return Err(invalid("Title editing requires a single active page")); + }; + let Kind::Page { + alternate_title, + rtl, + .. + } = &revision.nodes[page].kind + else { + unreachable!() + }; + let mut title_text = title_line(title_text); + if automatic { + let mut roots = revision.nodes[page].children.clone(); + roots.sort_by(|a, b| { + let a = &revision.nodes[a].layout; + let b = &revision.nodes[b].layout; + a.y.unwrap_or(0.0) + .total_cmp(&b.y.unwrap_or(0.0)) + .then_with(|| { + if *rtl == Some(true) { + b.x.unwrap_or(0.0).total_cmp(&a.x.unwrap_or(0.0)) + } else { + a.x.unwrap_or(0.0).total_cmp(&b.x.unwrap_or(0.0)) + } + }) + }); + let mut pending: Vec<_> = roots.into_iter().rev().collect(); + let mut seen = std::collections::BTreeSet::new(); + while let Some(id) = pending.pop() { + if !seen.insert(id) { + continue; + } + let node = &revision.nodes[&id]; + if let Kind::RichText { + text, + boilerplate: false, + .. + } = &node.kind + { + title_text = automatic_title(if id == object { &changed } else { text }); + if !title_text.is_empty() { + break; + } + } + if *rtl == Some(true) && matches!(node.kind, Kind::Row) { + pending.extend(node.children.iter().copied()); + } else { + pending.extend(node.children.iter().rev().copied()); + } + pending.extend(node.content.iter().rev().copied()); + pending.extend(node.structure.iter().rev().copied()); + } + } + let metadata = revision + .roots + .get(&2) + .ok_or_else(|| invalid("Page title metadata is unavailable"))?; + let Kind::Metadata { title, .. } = &revision.nodes[metadata].kind else { + return Err(invalid("Page title metadata is unavailable")); + }; + let cached: Vec<_> = title_text + .encode_utf16() + .chain([0]) + .flat_map(u16::to_le_bytes) + .collect(); + let metadata_update = [(0x1c001cf3, cached.as_slice())]; + edits.push(crate::write::ObjectEdit { + object: *metadata, + updates: if title.is_some() { + &metadata_update + } else { + &[] + }, + insert: title.is_none().then_some(metadata_update[0]), + }); + let mut alternate_update = vec![( + 0x1c001d3c, + if automatic { + cached.as_slice() + } else { + &[0u8, 0][..] + }, + )]; + if revision.nodes[page].modified.is_some() { + alternate_update.push(modified_update[0]); + } + edits.retain(|edit| edit.object != *page); + edits.push(crate::write::ObjectEdit { + object: *page, + updates: if alternate_title.is_some() { + &alternate_update + } else { + &alternate_update[1..] + }, + insert: alternate_title.is_none().then_some(alternate_update[0]), + }); + crate::write::replace_objects(source, space, &edits) +} diff --git a/crates/onestore/src/files.rs b/crates/onestore/src/files.rs new file mode 100644 index 0000000000000000000000000000000000000000..038bd0ba92d772602a0d27b9c3980af372b39bb9 --- /dev/null +++ b/crates/onestore/src/files.rs @@ -0,0 +1,164 @@ +use crate::{Error, Object, ObjectData, Reference, Store, bytes::Cursor}; + +#[derive(Debug, PartialEq, Eq, serde::Serialize)] +pub enum FileDataReference { + Internal([u8; 16]), + External(String), + Invalid, +} + +fn guid(text: &str) -> Option<[u8; 16]> { + let bytes = text.as_bytes(); + if bytes.len() != 36 || [8, 13, 18, 23].iter().any(|index| bytes[*index] != b'-') { + return None; + } + let mut digits = bytes + .iter() + .enumerate() + .filter_map(|(index, byte)| (![8, 13, 18, 23].contains(&index)).then_some(*byte)); + let mut value = [0; 16]; + for byte in &mut value { + let high = char::from(digits.next()?).to_digit(16)?; + let low = char::from(digits.next()?).to_digit(16)?; + *byte = u8::try_from((high << 4) | low).ok()?; + } + value[..4].reverse(); + value[4..6].reverse(); + value[6..8].reverse(); + Some(value) +} + +impl Object<'_> { + pub fn file_reference(&self) -> Result, Error> { + let ObjectData::File { reference, .. } = self.data else { + return Ok(None); + }; + if !reference.len().is_multiple_of(2) { + return Err(Error { + offset: 0, + message: "Odd UTF-16 file-data reference length", + }); + } + let text = String::from_utf16( + &reference + .chunks_exact(2) + .map(|pair| u16::from_le_bytes([pair[0], pair[1]])) + .collect::>(), + ) + .map_err(|_| Error { + offset: 0, + message: "Invalid UTF-16 file-data reference", + })?; + let parsed = if let Some(name) = text.strip_prefix("") { + name.strip_suffix(".onebin") + .and_then(guid) + .map(|_| FileDataReference::External(name.to_owned())) + } else if let Some(id) = text + .strip_prefix("{") + .and_then(|text| text.strip_suffix('}')) + { + guid(id).map(FileDataReference::Internal) + } else if text == "" { + Some(FileDataReference::Invalid) + } else { + None + }; + parsed.map(Some).ok_or(Error { + offset: 0, + message: "Invalid file-data reference syntax", + }) + } +} + +impl<'a> Store<'a> { + pub(crate) fn encryption_key(&self, chunk: crate::Chunk) -> Result<&'a [u8], Error> { + let bytes = self.chunk_data(chunk)?; + let footer = 0x2649294f8e198b3c_u64.to_le_bytes(); + if bytes.len() >= 16 && bytes[..8] == 0xfb6ba385dad1a067_u64.to_le_bytes() { + for padding in 0..=7 { + if bytes.len() < 16 + padding { + break; + } + let end = bytes.len() - padding; + if bytes[end - 8..end] == footer + && bytes[end..].iter().all(|byte| *byte == 0) + && (padding == 0 || bytes.len().is_multiple_of(8)) + { + return Ok(&bytes[8..end - 8]); + } + } + } + Err(Error { + offset: usize::try_from(chunk.offset).unwrap(), + message: "Invalid encryption key container", + }) + } + + pub fn file_data(&self, guid: [u8; 16]) -> Result<&'a [u8], Error> { + let mut found = None; + for node in self + .lists + .values() + .flat_map(|list| &list.nodes) + .filter(|node| node.id == 0x94) + { + let mut c = node.fields(self); + if c.read::<16>()? != guid { + continue; + } + let Some(Reference::Data(chunk)) = node.reference else { + return Err(Error { + offset: node.offset, + message: "File-data object lacks a data reference", + }); + }; + if found.replace(chunk).is_some() { + return Err(Error { + offset: node.offset, + message: "Duplicate file-data identity", + }); + } + } + let chunk = found.ok_or(Error { + offset: 0, + message: "File-data object is not declared", + })?; + let mut c = Cursor { + bytes: self.chunk_data(chunk)?, + offset: usize::try_from(chunk.offset).unwrap(), + }; + if c.read::<16>()? + != [ + 0xe7, 0x16, 0xe3, 0xbd, 0x65, 0x26, 0x11, 0x45, 0xa4, 0xc4, 0x8d, 0x4d, 0x0b, 0x7a, + 0x9e, 0xac, + ] + { + return Err(Error { + offset: c.offset - 16, + message: "Invalid file-data object header", + }); + } + let length = usize::try_from(u64::from_le_bytes(c.read()?)).map_err(|_| Error { + offset: c.offset - 8, + message: "File-data length exceeds address space", + })?; + c.take(12)?; + let bytes = c.take(length)?; + // The object length is aligned; its position in the file need not be. + let padding = (8 - (36 + length) % 8) % 8; + c.take(padding)?; + if c.read::<16>()? + != [ + 0x22, 0xa7, 0xfb, 0x71, 0x79, 0x0f, 0x0b, 0x4a, 0xbb, 0x13, 0x89, 0x92, 0x56, 0x42, + 0x6b, 0x24, + ] + || !c.bytes.is_empty() + { + return Err(Error { + offset: c.offset - 16, + message: "Invalid file-data object footer or length", + }); + } + Ok(bytes) + } +} diff --git a/crates/onestore/src/flush.rs b/crates/onestore/src/flush.rs new file mode 100644 index 0000000000000000000000000000000000000000..d53676d6cd5a563385b0b552d9b7c6e487915fe8 --- /dev/null +++ b/crates/onestore/src/flush.rs @@ -0,0 +1,14 @@ +use std::{fs::File, io}; + +pub(crate) fn flush(file: &File) -> io::Result<()> { + let result = file.sync_all(); + #[cfg(target_os = "macos")] + if result + .as_ref() + .is_err_and(|error| error.raw_os_error() == Some(nix::libc::ENOTSUP)) + { + // SMB uses standard FLUSH when Apple's F_FULLFSYNC extension is unavailable. + return nix::unistd::fsync(file).map_err(io::Error::from); + } + result +} diff --git a/crates/onestore/src/lib.rs b/crates/onestore/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..e9e597d571e21db69832710b02844879ddac7ba5 --- /dev/null +++ b/crates/onestore/src/lib.rs @@ -0,0 +1,27 @@ +#![forbid(unsafe_code)] +#![doc = include_str!("../../../README.md")] + +mod bytes; +mod commit; +mod create; +pub mod document; +mod edit; +mod files; +mod flush; +mod objects; +mod properties; +mod revisions; +mod store; +mod write; + +pub use commit::{CommitError, CommitIo, CommitState, commit_property_bytes, commit_text}; +#[cfg(any(unix, windows))] +pub use commit::{commit_file_property, commit_file_text, read_file}; +pub use create::{create_section, create_table_of_contents}; +pub use edit::replace_text; +pub use files::FileDataReference; +pub use objects::{Object, ObjectData, ObjectReferences, ResolvedRevision}; +pub use properties::{IdStream, Property, PropertySets, Value}; +pub use revisions::{ExGuid, ObjectSpace, Revision, RevisionIndex}; +pub use store::{Chunk, Error, FileType, Header, Node, NodeList, Reference, Store}; +pub use write::replace_property_bytes; diff --git a/crates/onestore/src/objects.rs b/crates/onestore/src/objects.rs new file mode 100644 index 0000000000000000000000000000000000000000..b933520337b708ab344e12b9428acd49847504ae --- /dev/null +++ b/crates/onestore/src/objects.rs @@ -0,0 +1,625 @@ +use crate::{ + Error, ExGuid, IdStream, Node, PropertySets, Reference, RevisionIndex, Value, bytes::Cursor, +}; +use std::{ + collections::{BTreeMap, BTreeSet}, + sync::Arc, +}; + +type Result = std::result::Result; +type GlobalIds = BTreeMap; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ObjectData<'a> { + Properties(&'a [u8]), + Encrypted(&'a [u8]), + File { + reference: &'a [u8], + extension: &'a [u8], + }, +} + +#[derive(Debug)] +pub struct Object<'a> { + pub jcid: u32, + pub reference_count: u32, + pub data: ObjectData<'a>, + pub global_ids: Arc, +} + +#[derive(Debug)] +pub struct ResolvedRevision<'a> { + pub roots: BTreeMap, + pub objects: BTreeMap>, +} + +/// Occurrences retain multiplicity for native reference counts. +#[derive(Debug, Default)] +pub struct ObjectReferences { + pub objects: Vec, + pub object_spaces: Vec, + pub contexts: Vec, +} + +impl Object<'_> { + pub fn references(&self) -> Result { + let mut result = ObjectReferences::default(); + let bytes = match self.data { + ObjectData::File { .. } => return Ok(result), + ObjectData::Properties(bytes) => bytes, + ObjectData::Encrypted(_) => { + return Err(Error { + offset: 0, + message: "Encrypted property references are unavailable", + }); + } + }; + let properties = PropertySets::parse(bytes)?; + for property in properties.sets.iter().flatten() { + if let Value::References { + stream, + compact_ids, + } = property.value + { + let targets = match stream { + IdStream::Objects => &mut result.objects, + IdStream::ObjectSpaces => &mut result.object_spaces, + IdStream::Contexts => &mut result.contexts, + }; + let mut c = Cursor { + bytes: compact_ids, + offset: 0, + }; + while !c.bytes.is_empty() { + targets.push(c.compact(&self.global_ids)?); + } + } + } + Ok(result) + } +} + +impl ResolvedRevision<'_> { + pub fn reachable(&self) -> Result> { + let mut pending: Vec<_> = self.roots.values().copied().collect(); + let mut incoming = BTreeMap::::new(); + for id in &pending { + if incoming.insert(*id, 1).is_some() { + return Err(Error { + offset: 0, + message: "Object is the root of multiple roles", + }); + } + } + let mut edges = BTreeMap::new(); + while let Some(id) = pending.pop() { + if edges.contains_key(&id) { + continue; + } + let object = self.objects.get(&id).ok_or(Error { + offset: 0, + message: "Reachable object has no declaration", + })?; + let references = object.references()?; + for child in &references.objects { + let count = incoming.entry(*child).or_default(); + *count = count.checked_add(1).ok_or(Error { + offset: 0, + message: "Object reference count overflows", + })?; + pending.push(*child); + } + edges.insert(id, references.objects); + } + let mut remaining = incoming.clone(); + for id in self.roots.values() { + *remaining.get_mut(id).unwrap() -= 1; + } + pending.extend( + remaining + .iter() + .filter_map(|(id, count)| (*count == 0).then_some(*id)), + ); + let mut visited = 0; + while let Some(id) = pending.pop() { + visited += 1; + for child in &edges[&id] { + let count = remaining.get_mut(child).unwrap(); + *count -= 1; + if *count == 0 { + pending.push(*child); + } + } + } + if visited != edges.len() { + return Err(Error { + offset: 0, + message: "Object references form a cycle", + }); + } + for (id, count) in &incoming { + if self.objects[id].reference_count != *count { + return Err(Error { + offset: 0, + message: "Stored object reference count disagrees with the reachable graph", + }); + } + } + Ok(edges.into_keys().collect()) + } +} + +impl Cursor<'_> { + pub(crate) fn compact(&mut self, table: &GlobalIds) -> Result { + let raw = u32::from_le_bytes(self.read()?); + let guid = *table.get(&(raw >> 8)).ok_or(Error { + offset: self.offset - 4, + message: "Compact ID refers to a missing global ID", + })?; + Ok(ExGuid { + guid, + n: raw & 0xff, + }) + } +} + +impl<'a> Cursor<'a> { + fn storage_string(&mut self) -> Result<&'a [u8]> { + let count = u32::from_le_bytes(self.read()?); + let size = usize::try_from(count) + .ok() + .and_then(|n| n.checked_mul(2)) + .ok_or(Error { + offset: self.offset - 4, + message: "String length exceeds address space", + })?; + self.take(size) + } +} + +impl<'a> RevisionIndex<'a> { + pub fn validate_current(&self) -> Result<()> { + let mut edges = BTreeMap::new(); + let mut incoming = BTreeMap::<_, usize>::new(); + for (osid, space) in &self.spaces { + for rid in space.labels.values().copied().collect::>() { + let revision = self.resolve(*osid, rid)?; + let mut targets = BTreeSet::new(); + for oid in revision.reachable()? { + let references = revision.objects[&oid].references()?; + for target in references.object_spaces { + if target == *osid { + return Err(Error { + offset: 0, + message: "Object references its own object space", + }); + } + let rid = self + .spaces + .get(&target) + .and_then(|space| space.labels.get(&(ExGuid::default(), 1))) + .ok_or(Error { + offset: 0, + message: "Object-space reference has no default revision", + })?; + targets.insert((target, *rid)); + } + for context in references.contexts { + if !space.labels.contains_key(&(context, 1)) { + return Err(Error { + offset: 0, + message: "Context reference has no current revision", + }); + } + } + } + for target in &targets { + *incoming.entry(*target).or_default() += 1; + } + incoming.entry((*osid, rid)).or_default(); + edges.insert((*osid, rid), targets); + } + } + let mut pending: Vec<_> = incoming + .iter() + .filter_map(|(id, count)| (*count == 0).then_some(*id)) + .collect(); + let mut visited = 0; + while let Some(id) = pending.pop() { + visited += 1; + for target in &edges[&id] { + let count = incoming.get_mut(target).unwrap(); + *count -= 1; + if *count == 0 { + pending.push(*target); + } + } + } + if visited != edges.len() { + return Err(Error { + offset: 0, + message: "Object-space references form a cycle", + }); + } + Ok(()) + } + + pub fn resolve(&self, space: ExGuid, revision: ExGuid) -> Result> { + let space = self.spaces.get(&space).ok_or(Error { + offset: 0, + message: "Unknown object space", + })?; + let mut chain = Vec::new(); + let mut visited = BTreeSet::new(); + let mut next = Some(revision); + while let Some(id) = next { + let revision = space.revisions.get(&id).ok_or(Error { + offset: 0, + message: "Unknown revision dependency", + })?; + if !visited.insert(id) { + return Err(Error { + offset: 0, + message: "Revision dependency cycle", + }); + } + chain.push(revision); + next = revision.dependency; + } + let mut result = ResolvedRevision { + roots: BTreeMap::new(), + objects: BTreeMap::new(), + }; + let mut table = Arc::new(GlobalIds::new()); + let mut signed_data = BTreeMap::new(); + for revision in chain.into_iter().rev() { + let dependency_table = table; + table = Arc::new(GlobalIds::new()); + let mut pending: Vec<&Node<'a>> = revision.nodes.iter().rev().collect(); + let mut groups = BTreeSet::new(); + let mut defining_table = false; + let initial_crc = if self.store.header.file_type == crate::FileType::Section { + u32::MAX + } else { + 0 + }; + let mut override_crc = initial_crc; + let mut in_group = false; + let mut signature = ExGuid::default(); + while let Some(node) = pending.pop() { + let mut c = node.fields(self.store); + match node.id { + 0xb0 => { + override_crc = initial_crc; + in_group = true; + let id = c.exguid()?; + if !groups.insert(id) { + return Err(Error { + offset: node.offset, + message: "Repeated object group", + }); + } + let group = node.referenced_list(self.store)?; + let first = group.first().ok_or(Error { + offset: node.offset, + message: "Empty object group", + })?; + if first.id != 0xb4 + || first.fields(self.store).exguid()? != id + || group.last().is_none_or(|node| node.id != 0xb8) + { + return Err(Error { + offset: node.offset, + message: "Object-group identity or boundaries do not match", + }); + } + if group[1..group.len() - 1].iter().any(|node| { + !matches!( + node.id, + 0x22 | 0x24 | 0x28 | 0x8c | 0xa4 | 0xa5 | 0xc4 | 0xc5 | 0x72 | 0x73 + ) + }) { + return Err(Error { + offset: node.offset, + message: "Unexpected node in an object group", + }); + } + pending.extend(group[1..].iter().rev()); + } + 0x21 | 0x22 => { + if defining_table { + return Err(Error { + offset: node.offset, + message: "Unterminated global identification table", + }); + } + table = Arc::new(GlobalIds::new()); + defining_table = true; + } + 0x24..=0x26 => { + if !defining_table { + return Err(Error { + offset: node.offset, + message: "Global ID entry outside a table", + }); + } + let first = u32::from_le_bytes(c.read()?); + let entries: Vec<_> = match node.id { + 0x24 => vec![(first, c.read()?)], + 0x25 | 0x26 => { + let count = if node.id == 0x26 { + u32::from_le_bytes(c.read()?) + } else { + 1 + }; + let to = u32::from_le_bytes(c.read()?); + let end = first.checked_add(count).ok_or(Error { + offset: node.offset, + message: "Global ID import range overflows", + })?; + if u64::from(count) > dependency_table.len() as u64 + || to.checked_add(count).is_none_or(|end| end > 0xffffff) + { + return Err(Error { + offset: node.offset, + message: "Global ID import range exceeds its table", + }); + } + let entries: Vec<_> = dependency_table + .range(first..end) + .map(|(from, guid)| (to + from - first, *guid)) + .collect(); + if entries.len() as u64 != u64::from(count) { + return Err(Error { + offset: node.offset, + message: "Global ID import refers to a missing entry", + }); + } + entries + } + _ => unreachable!(), + }; + for (index, guid) in entries { + if index >= 0xffffff + || guid == [0; 16] + || Arc::make_mut(&mut table).insert(index, guid).is_some() + { + return Err(Error { + offset: node.offset, + message: "Invalid or repeated global ID entry", + }); + } + } + } + 0x28 => { + if !defining_table { + return Err(Error { + offset: node.offset, + message: "Global ID table end without a start", + }); + } + defining_table = false; + let unique: BTreeSet<_> = table.values().collect(); + if unique.len() != table.len() { + return Err(Error { + offset: node.offset, + message: "Global ID table repeats a GUID", + }); + } + } + 0x59 | 0x5a => { + let id = if node.id == 0x5a { + c.exguid()? + } else { + c.compact(&table)? + }; + let role = u32::from_le_bytes(c.read()?); + result.roots.insert(role, id); + } + 0x2d | 0x2e | 0x41 | 0x42 | 0xa4 | 0xa5 | 0xc4 | 0xc5 | 0x72 | 0x73 => { + if defining_table { + return Err(Error { + offset: node.offset, + message: "Object declared inside a global ID table", + }); + } + let id = c.compact(&table)?; + let jcid = match node.id { + 0x2d | 0x2e => { + let bits = u16::from_le_bytes(c.read()?); + c.take(4)?; + if bits & 0x3fff != 1 { + return Err(Error { + offset: node.offset, + message: "Invalid table-of-contents object type", + }); + } + 0x20001 + } + 0x41 | 0x42 => { + result + .objects + .get(&id) + .ok_or(Error { + offset: node.offset, + message: "Object revision has no previous declaration", + })? + .jcid + } + _ => u32::from_le_bytes(c.read()?), + }; + let reference_count = match node.id { + 0x41 => u32::from(c.read::<1>()?[0] >> 2), + 0x42 => { + c.take(4)?; + u32::from_le_bytes(c.read()?) + } + 0x2d | 0x72 => u32::from(c.read::<1>()?[0]), + 0x2e | 0x73 => u32::from_le_bytes(c.read()?), + 0xa4 | 0xc4 => { + c.take(1)?; + u32::from(c.read::<1>()?[0]) + } + _ => { + c.take(1)?; + u32::from_le_bytes(c.read()?) + } + }; + if in_group + || self.store.header.file_type == crate::FileType::TableOfContents + { + override_crc = crate::store::crc( + override_crc, + &reference_count.to_le_bytes(), + self.store.header.file_type, + ); + } + let data = if matches!(node.id, 0x72 | 0x73) { + if jcid & 0x1fffff != 0x80000 | (jcid & 0xffff) { + return Err(Error { + offset: node.offset, + message: "Invalid file-data object flags", + }); + } + ObjectData::File { + reference: c.storage_string()?, + extension: c.storage_string()?, + } + } else { + let Some(Reference::Data(chunk)) = node.reference else { + return Err(Error { + offset: node.offset, + message: "Object lacks a data reference", + }); + }; + let bytes = self.store.chunk_data(chunk)?; + if jcid & 0x20000 == 0 + || (jcid & 0x100000 != 0) != matches!(node.id, 0xc4 | 0xc5) + { + return Err(Error { + offset: node.offset, + message: "Object declaration does not match its property-set flags", + }); + } + if matches!(node.id, 0xc4 | 0xc5) { + let expected = c.read::<16>()?; + if !revision.encrypted && md5::compute(bytes).0 != expected { + return Err(Error { + offset: node.offset, + message: "Read-only object checksum mismatch", + }); + } + } + if revision.encrypted { + ObjectData::Encrypted(bytes) + } else { + ObjectData::Properties(bytes) + } + }; + if let Some(previous) = result.objects.get(&id) { + if previous.jcid & 0x1bffff != jcid & 0x1bffff { + return Err(Error { + offset: node.offset, + message: "Object revision changes its type", + }); + } + if jcid & 0x180000 != 0 && previous.data != data { + return Err(Error { + offset: node.offset, + message: "Immutable object data changed", + }); + } + } + if signature != ExGuid::default() + && signed_data + .insert((id, signature), data) + .is_some_and(|previous| previous != data) + { + return Err(Error { + offset: node.offset, + message: "Object data changed under the same data signature", + }); + } + result.objects.insert( + id, + Object { + jcid, + reference_count, + data, + global_ids: Arc::clone(&table), + }, + ); + } + 0x84 => { + let Some(Reference::Data(chunk)) = node.reference else { + return Err(Error { + offset: node.offset, + message: "Reference-count override lacks its data reference", + }); + }; + if !chunk.absent() { + c = Cursor { + bytes: self.store.chunk_data(chunk)?, + offset: usize::try_from(chunk.offset).unwrap(), + }; + } + let small = u32::from_le_bytes(c.read()?); + let large = u32::from_le_bytes(c.read()?); + let expected = u32::from_le_bytes(c.read()?); + let start = c.bytes; + for (count, width) in [(small, 1), (large, 4)] { + for _ in 0..count { + let id = c.compact(&table)?; + let value = if width == 1 { + u32::from(c.read::<1>()?[0]) + } else { + u32::from_le_bytes(c.read()?) + }; + let object = result.objects.get_mut(&id).ok_or(Error { offset: node.offset, message: "Reference-count override targets an undeclared object" })?; + object.reference_count = value; + } + } + override_crc = crate::store::crc( + override_crc, + &start[..start.len() - c.bytes.len()], + self.store.header.file_type, + ); + let actual = if self.store.header.file_type == crate::FileType::Section { + !override_crc + } else { + override_crc + }; + if expected != actual { + return Err(Error { + offset: node.offset, + message: "Reference-count override checksum mismatch", + }); + } + override_crc = initial_crc; + } + 0x7c => {} + 0x8c => { + signature = c.exguid()?; + } + 0xb8 => { + in_group = false; + signature = ExGuid::default(); + } + _ => { + return Err(Error { + offset: node.offset, + message: "Unsupported node in a revision manifest", + }); + } + } + } + if defining_table { + return Err(Error { + offset: 0, + message: "Unterminated global identification table", + }); + } + } + Ok(result) + } +} diff --git a/crates/onestore/src/properties.rs b/crates/onestore/src/properties.rs new file mode 100644 index 0000000000000000000000000000000000000000..0b427a36e7b776c3bb4da06916ba5f02fa69a35a --- /dev/null +++ b/crates/onestore/src/properties.rs @@ -0,0 +1,198 @@ +use crate::{Error, bytes::Cursor}; +use std::ops::Range; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum IdStream { + Objects, + ObjectSpaces, + Contexts, +} + +#[derive(Debug, PartialEq, Eq)] +pub enum Value<'a> { + NoData, + Bytes(&'a [u8]), + References { + stream: IdStream, + compact_ids: &'a [u8], + }, + Sets(Range), +} + +#[derive(Debug, PartialEq, Eq)] +pub struct Property<'a> { + pub id: u32, + pub value: Value<'a>, +} + +/// Set zero is the root; nested sets are ranges of indices in this arena. +#[derive(Debug, PartialEq, Eq)] +pub struct PropertySets<'a> { + pub sets: Vec>>, + pub(crate) padding: &'a [u8], + pub(crate) root_ids: &'a [u8], +} + +enum Work<'a> { + Set(usize), + Fields(usize, &'a [u8]), +} + +impl<'a> PropertySets<'a> { + pub fn parse(bytes: &'a [u8]) -> Result { + let mut c = Cursor { bytes, offset: 0 }; + let mut streams = std::array::from_fn::<_, 3, _>(|_| Cursor { + bytes: &[], + offset: 0, + }); + let mut extended = false; + for (index, stream) in streams.iter_mut().enumerate() { + let header = u32::from_le_bytes(c.read()?); + let count = usize::try_from(header & 0xffffff).unwrap(); + if (index > 0 && header & 0x80000000 != 0) + || (index == 0 && header & 0xc0000000 == 0xc0000000) + || (index == 1 && (header & 0x40000000 != 0) != extended) + || (index == 2 && header & 0x40000000 != 0) + { + return Err(Error { + offset: c.offset - 4, + message: "Inconsistent property reference-stream flags", + }); + } + let offset = c.offset; + *stream = Cursor { + bytes: c.take(count * 4)?, + offset, + }; + if index == 0 { + extended = header & 0x40000000 != 0; + if header & 0x80000000 != 0 { + break; + } + } else if index == 1 && !extended { + break; + } + } + let mut sets = vec![Vec::new()]; + let mut root_ids = &bytes[..0]; + let mut work = vec![Work::Set(0)]; + while let Some(item) = work.pop() { + match item { + Work::Set(index) => { + let count = usize::from(u16::from_le_bytes(c.read()?)); + let ids = c.take(count * 4)?; + if index == 0 { + root_ids = ids; + } + work.push(Work::Fields(index, ids)); + } + Work::Fields(index, ids) => { + let Some((first, rest)) = ids.split_first_chunk::<4>() else { + continue; + }; + let id = u32::from_le_bytes(*first); + let kind = (id >> 26) & 0x1f; + work.push(Work::Fields(index, rest)); + let value = match kind { + 1 | 2 => Value::NoData, + 3..=6 => Value::Bytes(c.take(1 << (kind - 3))?), + 7 => { + let count = u32::from_le_bytes(c.read()?); + if count >= 0x40000000 { + return Err(Error { + offset: c.offset - 4, + message: "Property data exceeds the format length limit", + }); + } + Value::Bytes(c.take(usize::try_from(count).unwrap())?) + } + 8..=13 => { + let count = if kind & 1 != 0 { + u32::from_le_bytes(c.read()?) + } else { + 1 + }; + let stream_index = usize::try_from((kind - 8) / 2).unwrap(); + let count = usize::try_from(count) + .ok() + .and_then(|count| count.checked_mul(4)) + .ok_or(Error { + offset: c.offset, + message: "Reference count exceeds address space", + })?; + let compact_ids = streams[stream_index].take(count)?; + let stream = match stream_index { + 0 => IdStream::Objects, + 1 => IdStream::ObjectSpaces, + _ => IdStream::Contexts, + }; + Value::References { + stream, + compact_ids, + } + } + 16 | 17 => { + let count = if kind == 16 { + let count = u32::from_le_bytes(c.read()?); + if count != 0 { + let element = u32::from_le_bytes(c.read()?); + if (element >> 26) & 0x1f != 17 { + return Err(Error { + offset: c.offset - 4, + message: "Property array contains a non-set element type", + }); + } + } + usize::try_from(count).map_err(|_| Error { + offset: c.offset, + message: "Property-set count exceeds address space", + })? + } else { + 1 + }; + let start = sets.len(); + let end = start + .checked_add(count) + .filter(|end| *end <= bytes.len() / 2) + .ok_or(Error { + offset: c.offset, + message: "Property-set count exceeds the available data", + })?; + sets.resize_with(end, Vec::new); + for child in (start..end).rev() { + work.push(Work::Set(child)); + } + Value::Sets(start..end) + } + _ => { + return Err(Error { + offset: c.offset, + message: "Unsupported property type", + }); + } + }; + sets[index].push(Property { id, value }); + } + } + } + for stream in streams { + if !stream.bytes.is_empty() { + return Err(Error { + offset: stream.offset, + message: "Unconsumed property references", + }); + } + } + if !c.bytes.is_empty() && (c.bytes.len() > 7 || !bytes.len().is_multiple_of(8)) { + return Err(Error { + offset: c.offset, + message: "Trailing data exceeds property-set padding", + }); + } + Ok(Self { + sets, + padding: c.bytes, + root_ids, + }) + } +} diff --git a/crates/onestore/src/revisions.rs b/crates/onestore/src/revisions.rs new file mode 100644 index 0000000000000000000000000000000000000000..c370a666599c0358b57e05d291853ca0d2db30db --- /dev/null +++ b/crates/onestore/src/revisions.rs @@ -0,0 +1,354 @@ +use crate::{Error, FileType, Node, Reference, Store, bytes::Cursor}; +use std::{collections::BTreeMap, fmt}; + +type Result = std::result::Result; + +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct ExGuid { + pub guid: [u8; 16], + pub n: u32, +} + +impl fmt::Display for ExGuid { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let g = &self.guid; + write!( + f, + "{{{:08X}-{:04X}-{:04X}-{:02X}{:02X}-{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}}},{}", + u32::from_le_bytes(g[..4].try_into().unwrap()), + u16::from_le_bytes(g[4..6].try_into().unwrap()), + u16::from_le_bytes(g[6..8].try_into().unwrap()), + g[8], + g[9], + g[10], + g[11], + g[12], + g[13], + g[14], + g[15], + self.n + ) + } +} + +impl serde::Serialize for ExGuid { + fn serialize( + &self, + serializer: S, + ) -> std::result::Result { + serializer.collect_str(self) + } +} + +impl Cursor<'_> { + pub(crate) fn exguid(&mut self) -> Result { + let id = ExGuid { + guid: self.read()?, + n: u32::from_le_bytes(self.read()?), + }; + if id.guid == [0; 16] && id.n != 0 { + return Err(Error { + offset: self.offset - 20, + message: "Zero GUID has a nonzero extension", + }); + } + Ok(id) + } +} + +impl<'a> Node<'a> { + pub(crate) fn fields(&self, store: &Store<'a>) -> Cursor<'a> { + Cursor { + bytes: self.payload, + offset: self + .payload + .as_ptr() + .addr() + .checked_sub(store.data.as_ptr().addr()) + .filter(|offset| *offset <= store.data.len()) + .unwrap_or(self.offset), + } + } + + pub(crate) fn referenced_list<'s>(&self, store: &'s Store<'a>) -> Result<&'s [Node<'a>]> { + let Some(Reference::NodeList(chunk)) = self.reference else { + return Err(Error { + offset: self.offset, + message: "Node requires a file-node list reference", + }); + }; + Ok(&store.list(chunk)?.nodes) + } +} + +#[derive(Debug)] +pub struct Revision<'a> { + pub dependency: Option, + pub encrypted: bool, + pub nodes: &'a [Node<'a>], +} + +#[derive(Debug)] +pub struct ObjectSpace<'a> { + pub revisions: BTreeMap>, + pub labels: BTreeMap<(ExGuid, u32), ExGuid>, +} + +#[derive(Debug)] +pub struct RevisionIndex<'a> { + pub root: ExGuid, + pub spaces: BTreeMap>, + pub(crate) store: &'a Store<'a>, +} + +impl<'a> RevisionIndex<'a> { + pub fn parse(store: &'a Store<'a>) -> Result { + let mut root = None; + let mut spaces = BTreeMap::new(); + for node in &store.list(store.header.root)?.nodes { + match node.id { + 4 => { + let id = node.fields(store).exguid()?; + if !spaces.contains_key(&id) { + return Err(Error { + offset: node.offset, + message: "Root object space is referenced before its declaration", + }); + } + if root.replace(id).is_some() { + return Err(Error { + offset: node.offset, + message: "Multiple root object spaces", + }); + } + } + 8 => { + let id = node.fields(store).exguid()?; + let manifest = node.referenced_list(store)?; + let Some(first) = manifest.first() else { + return Err(Error { + offset: node.offset, + message: "Empty object-space manifest", + }); + }; + if id == ExGuid::default() + || first.id != 0xc + || first.fields(store).exguid()? != id + { + return Err(Error { + offset: first.offset, + message: "Object-space identity does not match its manifest", + }); + } + let last = manifest.iter().rfind(|node| node.id == 0x10).ok_or(Error { + offset: first.offset, + message: "Object space has no revision manifest list", + })?; + let nodes = last.referenced_list(store)?; + let Some(first) = nodes.first() else { + return Err(Error { + offset: last.offset, + message: "Empty revision manifest list", + }); + }; + if first.id != 0x14 || first.fields(store).exguid()? != id { + return Err(Error { + offset: first.offset, + message: "Revision list belongs to a different object space", + }); + } + let mut revisions: BTreeMap> = BTreeMap::new(); + let mut labels = BTreeMap::new(); + let mut encryption_data = None; + let mut position = 1; + while position < nodes.len() { + let node = &nodes[position]; + let mut c = node.fields(store); + match node.id { + 0x1b | 0x1e | 0x1f => { + if (node.id == 0x1b) + != (store.header.file_type == FileType::TableOfContents) + { + return Err(Error { + offset: node.offset, + message: "Revision encoding does not match the file type", + }); + } + let rid = c.exguid()?; + let dependency = c.exguid()?; + if node.id == 0x1b { + c.take(8)?; + } + let role = u32::from_le_bytes(c.read()?); + let encoding = u16::from_le_bytes(c.read()?); + let context = if node.id == 0x1f { + c.exguid()? + } else { + ExGuid::default() + }; + if rid == ExGuid::default() + || role > 0xffff + || !matches!(encoding, 0 | 2) + || (node.id == 0x1b && encoding != 0) + { + return Err(Error { + offset: node.offset, + message: "Invalid revision identity, role, or encoding", + }); + } + let dependency = if dependency == ExGuid::default() { + None + } else { + let previous = revisions.get(&dependency).ok_or(Error { + offset: node.offset, + message: "Revision dependency is not an earlier revision", + })?; + if previous.encrypted != (encoding == 2) { + return Err(Error { + offset: node.offset, + message: "Revision changes its dependency's encryption mode", + }); + } + Some(dependency) + }; + let start = position + 1; + position = start; + while position < nodes.len() && nodes[position].id != 0x1c { + if matches!( + nodes[position].id, + 0x1b | 0x1e | 0x1f | 0x5c | 0x5d + ) { + return Err(Error { + offset: nodes[position].offset, + message: "Unterminated revision manifest", + }); + } + position += 1; + } + if position == nodes.len() { + return Err(Error { + offset: node.offset, + message: "Unterminated revision manifest", + }); + } + let body = &nodes[start..position]; + for (position, item) in body.iter().enumerate() { + if item.id == 0xb0 + && body.get(position + 1).is_none_or(|next| next.id != 0x84) + { + return Err(Error { + offset: item.offset, + message: "Object group lacks its dependency overrides", + }); + } + } + if (encoding == 2) + != body.first().is_some_and(|node| node.id == 0x7c) + { + return Err(Error { + offset: node.offset, + message: "Revision encryption key does not match its encoding", + }); + } + if revisions + .values() + .next() + .is_some_and(|previous| previous.encrypted != (encoding == 2)) + { + return Err(Error { + offset: node.offset, + message: "Object space mixes encrypted and unencrypted revisions", + }); + } + if encoding == 2 { + let key = &body[0]; + let Some(Reference::Data(chunk)) = key.reference else { + return Err(Error { + offset: key.offset, + message: "Encryption key lacks a data reference", + }); + }; + let data = store.encryption_key(chunk)?; + if encryption_data + .replace(data) + .is_some_and(|previous| previous != data) + { + return Err(Error { + offset: key.offset, + message: "Object space changes its encryption key", + }); + } + } + if revisions + .insert( + rid, + Revision { + dependency, + encrypted: encoding == 2, + nodes: body, + }, + ) + .is_some() + { + return Err(Error { + offset: node.offset, + message: "Duplicate revision identity", + }); + } + labels.insert((context, role), rid); + } + 0x5c | 0x5d => { + let rid = c.exguid()?; + let role = u32::from_le_bytes(c.read()?); + let context = if node.id == 0x5d { + c.exguid()? + } else { + ExGuid::default() + }; + if !revisions.contains_key(&rid) || role > 0xffff { + return Err(Error { + offset: node.offset, + message: "Revision label has an invalid target or role", + }); + } + labels.insert((context, role), rid); + } + _ => { + return Err(Error { + offset: node.offset, + message: "Unexpected node between revision manifests", + }); + } + } + position += 1; + } + if spaces + .insert(id, ObjectSpace { revisions, labels }) + .is_some() + { + return Err(Error { + offset: node.offset, + message: "Duplicate object-space identity", + }); + } + } + 0x90 => {} + _ => { + return Err(Error { + offset: node.offset, + message: "Unexpected node in the root file-node list", + }); + } + } + } + let root = root.filter(|id| spaces.contains_key(id)).ok_or(Error { + offset: 172, + message: "Root object space is not declared", + })?; + Ok(Self { + root, + spaces, + store, + }) + } +} diff --git a/crates/onestore/src/store.rs b/crates/onestore/src/store.rs new file mode 100644 index 0000000000000000000000000000000000000000..2ab41dfa64f71dae59a571627ee15e2139d40800 --- /dev/null +++ b/crates/onestore/src/store.rs @@ -0,0 +1,531 @@ +use crate::bytes::Cursor; +use std::collections::{BTreeMap, BTreeSet}; +use std::fmt; +use std::ops::Range; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Error { + /// Parser byte offset; zero also represents errors without a byte location. + pub offset: usize, + /// Diagnostic text, not a stable machine-readable error code. + pub message: &'static str, +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{} at byte {:#x}", self.message, self.offset) + } +} + +impl std::error::Error for Error {} + +type Result = std::result::Result; + +impl Cursor<'_> { + fn chunk(&mut self) -> Result { + Ok(Chunk { + offset: u64::from_le_bytes(self.read()?), + length: u64::from(u32::from_le_bytes(self.read()?)), + }) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum FileType { + Section, + TableOfContents, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Chunk { + pub offset: u64, + pub length: u64, +} + +impl Chunk { + pub(crate) fn absent(self) -> bool { + self.length == 0 && (self.offset == 0 || self.offset == u64::MAX) + } + + fn range(self, data: &[u8]) -> Result> { + let start = usize::try_from(self.offset).map_err(|_| Error { + offset: 0, + message: "Chunk offset exceeds address space", + })?; + let size = usize::try_from(self.length).map_err(|_| Error { + offset: start, + message: "Chunk length exceeds address space", + })?; + let end = start.checked_add(size).filter(|end| *end <= data.len()); + match end { + Some(end) if start >= 1024 && end > start => Ok(start..end), + _ => Err(Error { + offset: start, + message: "Chunk extends outside the data area", + }), + } + } +} + +#[derive(Debug)] +pub struct Header { + pub file_type: FileType, + pub file_id: [u8; 16], + pub transaction_count: u32, + pub expected_length: u64, + pub version_id: [u8; 16], + pub generation: u64, + pub deny_read_id: [u8; 16], + pub transaction_log: Chunk, + pub root: Chunk, + pub hashed_chunks: Chunk, +} + +impl Header { + fn parse(data: &[u8]) -> Result { + let mut c = Cursor { + bytes: data, + offset: 0, + }; + let bytes = c.take(1024)?; + let mut c = Cursor { bytes, offset: 0 }; + let file_type = match c.read()? { + [ + 0xe4, + 0x52, + 0x5c, + 0x7b, + 0x8c, + 0xd8, + 0xa7, + 0x4d, + 0xae, + 0xb1, + 0x53, + 0x78, + 0xd0, + 0x29, + 0x96, + 0xd3, + ] => FileType::Section, + [ + 0xa1, + 0x2f, + 0xff, + 0x43, + 0xd9, + 0xef, + 0x76, + 0x4c, + 0x9e, + 0xe2, + 0x10, + 0xea, + 0x57, + 0x22, + 0x76, + 0x5f, + ] => FileType::TableOfContents, + _ => { + return Err(Error { + offset: 0, + message: "Unrecognized revision-store file type", + }); + } + }; + let file_id = c.read()?; + c.take(16)?; + if c.read::<16>()? + != [ + 0x3f, 0xdd, 0x9a, 0x10, 0x1b, 0x91, 0xf5, 0x49, 0xa5, 0xd0, 0x17, 0x91, 0xed, 0xc8, + 0xae, 0xd8, + ] + { + return Err(Error { + offset: 48, + message: "Unrecognized revision-store format", + }); + } + c.take(12)?; + let version = u32::from_le_bytes(c.read()?); + let supported = match file_type { + FileType::Section => 0x2a, + FileType::TableOfContents => 0x1b, + }; + if version != supported { + return Err(Error { + offset: 76, + message: "Unsupported file-format version", + }); + } + c.take(16)?; + let transaction_count = u32::from_le_bytes(c.read()?); + if transaction_count == 0 { + return Err(Error { + offset: 96, + message: "Missing committed transaction", + }); + } + c.take(48)?; + let hashed_chunks = c.chunk()?; + let transaction_log = c.chunk()?; + let root = c.chunk()?; + c.take(12)?; + let expected_length = u64::from_le_bytes(c.read()?); + c.take(8)?; + let version_id = c.read()?; + let generation = u64::from_le_bytes(c.read()?); + let deny_read_id = c.read()?; + Ok(Self { + file_type, + file_id, + transaction_count, + expected_length, + version_id, + generation, + deny_read_id, + transaction_log, + root, + hashed_chunks, + }) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Reference { + Data(Chunk), + NodeList(Chunk), +} + +#[derive(Debug)] +pub struct Node<'a> { + pub id: u16, + pub offset: usize, + pub payload: &'a [u8], + pub reference: Option, +} + +#[derive(Debug)] +pub struct NodeList<'a> { + pub fragments: Vec, + pub nodes: Vec>, +} + +#[derive(Debug)] +pub(crate) struct TransactionFragment<'a> { + pub chunk: Chunk, + pub entries: &'a [u8], +} + +#[derive(Debug)] +pub struct Store<'a> { + pub(crate) data: &'a [u8], + pub(crate) transaction_fragments: Vec>, + pub header: Header, + pub lists: BTreeMap>, + pub checksum_mismatches: Vec, +} + +fn claim(occupied: &mut BTreeMap, range: Range) -> Result<()> { + if occupied + .range(..range.end) + .next_back() + .is_some_and(|(_, end)| *end > range.start) + { + return Err(Error { + offset: range.start, + message: "Overlapping structural chunks or a reference cycle", + }); + } + occupied.insert(range.start, range.end); + Ok(()) +} + +pub(crate) fn crc(mut value: u32, bytes: &[u8], file_type: FileType) -> u32 { + for byte in bytes { + match file_type { + FileType::Section => { + value ^= u32::from(*byte); + for _ in 0..8 { + value = (value >> 1) ^ if value & 1 != 0 { 0xedb88320 } else { 0 }; + } + } + FileType::TableOfContents => { + let mut entry = ((value >> 24) ^ u32::from(*byte)) << 24; + for _ in 0..8 { + entry = (entry << 1) ^ if entry & 0x80000000 != 0 { 0xaf } else { 0 }; + } + value = (value << 8) ^ (entry & 0xffff); + } + } + } + value +} + +pub(crate) fn transaction_crc(value: u32, bytes: &[u8], file_type: FileType, full: bool) -> u32 { + // OneNote excludes the entry flushed at a TOC fragment boundary (MS-ONESTORE 2.3.3.2 note 8). + let bytes = if full && file_type == FileType::TableOfContents { + &bytes[..bytes.len().saturating_sub(8)] + } else { + bytes + }; + crc(value, bytes, file_type) +} + +impl<'a> Store<'a> { + /// Parses committed storage while retaining checksum mismatches for diagnostic inspection. + pub fn parse(data: &'a [u8]) -> Result { + let header = Header::parse(data)?; + let mut occupied = BTreeMap::new(); + let mut counts = BTreeMap::new(); + let mut checksum_mismatches = Vec::new(); + let mut chunk = header.transaction_log; + let initial_crc = if header.file_type == FileType::Section { + u32::MAX + } else { + 0 + }; + let mut checksum = initial_crc; + let mut committed = 0; + let mut transaction_fragments = Vec::new(); + while committed < header.transaction_count { + let current_chunk = chunk; + let range = chunk.range(data)?; + claim(&mut occupied, range.clone())?; + let mut c = Cursor { + bytes: &data[range.clone()], + offset: range.start, + }; + let end = loop { + if committed == header.transaction_count { + break c.offset; + } + if (12..20).contains(&c.bytes.len()) { + let end = c.offset; + chunk = c.chunk()?; + break end; + } + let offset = c.offset; + let entry = c.take(8)?; + let id = u32::from_le_bytes(entry[..4].try_into().unwrap()); + let value = u32::from_le_bytes(entry[4..].try_into().unwrap()); + if id == 1 { + let expected = if header.file_type == FileType::Section { + !checksum + } else { + checksum + }; + if value != expected { + checksum_mismatches.push(offset); + } + committed += 1; + } else { + if id < 0x10 || counts.get(&id).is_some_and(|previous| *previous > value) { + return Err(Error { + offset, + message: "Incorrect file-node count in transaction log", + }); + } + counts.insert(id, value); + } + checksum = transaction_crc(checksum, entry, header.file_type, c.bytes.len() < 20); + }; + transaction_fragments.push(TransactionFragment { + chunk: current_chunk, + entries: &data[range.start..end], + }); + } + let mut pending = vec![header.root]; + if !header.hashed_chunks.absent() { + pending.push(header.hashed_chunks); + } + let mut lists = BTreeMap::new(); + let mut list_ids = BTreeSet::new(); + while let Some(mut chunk) = pending.pop() { + let mut nodes = Vec::new(); + let mut fragments = Vec::new(); + let mut list_id = None; + let mut required = 0; + loop { + let range = chunk.range(data)?; + claim(&mut occupied, range.clone())?; + if range.len() < 36 { + return Err(Error { + offset: range.start, + message: "Truncated file-node fragment", + }); + } + let mut c = Cursor { + bytes: &data[range.clone()], + offset: range.start, + }; + if u64::from_le_bytes(c.read()?) != 0xa4567ab1f5f7f4c4 { + return Err(Error { + offset: range.start, + message: "Incorrect file-node fragment signature", + }); + } + let id = u32::from_le_bytes(c.read()?); + let sequence = u32::from_le_bytes(c.read()?); + if usize::try_from(sequence).ok() != Some(fragments.len()) + || list_id.is_some_and(|previous| id != previous) + { + return Err(Error { + offset: range.start + 8, + message: "Incorrect file-node fragment sequence", + }); + } + if list_id.is_none() { + if !list_ids.insert(id) { + return Err(Error { + offset: range.start + 8, + message: "Duplicate file-node list identity", + }); + } + required = usize::try_from(*counts.get(&id).ok_or(Error { + offset: range.start + 8, + message: "File-node list is absent from the transaction log", + })?) + .map_err(|_| Error { + offset: range.start + 8, + message: "File-node count exceeds address space", + })?; + list_id = Some(id); + } + let mut tail = Cursor { + bytes: &data[range.end - 20..range.end], + offset: range.end - 20, + }; + let next = tail.chunk()?; + if u64::from_le_bytes(tail.read()?) != 0x8bc215c38233ba4b { + return Err(Error { + offset: range.end - 8, + message: "Incorrect file-node fragment footer", + }); + } + c.bytes = &data[range.start + 16..range.end - 20]; + while nodes.len() < required && c.bytes.len() >= 4 { + let offset = c.offset; + let raw = u32::from_le_bytes(c.read()?); + let size = usize::try_from((raw >> 10) & 0x1fff).unwrap(); + if size < 4 { + return Err(Error { + offset, + message: "File node is shorter than its header", + }); + } + let id = u16::try_from(raw & 0x3ff).unwrap(); + let body = c.take(size - 4)?; + if id == 0xff { + break; + } + let mut fields = Cursor { + bytes: body, + offset: offset + 4, + }; + let reference = match (raw >> 27) & 0xf { + 0 => None, + base @ (1 | 2) => { + let (stp, nil, shift) = match (raw >> 23) & 3 { + 0 => (u64::from_le_bytes(fields.read()?), u64::MAX, 0), + 1 => ( + u64::from(u32::from_le_bytes(fields.read()?)), + u64::from(u32::MAX), + 0, + ), + 2 => ( + u64::from(u16::from_le_bytes(fields.read()?)), + u64::from(u16::MAX), + 3, + ), + 3 => ( + u64::from(u32::from_le_bytes(fields.read()?)), + u64::from(u32::MAX), + 3, + ), + _ => unreachable!(), + }; + let cb = match (raw >> 25) & 3 { + 0 => u64::from(u32::from_le_bytes(fields.read()?)), + 1 => u64::from_le_bytes(fields.read()?), + 2 => u64::from(fields.read::<1>()?[0]) * 8, + 3 => u64::from(u16::from_le_bytes(fields.read()?)) * 8, + _ => unreachable!(), + }; + let reference = Chunk { + offset: if cb == 0 && stp == nil { + u64::MAX + } else { + stp << shift + }, + length: cb, + }; + if base == 1 { + if !reference.absent() { + reference.range(data)?; + } + Some(Reference::Data(reference)) + } else { + Some(Reference::NodeList(reference)) + } + } + _ => { + return Err(Error { + offset, + message: "Unsupported file-node base type", + }); + } + }; + nodes.push(Node { + id, + offset, + payload: fields.bytes, + reference, + }); + } + fragments.push(chunk); + if nodes.len() == required { + break; + } + chunk = next; + } + let last_revision_list = nodes.iter().rposition(|node| node.id == 0x10); + for (index, node) in nodes.iter().enumerate() { + if let Some(Reference::NodeList(reference)) = node.reference + && (node.id != 0x10 || Some(index) == last_revision_list) + { + pending.push(reference); + } + } + lists.insert(list_id.unwrap(), NodeList { fragments, nodes }); + } + Ok(Self { + data, + transaction_fragments, + header, + lists, + checksum_mismatches, + }) + } + + pub fn chunk_data(&self, chunk: Chunk) -> Result<&'a [u8]> { + Ok(&self.data[chunk.range(self.data)?]) + } + + pub(crate) fn list(&self, chunk: Chunk) -> Result<&NodeList<'a>> { + let data = self.chunk_data(chunk)?; + let mut c = Cursor { + bytes: data, + offset: usize::try_from(chunk.offset).unwrap(), + }; + c.take(8)?; + let id = u32::from_le_bytes(c.read()?); + self.lists + .get(&id) + .filter(|list| list.fragments.first() == Some(&chunk)) + .ok_or(Error { + offset: c.offset - 4, + message: "Reference does not identify a committed file-node list", + }) + } +} diff --git a/crates/onestore/src/write.rs b/crates/onestore/src/write.rs new file mode 100644 index 0000000000000000000000000000000000000000..b0b2a16045e43591e19725064e0bc4694f487b40 --- /dev/null +++ b/crates/onestore/src/write.rs @@ -0,0 +1,646 @@ +use crate::{ + Chunk, Error, ExGuid, FileType, ObjectData, PropertySets, Reference, RevisionIndex, Store, + Value, + store::{crc, transaction_crc}, +}; + +use std::collections::{BTreeMap, BTreeSet}; + +type Result = std::result::Result; + +pub(crate) fn fresh_guid() -> Result<[u8; 16]> { + let mut guid = [0; 16]; + getrandom::fill(&mut guid).map_err(|_| Error { + offset: 0, + message: "System random source failed", + })?; + guid[7] = (guid[7] & 0x0f) | 0x40; + guid[8] = (guid[8] & 0x3f) | 0x80; + Ok(guid) +} + +impl ExGuid { + pub(crate) fn encode(self, data: &mut Vec) { + data.extend_from_slice(&self.guid); + data.extend_from_slice(&self.n.to_le_bytes()); + } +} + +pub(crate) fn node(id: u16, reference: Option, payload: &[u8]) -> Result> { + let size = 4 + if reference.is_some() { 12 } else { 0 } + payload.len(); + if size > 0x1fff { + return Err(Error { + offset: 0, + message: "File node exceeds the format size limit", + }); + } + let (base, chunk) = match reference { + Some(Reference::Data(chunk)) => (1, Some(chunk)), + Some(Reference::NodeList(chunk)) => (2, Some(chunk)), + None => (0, None), + }; + let header = 0x80000000 | (base << 27) | (u32::try_from(size).unwrap() << 10) | u32::from(id); + let mut bytes = header.to_le_bytes().to_vec(); + if let Some(chunk) = chunk { + bytes.extend_from_slice(&chunk.offset.to_le_bytes()); + bytes.extend_from_slice( + &u32::try_from(chunk.length) + .map_err(|_| Error { + offset: 0, + message: "Chunk exceeds the encoded length limit", + })? + .to_le_bytes(), + ); + } + bytes.extend_from_slice(payload); + Ok(bytes) +} + +pub(crate) fn append(data: &mut Vec, bytes: &[u8]) -> Result { + let length = u64::from(u32::try_from(bytes.len()).map_err(|_| Error { + offset: 0, + message: "Chunk exceeds the encoded length limit", + })?); + data.resize(data.len().next_multiple_of(8), 0); + let offset = u64::try_from(data.len()).unwrap(); + data.extend_from_slice(bytes); + Ok(Chunk { offset, length }) +} + +pub(crate) fn append_list(data: &mut Vec, id: u32, nodes: &[Vec]) -> Result { + let mut bytes = 0xa4567ab1f5f7f4c4_u64.to_le_bytes().to_vec(); + bytes.extend_from_slice(&id.to_le_bytes()); + bytes.extend_from_slice(&0_u32.to_le_bytes()); + for node in nodes { + bytes.extend_from_slice(node); + } + bytes.resize((bytes.len() + 20).next_multiple_of(8) - 20, 0); + bytes.extend_from_slice(&u64::MAX.to_le_bytes()); + bytes.extend_from_slice(&0_u32.to_le_bytes()); + bytes.extend_from_slice(&0x8bc215c38233ba4b_u64.to_le_bytes()); + append(data, &bytes) +} + +fn compact(id: ExGuid, table: &BTreeMap) -> Result<[u8; 4]> { + let index = table + .iter() + .find_map(|(index, guid)| (*guid == id.guid).then_some(*index)) + .ok_or(Error { + offset: 0, + message: "Object identity is absent from its global ID table", + })?; + if id.n > 255 { + return Err(Error { + offset: 0, + message: "Object extension exceeds CompactID capacity", + }); + } + Ok(((index << 8) | id.n).to_le_bytes()) +} + +fn patch_properties( + blob: &[u8], + updates: &[(u32, &[u8])], + insert: Option<(u32, &[u8])>, +) -> Result> { + let properties = PropertySets::parse(blob)?; + let mut patches = Vec::new(); + for (i, &(property, value)) in updates.iter().chain(insert.iter()).enumerate() { + if updates[..i.min(updates.len())] + .iter() + .any(|(id, _)| *id == property) + { + return Err(Error { + offset: 0, + message: "Duplicate property update", + }); + } + let kind = (property >> 26) & 0x1f; + if !(3..=7).contains(&kind) { + return Err(Error { + offset: 0, + message: "Property does not contain scalar bytes", + }); + } + if (kind == 7 && value.len() >= 0x40000000) || (kind != 7 && value.len() != 1 << (kind - 3)) + { + return Err(Error { + offset: 0, + message: "Replacement has an invalid property length", + }); + } + let matches: Vec<_> = properties.sets[0] + .iter() + .filter(|candidate| candidate.id == property) + .collect(); + let adding = i == updates.len(); + if matches.len() != usize::from(!adding) { + return Err(Error { + offset: 0, + message: "Property is missing or duplicated", + }); + } + let previous = if adding { + None + } else { + let Value::Bytes(previous) = matches[0].value else { + return Err(Error { + offset: 0, + message: "Property does not contain scalar bytes", + }); + }; + if previous == value { + continue; + } + Some(previous) + }; + let mut encoded = Vec::new(); + if kind == 7 { + encoded.extend_from_slice(&u32::try_from(value.len()).unwrap().to_le_bytes()); + } + encoded.extend_from_slice(value); + if let Some(previous) = previous { + let start = previous.as_ptr().addr() - blob.as_ptr().addr(); + patches.push(( + start - if kind == 7 { 4 } else { 0 }, + start + previous.len(), + encoded, + )); + } else { + let count = u16::try_from(properties.sets[0].len() + 1).map_err(|_| Error { + offset: 0, + message: "Root property count exceeds the format limit", + })?; + let ids = properties.root_ids.as_ptr().addr() - blob.as_ptr().addr(); + patches.push((ids - 2, ids, count.to_le_bytes().to_vec())); + let end = ids + properties.root_ids.len(); + patches.push((end, end, property.to_le_bytes().to_vec())); + let end = blob.len() - properties.padding.len(); + patches.push((end, end, encoded)); + } + } + if patches.is_empty() { + return Ok(blob.to_vec()); + } + patches.sort_by_key(|(start, end, _)| (*start, *end)); + let mut changed = Vec::new(); + let mut cursor = 0; + for (start, end, value) in patches { + changed.extend_from_slice(&blob[cursor..start]); + changed.extend_from_slice(&value); + cursor = end; + } + changed.extend_from_slice(&blob[cursor..blob.len() - properties.padding.len()]); + changed.resize(changed.len().next_multiple_of(8), 0); + PropertySets::parse(&changed)?; + + Ok(changed) +} + +pub(crate) struct ObjectEdit<'a> { + pub object: ExGuid, + pub updates: &'a [(u32, &'a [u8])], + pub insert: Option<(u32, &'a [u8])>, +} + +/// Replaces a root-level scalar byte property in the default active revision. +/// The caller supplies its encoded value and is responsible for MS-ONE semantics. +/// Returns a complete file image without I/O; use `commit_file_property` to update an existing file. +pub fn replace_property_bytes( + source: &[u8], + space: ExGuid, + object_id: ExGuid, + property: u32, + value: &[u8], +) -> Result> { + replace_objects( + source, + space, + &[ObjectEdit { + object: object_id, + updates: &[(property, value)], + insert: None, + }], + ) +} + +pub(crate) fn replace_objects( + source: &[u8], + space: ExGuid, + edits: &[ObjectEdit<'_>], +) -> Result> { + let store = Store::parse(source)?; + let is_section = store.header.file_type == FileType::Section; + if !store.checksum_mismatches.is_empty() { + return Err(Error { + offset: store.checksum_mismatches[0], + message: "Cannot write a file with transaction checksum damage", + }); + } + let index = RevisionIndex::parse(&store)?; + index.validate_current()?; + let rid = *index + .spaces + .get(&space) + .and_then(|space| space.labels.get(&(ExGuid::default(), 1))) + .ok_or(Error { + offset: 0, + message: "Object space has no active default revision", + })?; + let revision = index.resolve(space, rid)?; + let reachable = revision.reachable()?; + let mut changed = BTreeMap::new(); + for (i, edit) in edits.iter().enumerate() { + if edits[..i] + .iter() + .any(|previous| previous.object == edit.object) + { + return Err(Error { + offset: 0, + message: "Duplicate object edit", + }); + } + if !reachable.contains(&edit.object) { + return Err(Error { + offset: 0, + message: "Object is not reachable in the active revision", + }); + } + let object = &revision.objects[&edit.object]; + if object.jcid & 0x100000 != 0 { + return Err(Error { + offset: 0, + message: "Read-only object requires a new identity", + }); + } + let ObjectData::Properties(blob) = object.data else { + return Err(Error { + offset: 0, + message: "Object does not contain editable properties", + }); + }; + let bytes = patch_properties(blob, edit.updates, edit.insert)?; + if bytes != blob { + changed.insert(edit.object, bytes); + } + } + if changed.is_empty() { + return Ok(source.to_vec()); + } + + // Native cold-open fails on long dependency chains; cap their depth at 512. + let checkpoint = std::iter::successors(Some(rid), |id| { + index.spaces[&space].revisions[id].dependency + }) + .nth(511) + .is_some(); + let selected: Vec<_> = revision + .objects + .iter() + .filter(|(id, _)| checkpoint || changed.contains_key(id)) + .collect(); + let toc_table = if checkpoint && !is_section { + if selected.iter().any(|(_, object)| { + object.jcid != 0x20001 || !matches!(object.data, ObjectData::Properties(_)) + }) { + return Err(Error { + offset: 0, + message: "TOC checkpoint requires table-of-contents property objects", + }); + } + let guids: BTreeSet<_> = selected + .iter() + .flat_map(|(_, object)| object.global_ids.values().copied()) + .collect(); + if guids.len() > 0x1000000 { + return Err(Error { + offset: 0, + message: "Global ID table exceeds CompactID capacity", + }); + } + Some( + guids + .into_iter() + .enumerate() + .map(|(i, guid)| (u32::try_from(i).unwrap(), guid)) + .collect::>(), + ) + } else { + None + }; + let mut groups = BTreeMap::<_, Vec<_>>::new(); + for (id, object) in selected { + groups + .entry(toc_table.as_ref().unwrap_or(&object.global_ids)) + .or_default() + .push((*id, object)); + } + let mut output = source.to_vec(); + let maximum = store + .transaction_fragments + .iter() + .flat_map(|fragment| fragment.entries.chunks_exact(8)) + .map(|entry| u32::from_le_bytes(entry[..4].try_into().unwrap())) + .max() + .unwrap(); + let new_rid = ExGuid { + guid: fresh_guid()?, + n: 1, + }; + let mut start = Vec::new(); + new_rid.encode(&mut start); + if checkpoint { ExGuid::default() } else { rid }.encode(&mut start); + if !is_section { + start.extend_from_slice(&0_u64.to_le_bytes()); + } + start.extend_from_slice(&1_u32.to_le_bytes()); + start.extend_from_slice(&0_u16.to_le_bytes()); + let mut manifest = vec![node(if is_section { 0x1e } else { 0x1b }, None, &start)?]; + let mut group_counts = Vec::new(); + for (table, objects) in groups { + let mut payload = Vec::new(); + let mut group = if is_section { + ExGuid { + guid: fresh_guid()?, + n: 1, + } + .encode(&mut payload); + vec![node(0xb4, None, &payload)?, node(0x22, None, &[])?] + } else { + vec![node(0x21, None, &[0])?] + }; + for (id, guid) in table { + let mut entry = id.to_le_bytes().to_vec(); + entry.extend_from_slice(guid); + group.push(node(0x24, None, &entry)?); + } + group.push(node(0x28, None, &[])?); + let mut override_crc = u32::MAX; + for (id, object) in objects { + let mut declaration = compact(id, table)?.to_vec(); + override_crc = crc( + override_crc, + &object.reference_count.to_le_bytes(), + FileType::Section, + ); + match object.data { + ObjectData::File { + reference, + extension, + } => { + declaration.extend_from_slice(&object.jcid.to_le_bytes()); + declaration.extend_from_slice(&object.reference_count.to_le_bytes()); + for bytes in [reference, extension] { + declaration.extend_from_slice( + &u32::try_from(bytes.len() / 2).unwrap().to_le_bytes(), + ); + declaration.extend_from_slice(bytes); + } + group.push(node(0x73, None, &declaration)?); + } + ObjectData::Properties(previous) => { + let bytes = changed.get(&id).map(Vec::as_slice).unwrap_or(previous); + let references = object.references()?; + let flags = u8::from(!references.objects.is_empty()) + | (u8::from( + !references.object_spaces.is_empty() || !references.contexts.is_empty(), + ) << 1); + let data = if toc_table.is_some() { + let mut mapped = bytes.to_vec(); + for property in PropertySets::parse(bytes)?.sets.iter().flatten() { + if let Value::References { compact_ids, .. } = property.value { + let offset = compact_ids.as_ptr().addr() - bytes.as_ptr().addr(); + for (i, value) in compact_ids.chunks_exact(4).enumerate() { + let value = u32::from_le_bytes(value.try_into().unwrap()); + let target = ExGuid { + guid: object.global_ids[&(value >> 8)], + n: value & 255, + }; + mapped[offset + i * 4..offset + i * 4 + 4] + .copy_from_slice(&compact(target, table)?); + } + } + } + append(&mut output, &mapped)? + } else if changed.contains_key(&id) { + append(&mut output, bytes)? + } else { + Chunk { + offset: u64::try_from(bytes.as_ptr().addr() - source.as_ptr().addr()) + .unwrap(), + length: u64::try_from(bytes.len()).unwrap(), + } + }; + if is_section { + declaration.extend_from_slice(&object.jcid.to_le_bytes()); + declaration.push(flags); + } else if checkpoint { + let body = 1_u64 | (u64::from(flags & 1) << 16); + declaration.extend_from_slice(&body.to_le_bytes()[..6]); + } else { + declaration.extend_from_slice(&u32::from(flags).to_le_bytes()); + } + declaration.extend_from_slice(&object.reference_count.to_le_bytes()); + let readonly = object.jcid & 0x100000 != 0; + if readonly { + declaration.extend_from_slice(&md5::compute(bytes).0); + } + group.push(node( + if is_section { + if readonly { 0xc5 } else { 0xa5 } + } else if checkpoint { + 0x2e + } else { + 0x42 + }, + Some(Reference::Data(data)), + &declaration, + )?); + } + ObjectData::Encrypted(_) => { + return Err(Error { + offset: 0, + message: "Encrypted objects cannot be checkpointed", + }); + } + } + } + if is_section { + group.push(node(0xb8, None, &[])?); + let group_id = u32::try_from(group_counts.len()) + .ok() + .and_then(|n| n.checked_add(1)) + .and_then(|n| maximum.checked_add(n)) + .ok_or(Error { + offset: 0, + message: "File-node list identities are exhausted", + })?; + let chunk = append_list(&mut output, group_id, &group)?; + group_counts.push((group_id, group.len())); + manifest.push(node(0xb0, Some(Reference::NodeList(chunk)), &payload)?); + let mut overrides = vec![0; 8]; + overrides.extend_from_slice(&(!override_crc).to_le_bytes()); + manifest.push(node( + 0x84, + Some(Reference::Data(Chunk { + offset: u64::MAX, + length: 0, + })), + &overrides, + )?); + } else { + manifest.extend(group); + } + } + if checkpoint { + for (role, id) in &revision.roots { + let mut payload = Vec::new(); + if is_section { + id.encode(&mut payload); + } else { + payload.extend_from_slice(&compact(*id, toc_table.as_ref().unwrap())?); + } + payload.extend_from_slice(&role.to_le_bytes()); + manifest.push(node(if is_section { 0x5a } else { 0x59 }, None, &payload)?); + } + } + manifest.push(node(0x1c, None, &[])?); + let root = store.list(store.header.root)?; + let space_node = root + .nodes + .iter() + .find(|node| node.id == 8 && node.fields(&store).exguid() == Ok(space)) + .ok_or(Error { + offset: 0, + message: "Object space is absent from the root list", + })?; + let space_list = space_node.referenced_list(&store)?; + let revision_node = space_list.iter().rfind(|node| node.id == 0x10).unwrap(); + let Some(Reference::NodeList(manifest_reference)) = revision_node.reference else { + unreachable!() + }; + let revision_list = store.list(manifest_reference)?; + let last_fragment = *revision_list.fragments.last().unwrap(); + let list_start = usize::try_from(last_fragment.offset).unwrap(); + let list_id = u32::from_le_bytes(source[list_start + 8..list_start + 12].try_into().unwrap()); + let manifest_chunk = append_list(&mut output, list_id, &manifest)?; + let manifest_start = usize::try_from(manifest_chunk.offset).unwrap(); + let sequence = u32::try_from(revision_list.fragments.len()).map_err(|_| Error { + offset: list_start, + message: "File-node fragment sequences are exhausted", + })?; + output[manifest_start + 12..manifest_start + 16].copy_from_slice(&sequence.to_le_bytes()); + let last_node = revision_list.nodes.last().unwrap(); + let node_header = u32::from_le_bytes( + source[last_node.offset..last_node.offset + 4] + .try_into() + .unwrap(), + ); + let nodes_end = last_node.offset + usize::try_from((node_header >> 10) & 0x1fff).unwrap(); + let tail = list_start + usize::try_from(last_fragment.length).unwrap() - 20; + if tail - nodes_end >= 4 { + output[nodes_end..nodes_end + 4].copy_from_slice(&node(0xff, None, &[])?); + } + output[tail..tail + 8].copy_from_slice(&manifest_chunk.offset.to_le_bytes()); + output[tail + 8..tail + 12].copy_from_slice(&(manifest_chunk.length as u32).to_le_bytes()); + + let transactions = store.header.transaction_count.checked_add(1).ok_or(Error { + offset: 96, + message: "Transaction counter is exhausted", + })?; + let changed_bytes = store.header.transaction_count ^ transactions; + let commit_byte = (31 - changed_bytes.leading_zeros()) / 8; + let ceiling = transactions | ((1_u32 << (commit_byte * 8)) - 1); + let mut entries = Vec::new(); + for (id, count) in group_counts + .into_iter() + .chain([(list_id, revision_list.nodes.len() + manifest.len())]) + { + entries.extend_from_slice(&id.to_le_bytes()); + entries.extend_from_slice( + &u32::try_from(count) + .map_err(|_| Error { + offset: 0, + message: "File-node count exceeds the format limit", + })? + .to_le_bytes(), + ); + } + let mut checksum = if is_section { u32::MAX } else { 0 }; + for fragment in &store.transaction_fragments { + checksum = transaction_crc( + checksum, + fragment.entries, + store.header.file_type, + fragment.entries.len() + 20 > fragment.chunk.length as usize, + ); + } + let last_log = store.transaction_fragments.last().unwrap(); + let mut crc_used = last_log.entries.len(); + let mut crc_capacity = (last_log.chunk.length as usize - 12) & !7; + let mut advance_crc = |checksum, entry: &[u8]| { + if crc_used == crc_capacity { + crc_used = 0; + crc_capacity = 1008; + } + crc_used += 8; + transaction_crc( + checksum, + entry, + store.header.file_type, + crc_used == crc_capacity, + ) + }; + for entry in entries.chunks_exact(8) { + checksum = advance_crc(checksum, entry); + } + for _ in transactions..=ceiling { + let sentinel_crc = if is_section { !checksum } else { checksum }; + entries.extend_from_slice(&1_u32.to_le_bytes()); + entries.extend_from_slice(&sentinel_crc.to_le_bytes()); + checksum = advance_crc(checksum, &entries[entries.len() - 8..]); + } + let mut log_chunk = last_log.chunk; + let mut used = last_log.entries.len(); + let mut remaining = entries.as_slice(); + while !remaining.is_empty() { + let capacity = usize::try_from(log_chunk.length) + .unwrap() + .checked_sub(12) + .map(|size| size & !7) + .filter(|capacity| *capacity >= used) + .ok_or(Error { + offset: usize::try_from(log_chunk.offset).unwrap(), + message: "Transaction fragment has no room for continuation", + })?; + let offset = usize::try_from(log_chunk.offset).unwrap(); + let size = remaining.len().min(capacity - used); + output[offset + used..offset + used + size].copy_from_slice(&remaining[..size]); + remaining = &remaining[size..]; + if !remaining.is_empty() { + let mut fragment = vec![0; 1024]; + fragment[1008..1016].copy_from_slice(&u64::MAX.to_le_bytes()); + let next = append(&mut output, &fragment)?; + output[offset + capacity..offset + capacity + 8] + .copy_from_slice(&next.offset.to_le_bytes()); + output[offset + capacity + 8..offset + capacity + 12] + .copy_from_slice(&(next.length as u32).to_le_bytes()); + log_chunk = next; + used = 0; + } + } + output[96..100].copy_from_slice(&transactions.to_le_bytes()); + let length = u64::try_from(output.len()).unwrap(); + output[196..204].copy_from_slice(&length.to_le_bytes()); + output[212..228].copy_from_slice(&fresh_guid()?); + output[236..252].copy_from_slice(&fresh_guid()?); + let generation = store.header.generation.checked_add(1).ok_or(Error { + offset: 228, + message: "File generation counter is exhausted", + })?; + output[228..236].copy_from_slice(&generation.to_le_bytes()); + let written = Store::parse(&output)?; + let written_index = RevisionIndex::parse(&written)?; + written_index.resolve(space, new_rid)?.reachable()?; + Ok(output) +} diff --git a/crates/onestore/tests/commit.rs b/crates/onestore/tests/commit.rs new file mode 100644 index 0000000000000000000000000000000000000000..519e6cf9e46dcc753ea568a7ff3be79e198a5f50 --- /dev/null +++ b/crates/onestore/tests/commit.rs @@ -0,0 +1,224 @@ +#[path = "support/disk.rs"] +mod disk; +use disk::Disk; +use onestore::{ + ExGuid, ObjectData, PropertySets, RevisionIndex, Store, Value, replace_property_bytes, +}; +use std::fs; + +#[test] +fn incomplete_native_save_is_rejected_before_storage_io() { + let source = fs::read("../../corpus/malformed/native-inflight.one").unwrap(); + let store = Store::parse(&source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let graph_error = index.validate_current().unwrap_err(); + let mut checked = 0; + for (osid, space) in &index.spaces { + let revision = index + .resolve(*osid, space.labels[&(ExGuid::default(), 1)]) + .unwrap(); + for oid in revision.reachable().unwrap() { + let object = &revision.objects[&oid]; + if object.jcid != 0x6000e { + continue; + } + let ObjectData::Properties(data) = object.data else { + continue; + }; + for property in &PropertySets::parse(data).unwrap().sets[0] { + if property.value != Value::Bytes(b"Rust same paragraph.") { + continue; + } + let mut disk = Disk { + visible: source.clone(), + durable: source.clone(), + operation: 0, + fail_at: None, + write_limit: 1024, + random: 1, + }; + let error = onestore::commit_property_bytes( + &mut disk, + &source, + *osid, + oid, + property.id, + b"Rust same paragraph.", + ) + .unwrap_err(); + assert_eq!(error.state, onestore::CommitState::NotCommitted); + assert_eq!(error.error.to_string(), graph_error.to_string()); + assert_eq!(disk.operation, 0); + checked += 1; + } + } + } + assert_eq!(checked, 1); +} + +#[test] +fn repeated_appends_cross_log_fragments_and_expose_counter_tears() { + let mut source = + fs::read("../../corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one") + .unwrap(); + let store = Store::parse(&source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let mut target = None; + for (osid, space) in &index.spaces { + let revision = index + .resolve(*osid, space.labels[&(ExGuid::default(), 1)]) + .unwrap(); + for (oid, object) in revision.objects { + if let ObjectData::Properties(data) = object.data { + for property in &PropertySets::parse(data).unwrap().sets[0] { + if property.value == Value::Bytes(b"Fictitious plain text.") { + target = Some((*osid, oid, property.id)); + } + } + } + } + } + let (osid, oid, property) = target.unwrap(); + let root = store.header.root; + let log = store.header.transaction_log; + let initial_count = store.header.transaction_count; + let mut saw_counter_tear = false; + for transaction in initial_count + 1..=258 { + let value = format!("Transaction {transaction}"); + let written = + replace_property_bytes(&source, osid, oid, property, value.as_bytes()).unwrap(); + let store = Store::parse(&written).unwrap(); + assert_eq!(store.header.root, root); + assert_eq!(store.header.transaction_log, log); + assert_eq!(store.header.transaction_count, transaction); + assert!(store.checksum_mismatches.is_empty()); + RevisionIndex::parse(&store) + .unwrap() + .validate_current() + .unwrap(); + let mut previous = written.clone(); + previous[..1024].copy_from_slice(&source[..1024]); + let old = Store::parse(&previous).unwrap(); + assert_eq!(old.header.transaction_count, transaction - 1); + assert!(old.checksum_mismatches.is_empty()); + RevisionIndex::parse(&old) + .unwrap() + .validate_current() + .unwrap(); + for prefix in 96..=100 { + let mut torn = written.clone(); + torn[prefix..1024].copy_from_slice(&source[prefix..1024]); + let result = Store::parse(&torn) + .and_then(|store| RevisionIndex::parse(&store)?.validate_current()); + if transaction == 256 && prefix == 97 { + assert!(result.is_err()); + saw_counter_tear = true; + } else { + result.unwrap(); + } + } + if transaction == initial_count + 1 || transaction == 256 { + check_crashes(&source, osid, oid, property, value.as_bytes()); + } + if transaction == initial_count + 1 { + let path = std::env::temp_dir().join(format!( + "onestore-commit-{}-{}.one", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos() + )); + fs::write(&path, &source).unwrap(); + onestore::commit_file_property(&path, &source, osid, oid, property, value.as_bytes()) + .unwrap(); + let committed = fs::read(&path).unwrap(); + let parsed = Store::parse(&committed).unwrap(); + assert_eq!(parsed.header.transaction_count, transaction); + RevisionIndex::parse(&parsed) + .unwrap() + .validate_current() + .unwrap(); + let stale = + onestore::commit_file_property(&path, &source, osid, oid, property, b"stale") + .unwrap_err(); + assert_eq!(stale.state, onestore::CommitState::NotCommitted); + assert_eq!(fs::read(&path).unwrap(), committed); + onestore::commit_file_property( + &path, + &committed, + osid, + oid, + property, + value.as_bytes(), + ) + .unwrap(); + assert_eq!(fs::read(&path).unwrap(), committed); + fs::remove_file(path).unwrap(); + } + source = written; + } + assert!(saw_counter_tear); +} + +fn check_crashes(source: &[u8], osid: ExGuid, oid: ExGuid, property: u32, value: &[u8]) { + let current_value = |data: &[u8]| { + let store = Store::parse(data).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + let revision = index + .resolve(osid, index.spaces[&osid].labels[&(ExGuid::default(), 1)]) + .unwrap(); + let ObjectData::Properties(blob) = revision.objects[&oid].data else { + panic!() + }; + let properties = PropertySets::parse(blob).unwrap(); + let Value::Bytes(value) = properties.sets[0] + .iter() + .find(|p| p.id == property) + .unwrap() + .value + else { + panic!() + }; + value.to_vec() + }; + let before = current_value(source); + for limit in [17, 1024] { + let disk = |fail_at, random| Disk { + visible: source.to_vec(), + durable: source.to_vec(), + operation: 0, + fail_at, + write_limit: limit, + random, + }; + let mut successful = disk(None, 1); + onestore::commit_property_bytes(&mut successful, source, osid, oid, property, value) + .unwrap(); + assert_eq!(current_value(&successful.durable), value); + for at in 1..=successful.operation { + for seed in [0, 1, 42, u64::MAX] { + let mut interrupted = disk(Some(at), seed); + let failure = onestore::commit_property_bytes( + &mut interrupted, + source, + osid, + oid, + property, + value, + ) + .unwrap_err(); + let persisted = current_value(&interrupted.durable); + match failure.state { + onestore::CommitState::NotCommitted => assert_eq!(persisted, before), + onestore::CommitState::Committed => assert_eq!(persisted, value), + onestore::CommitState::Unknown => { + assert!(persisted == before || persisted == value) + } + } + } + } + } +} diff --git a/crates/onestore/tests/document.rs b/crates/onestore/tests/document.rs new file mode 100644 index 0000000000000000000000000000000000000000..e44ced8614d1c64700372eb7c52af03124e22eaa --- /dev/null +++ b/crates/onestore/tests/document.rs @@ -0,0 +1,866 @@ +use onestore::{ + ExGuid, RevisionIndex, Store, + document::{Document, Kind}, +}; +use std::fs; + +#[test] +fn documented_cell_shading_survives_native_2010_ignoring_its_display() { + let bytes = + fs::read("../../corpus/m6/cell-shading-control-01/input/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let colors: Vec<_> = document + .spaces + .values() + .flat_map(|s| s.revisions.values()) + .flat_map(|r| r.nodes.values()) + .filter_map(|n| match n.kind { + Kind::Cell { shading } => shading, + _ => None, + }) + .collect(); + assert_eq!(colors, [0x0000ffff]); +} + +#[test] +fn native_saved_collapse_default_preserves_descendants() { + for (path, expected) in [ + ( + "../../corpus/m6/native-features-01/notebook/Features.one", + 1, + ), + ( + "../../corpus/m6/rust-collapse-control-01/input/notebook/Features.one", + 0, + ), + ] { + let bytes = fs::read(path).unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let mut parents = 0; + for revision in document.spaces.values().flat_map(|s| s.revisions.values()) { + for node in revision.nodes.values() { + if let Kind::Paragraph { collapse_state, .. } = node.kind + && node.content.iter().any(|id| { + matches!(&revision.nodes[id].kind, Kind::RichText { text, .. } if text == "Collapsed parent") + }) + { + assert_eq!(collapse_state, Some(expected)); + assert_eq!(node.children.len(), 1); + assert_eq!(revision.nodes[&node.children[0]].children.len(), 1); + parents += 1; + } + } + } + assert_eq!(parents, 1); + } +} + +#[test] +fn native_math_preserves_run_data_and_distinguishes_plain_text() { + let bytes = fs::read("../../corpus/m6/native-math-01/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let mut equations = 0; + let mut inline = 0; + for revision in document.spaces.values().flat_map(|s| s.revisions.values()) { + for (id, node) in &revision.nodes { + let Kind::RichText { text, runs, .. } = &node.kind else { + continue; + }; + let resolved = revision.text_runs(*id).unwrap(); + if text.contains('\u{fdd0}') { + equations += 1; + assert!(resolved.iter().all(|r| r.format.math == Some(true))); + let expected = if text.contains('𝑥') { + assert_eq!( + text, + "\u{fdd0}𝑥\u{fdee}2\u{fdef}+\u{fdd0}𝑦\u{fdee}2\u{fdef}=\u{fdd0}𝑧\u{fdee}2\u{fdef}" + ); + 11 + } else { + assert_eq!(text, "\u{fdd0}𝑎+𝑏\u{fdee}𝑐+𝑑\u{fdef}"); + 3 + }; + assert_eq!(runs.len(), expected); + for (i, run) in runs.iter().enumerate() { + assert_eq!(run.extra_set, Some(i + 1)); + assert!(!node.extra[run.extra_set.unwrap()].is_empty()); + } + } + if text == "Inline 𝛼+𝛽" { + inline += 1; + assert_eq!(resolved.len(), 2); + assert_eq!(resolved[0].text, "Inline "); + assert_eq!(resolved[0].format.math, Some(false)); + assert_eq!(resolved[1].text, "𝛼+𝛽"); + assert_eq!(resolved[1].format.math, Some(true)); + assert!(runs.iter().all(|r| r.extra_set.is_none())); + } + } + } + assert_eq!((equations, inline), (2, 1)); +} + +#[test] +fn native_origin_control_retains_source_coordinate_frame() { + let bytes = + fs::read("../../corpus/m6/native-origin-controls-01/input/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let (revision, page) = document + .spaces + .values() + .flat_map(|space| space.revisions.values()) + .find_map(|revision| { + revision + .nodes + .values() + .find(|node| matches!(node.kind, Kind::Page { .. })) + .map(|page| (revision, page)) + }) + .unwrap(); + let Kind::Page { + margin_origin_x, + margin_origin_y, + rtl, + .. + } = page.kind + else { + unreachable!() + }; + assert_eq!(margin_origin_x, Some(108.0)); + assert_eq!(margin_origin_y, Some(-36.0)); + assert_ne!(rtl, Some(true)); + let outline = &revision.nodes[&page.children[0]]; + assert_eq!(outline.layout.x, Some(36.0)); + assert!((outline.layout.y.unwrap() - 14.4).abs() < 0.002); +} + +#[test] +fn native_rtl_table_retains_visual_column_order() { + let bytes = + fs::read("../../corpus/m6/native-page-direction-03/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let revision = document + .spaces + .values() + .flat_map(|space| space.revisions.values()) + .find(|revision| { + revision.nodes.values().any(|node| { + matches!( + node.kind, + Kind::Page { + rtl: Some(true), + .. + } + ) + }) + }) + .unwrap(); + let table = revision + .nodes + .values() + .find(|node| matches!(node.kind, Kind::Table { .. })) + .unwrap(); + let Kind::Table { widths, locked, .. } = &table.kind else { + unreachable!() + }; + assert_eq!(widths, &[144.0, 96.0]); + assert_eq!(locked, &[true, true]); + let row = &revision.nodes[&table.children[0]]; + let text: Vec<_> = row + .children + .iter() + .map(|id| { + let paragraph = &revision.nodes[&revision.nodes[id].children[0]]; + revision + .text_runs(paragraph.content[0]) + .unwrap() + .iter() + .map(|run| run.text) + .collect::() + }) + .collect(); + assert_eq!(text, ["Right cell", "Left cell"]); +} + +#[test] +fn native_default_template_has_a_named_page_relationship() { + let bytes = + fs::read("../../corpus/m6/native-template-controls-01/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let root = &document.spaces[&document.root]; + let root = &root.revisions[&root.contexts[&ExGuid::default()]]; + let Kind::Section { + default_template: Some(template), + } = root.nodes[&root.roots[&1]].kind + else { + panic!("Missing default template") + }; + let template = &document.spaces[&template]; + let template = &template.revisions[&template.contexts[&ExGuid::default()]]; + let Kind::TemplateMetadata { name } = &template.nodes[&template.roots[&2]].kind else { + panic!("Missing template metadata") + }; + assert_eq!(name.as_deref(), Some("Hearts")); + let manifest = &template.nodes[&template.roots[&1]]; + assert_eq!(manifest.content.len(), 1); + assert!(matches!( + template.nodes[&manifest.content[0]].kind, + Kind::Page { .. } + )); +} + +#[test] +fn native_paragraph_breaks_preserve_every_stored_character() { + let bytes = + fs::read("../../corpus/m6/native-break-controls-02/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let (revision, outline) = document + .spaces + .values() + .flat_map(|s| s.revisions.values()) + .find_map(|revision| { + revision + .nodes + .values() + .find(|node| matches!(node.kind, Kind::Outline { .. }) && node.children.len() == 24) + .map(|node| (revision, node)) + }) + .unwrap(); + let expected = [ + "A", "A\r", "A\r\r", "\rA", "\rA\r", "\r", "\r\r", "A\rB\r", "A\rB\r", "AB", "A\rB\r", + "A\rB\r", + ]; + for (case, paragraph) in outline.children.iter().enumerate() { + let runs = revision + .text_runs(revision.nodes[paragraph].content[0]) + .unwrap(); + let visible: Vec<_> = runs + .iter() + .filter(|r| r.format.hidden != Some(true)) + .collect(); + assert_eq!( + visible.iter().map(|r| r.text).collect::(), + expected[case % 12], + "case {case}" + ); + for run in visible { + for character in run.text.chars() { + assert_eq!( + run.link.is_some(), + case >= 12 && character != '\r', + "case {case}" + ); + } + } + } +} + +#[test] +fn referenced_history_contexts_require_history_roots() { + let bytes = fs::read("../../corpus/m6/native-features-01/notebook/Features.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let mut index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let (sid, context, current) = document + .spaces + .iter() + .find_map(|(sid, space)| { + let current = space.contexts[&ExGuid::default()]; + let revision = &space.revisions[¤t]; + match revision.nodes[&revision.roots[&1]].kind { + Kind::Manifest { + history: Some(context), + } => Some((*sid, context, current)), + _ => None, + } + }) + .unwrap(); + let space = &document.spaces[&sid]; + let history = &space.revisions[&space.contexts[&context]]; + assert!(matches!( + history.nodes[&history.roots[&1]].kind, + Kind::VersionHistory + )); + assert!(history.nodes[&history.roots[&1]].children.is_empty()); + index + .spaces + .get_mut(&sid) + .unwrap() + .labels + .insert((context, 1), current); + assert_eq!( + Document::parse(&index).unwrap_err().message, + "History context does not resolve to version history" + ); + index + .spaces + .get_mut(&sid) + .unwrap() + .labels + .remove(&(context, 1)); + assert_eq!( + Document::parse(&index).unwrap_err().message, + "Document context has no revision" + ); +} + +#[test] +fn native_hyperlink_boundaries_preserve_whitespace_and_literal_labels() { + let bytes = fs::read("../../corpus/m6/native-link-controls-01/notebook/Links.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let (space, outline) = document + .spaces + .values() + .flat_map(|s| s.revisions.values()) + .find_map(|space| { + space.nodes.values().find_map(|node| { + (matches!(node.kind, Kind::Outline { .. }) && node.children.len() == 10) + .then_some((space, node)) + }) + }) + .unwrap(); + let expected = [ + (" label ", "label "), + ("\tlabel\t", "label\t"), + ("\u{a0}label\u{a0}", "\u{a0}label\u{a0}"), + (" \tlabel \t", "label \t"), + ("label", "label"), + (" ", ""), + ("label", "label"), + (" ]]> end", "]]> end"), + (" & \"quoted\"", " & \"quoted\""), + ("\rlabel\r", "label"), + ]; + for (number, (paragraph, (text, linked))) in outline.children.iter().zip(expected).enumerate() { + let runs = space.text_runs(space.nodes[paragraph].content[0]).unwrap(); + let visible: Vec<_> = runs + .iter() + .filter(|r| r.format.hidden != Some(true)) + .collect(); + assert_eq!(visible.iter().map(|r| r.text).collect::(), text); + assert_eq!( + visible + .iter() + .filter(|r| r.link.is_some()) + .map(|r| r.text) + .collect::(), + linked + ); + let target = format!("https://example.invalid/label/{number}"); + for run in visible { + if let Some(link) = run.link { + assert_eq!(link, target); + } + assert_eq!(run.format.bold, Some(true)); + assert_eq!(run.format.font_size, Some(14.0)); + assert_eq!(run.format.underline, Some(false)); + assert_eq!(run.format.color, Some(0xff000000)); + } + } +} + +#[test] +fn native_unicode_table_assets_and_coordinates_are_typed() { + let bytes = + fs::read("../../corpus/native/20260905-05/snapshots/07-table/notebook/synthetic.one") + .unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let nodes: Vec<_> = document + .spaces + .values() + .flat_map(|s| s.revisions.values()) + .flat_map(|r| r.nodes.values()) + .collect(); + assert!(nodes.iter().any(|n| matches!(&n.kind, Kind::RichText { text, .. } if text == "Fictitious: café, 東京, مرحبا"))); + let table = nodes + .iter() + .find(|n| matches!(n.kind, Kind::Table { .. })) + .unwrap(); + let Kind::Table { + rows, + columns, + widths, + .. + } = &table.kind + else { + unreachable!() + }; + assert_eq!( + (*rows, *columns, table.children.len(), widths.len()), + (Some(1), Some(2), 1, 2) + ); + assert_eq!( + nodes + .iter() + .filter(|n| matches!(n.kind, Kind::Cell { .. })) + .count(), + 2 + ); + assert_eq!( + nodes + .iter() + .filter(|n| matches!(n.kind, Kind::Attachment { .. })) + .count(), + 1 + ); + assert!(nodes.iter().any(|n| matches!(&n.kind, Kind::File { payload: Some(data), .. } if data.starts_with(b"\x89PNG")))); + assert!(nodes.iter().any(|n| matches!(n.kind, Kind::Outline { .. }) + && n.layout.x == Some(144.0) + && n.layout.y == Some(96.0))); + for node in nodes { + if let Kind::RichText { text, runs, .. } = &node.kind { + assert_eq!(runs.first().unwrap().start, 0); + assert_eq!( + runs.last().unwrap().end as usize, + text.encode_utf16().count() + ); + } + } +} + +#[test] +fn encrypted_content_is_accounted_without_fabricated_plaintext() { + let bytes = + fs::read("../../corpus/native-encrypted/encrypted-01/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + assert!(!document.spaces.is_empty()); + let nodes: Vec<_> = document + .spaces + .values() + .flat_map(|s| s.revisions.values()) + .flat_map(|r| r.nodes.values()) + .collect(); + assert!(!nodes.is_empty()); + for node in nodes { + assert!(matches!(node.kind, Kind::Encrypted { ciphertext } if !ciphertext.is_empty())); + } +} + +#[test] +fn rust_unicode_and_native_latin1_use_utf16_run_offsets() { + let text = "A😀e\u{301}東京"; + let bytes = onestore::create_section("unicode.one", text, "Fictitious").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let node = document + .spaces + .values() + .flat_map(|s| s.revisions.values()) + .flat_map(|r| r.nodes.values()) + .find(|n| matches!(n.kind, Kind::RichText { .. })) + .unwrap(); + let Kind::RichText { + text: actual, runs, .. + } = &node.kind + else { + unreachable!() + }; + assert_eq!(actual, text); + assert_eq!(runs[0].end, 7); + let bytes = fs::read("../../corpus/m6/ansi/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let expected = format!( + "Extended bytes: {}", + (128u8..=255) + .map(|b| char::from(b).to_string()) + .collect::>() + .join(" ") + ); + assert!( + document + .spaces + .values() + .flat_map(|s| s.revisions.values()) + .flat_map(|r| r.nodes.values()) + .any(|n| matches!(&n.kind, Kind::RichText { text, .. } if text == &expected)) + ); +} + +#[test] +fn toc_preserves_section_order_and_filename() { + let bytes = onestore::create_table_of_contents( + "Open Notebook.onetoc2", + &[("z.one", [1; 16]), ("a.one", [2; 16])], + ) + .unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let space = &document.spaces[&document.root]; + let space = &space.revisions[&space.contexts[&ExGuid::default()]]; + let root = &space.nodes[&space.roots[&1]]; + let Kind::Toc { entries, .. } = &root.kind else { + panic!("Missing TOC") + }; + let names: Vec<_> = entries + .iter() + .map(|id| match &space.nodes[id].kind { + Kind::Toc { filename, .. } => filename.as_deref().unwrap(), + _ => panic!("Missing TOC entry"), + }) + .collect(); + assert_eq!(names, ["z.one", "a.one"]); + assert_ne!(document.root, ExGuid::default()); +} + +#[test] +fn native_printouts_tasks_and_recording_associations_are_typed() { + let bytes = fs::read("../../corpus/m6/native-features-01/notebook/Features.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let mut roles = Vec::new(); + let mut task = false; + let mut recording = false; + let mut annotation = false; + let mut decimal = false; + let mut inherited_strike = false; + let media = [ + 0x57, 0x8e, 0x41, 0x9a, 0x64, 0x7f, 0xc5, 0x40, 0x87, 0xd0, 0x8a, 0x8f, 0x7c, 0x1e, 0x54, + 0x22, + ]; + for space in document.spaces.values().flat_map(|s| s.revisions.values()) { + for (oid, node) in &space.nodes { + match &node.kind { + Kind::Image { + alt, + background, + printout, + .. + } if alt.as_deref() == Some("Role pattern") => { + let border = if *printout == Some(true) { 1.44 } else { 0.0 }; + assert!((node.layout.max_width.unwrap() + border - 288.0).abs() < 0.002); + assert!((node.layout.max_height.unwrap() + border - 192.0).abs() < 0.002); + roles.push((*background, *printout)); + } + Kind::Attachment { + filename, + recording_id, + .. + } if filename.as_deref() == Some("silence.wav") => { + assert_eq!(*recording_id, Some(media)); + recording = true; + } + Kind::RichText { text, .. } if text == "Recording annotation" => { + assert_eq!(node.media_ids, [media]); + assert_eq!(node.media_time_ms, Some(500)); + annotation = true; + } + Kind::RichText { text, .. } if text == "Disabled standalone task" => { + assert_eq!(node.tags.len(), 1); + let tag = &node.tags[0]; + assert_eq!( + (tag.definition, tag.action_type, tag.status), + (None, Some(100), 6) + ); + assert_eq!((tag.start, tag.due), (Some(1262390400), Some(1262476800))); + assert_eq!(tag.completed, Some(0)); + assert_eq!(tag.task_id.unwrap()[..4], [0xe3, 0x40, 0xaf, 0x45]); + task = true; + } + Kind::RichText { text, .. } if text == "Inherited strike and spacing" => { + let runs = space.text_runs(*oid).unwrap(); + assert_eq!(runs[0].format.strike, Some(true)); + assert_eq!(runs[0].format.space_before, Some(9.0)); + assert_eq!(runs[0].format.space_after, Some(4.5)); + inherited_strike = true; + } + Kind::List { format, .. } if format.as_deref() == Some("\u{fffd}\0") => { + decimal = true; + } + _ => {} + } + } + } + roles.sort(); + assert_eq!( + roles, + [ + (Some(false), Some(false)), + (Some(false), Some(true)), + (Some(true), Some(false)), + (Some(true), Some(true)) + ] + ); + assert!(task && recording && annotation && decimal && inherited_strike); +} + +#[test] +fn native_partial_black_highlight_and_inline_hyperlink_fields_survive() { + let bytes = fs::read("../../corpus/m6/native-probes-01/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let mut black = false; + let mut link = false; + for space in document.spaces.values().flat_map(|s| s.revisions.values()) { + for (oid, node) in &space.nodes { + if let Kind::RichText { text, runs, .. } = &node.kind { + if text == "Before middle after" { + let highlighted: Vec<_> = runs + .iter() + .filter(|run| { + run.format + .is_some_and(|id| space.nodes[&id].format.highlight == Some(0)) + }) + .collect(); + assert_eq!(highlighted.len(), 1); + assert_eq!((highlighted[0].start, highlighted[0].end), (7, 13)); + black = true; + } + if text.starts_with("Before \u{fddf}HYPERLINK") { + let units: Vec<_> = text.encode_utf16().collect(); + let mut visible = String::new(); + let mut hidden = String::new(); + for run in runs { + let fragment = + String::from_utf16(&units[run.start as usize..run.end as usize]) + .unwrap(); + if run + .format + .is_some_and(|id| space.nodes[&id].format.hidden == Some(true)) + { + hidden.push_str(&fragment); + } else { + visible.push_str(&fragment); + } + } + assert_eq!(visible, "Before Link label after"); + let resolved = space.text_runs(*oid).unwrap(); + let links: Vec<_> = resolved + .iter() + .filter_map(|r| r.link.map(|url| (r.text, url, r.format.bold))) + .collect(); + assert_eq!( + links, + [( + "Link label", + "https://example.invalid/fixture?x=1&y=2", + Some(true) + )] + ); + assert_eq!( + resolved + .iter() + .filter(|r| r.format.hidden != Some(true)) + .map(|r| r.text) + .collect::(), + visible + ); + assert_eq!( + hidden, + "\u{fddf}HYPERLINK \"https://example.invalid/fixture?x=1&y=2\"" + ); + link = true; + } + } + } + } + assert!(black && link); +} + +#[test] +fn malformed_run_boundaries_fail_after_valid_storage_decoding() { + let bytes = fs::read("../../corpus/m6/native-probes-01/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let (sid, rid, oid) = document + .spaces + .iter() + .find_map(|(sid, space)| { + space.revisions.iter().find_map(|(rid, revision)| { + revision.nodes.iter().find_map(|(oid, node)| { + matches!(&node.kind, Kind::RichText { text, .. } if text.starts_with("BMP ")) + .then_some((*sid, *rid, *oid)) + }) + }) + }) + .unwrap(); + let revision = index.resolve(sid, rid).unwrap(); + let onestore::ObjectData::Properties(properties) = revision.objects[&oid].data else { + unreachable!() + }; + let properties = onestore::PropertySets::parse(properties).unwrap(); + let onestore::Value::Bytes(boundaries) = properties.sets[0] + .iter() + .find(|p| p.id == 0x1c001e12) + .unwrap() + .value + else { + unreachable!() + }; + for invalid in [5u32, u32::MAX] { + let mut changed = boundaries.to_vec(); + changed[..4].copy_from_slice(&invalid.to_le_bytes()); + let mutated = + onestore::replace_property_bytes(&bytes, sid, oid, 0x1c001e12, &changed).unwrap(); + let store = Store::parse(&mutated).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + let error = Document::parse(&index).unwrap_err(); + assert_eq!( + error.message, + if invalid == 5 { + "Text-run boundary splits a surrogate pair" + } else { + "Text-run indices exceed text or are out of order" + } + ); + } +} + +#[test] +fn native_lists_locked_columns_and_named_styles_are_preserved() { + let bytes = fs::read("../../corpus/m6/native-structure-01/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let mut found = (false, false, false); + for space in document.spaces.values().flat_map(|s| s.revisions.values()) { + for (oid, node) in &space.nodes { + match &node.kind { + Kind::Table { + rows, + columns, + locked, + widths, + .. + } => { + assert_eq!((*rows, *columns), (Some(3), Some(2))); + assert_eq!(locked, &[true, false]); + assert_eq!(widths[0], 120.0); + assert!(widths[1] > 37.0 && widths[1] < 38.0); + found.0 = true; + } + Kind::List { + format, + restart: Some(3), + bullet, + .. + } => { + assert_eq!(format.as_deref(), Some("\u{fffd}\u{1}.")); + assert_eq!(*bullet, None); + found.1 = true; + } + Kind::RichText { text, .. } if text == "Named paragraph style" => { + let runs = space.text_runs(*oid).unwrap(); + assert_eq!(runs[0].format.bold, Some(true)); + assert_eq!(runs[0].format.font_size, Some(20.0)); + assert_eq!(runs[0].format.space_before, Some(288.0)); + assert_eq!(runs[0].format.space_after, Some(144.0)); + assert_eq!(runs[0].format.alignment, Some(2)); + found.2 = true; + } + _ => {} + } + } + } + assert_eq!(found, (true, true, true)); + let (revision, outer) = document + .spaces + .values() + .flat_map(|s| s.revisions.values()) + .find_map(|revision| { + revision + .nodes + .values() + .find(|node| { + matches!(node.kind, Kind::Paragraph { .. }) && !node.children.is_empty() + }) + .map(|node| (revision, node)) + }) + .unwrap(); + assert_eq!(outer.child_level, Some(1)); + assert_eq!( + revision.text_runs(outer.content[0]).unwrap()[0].text, + "Outer bullet" + ); + assert_eq!(outer.children.len(), 1); + let nested = &revision.nodes[&outer.children[0]]; + assert_eq!( + revision.text_runs(nested.content[0]).unwrap()[0].text, + "Nested bullet" + ); +} + +#[test] +fn native_conflict_relationship_and_opaque_ink_are_retained() { + let bytes = + fs::read("../../corpus/collaboration/round-01/offline/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let (conflict_id, conflict) = document + .spaces + .iter() + .find_map(|(sid, space)| { + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + revision.roots.get(&2).and_then(|root| { + matches!(revision.nodes[root].kind, Kind::ConflictMetadata { .. }) + .then_some((sid, revision)) + }) + }) + .unwrap(); + let Kind::ConflictMetadata { + title, + author, + level, + } = &conflict.nodes[&conflict.roots[&2]].kind + else { + unreachable!() + }; + assert_eq!(title.as_deref(), Some("Native edited while disconnected.")); + assert_eq!(author.as_deref(), Some("snow")); + assert_eq!(*level, Some(1)); + assert!( + document + .spaces + .iter() + .any(|(sid, space)| sid != conflict_id && { + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + revision.nodes[&revision.roots[&1]] + .spaces + .contains(conflict_id) + }) + ); + let bytes = fs::read("../../corpus/native-ink/cold-ui-ink/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let ink: Vec<_> = document + .spaces + .values() + .flat_map(|s| s.revisions.values()) + .flat_map(|r| r.nodes.values()) + .filter(|node| matches!(node.kind, Kind::Ink)) + .collect(); + assert_eq!(ink.len(), 2); + assert!( + ink.iter() + .all(|node| node.extra.iter().any(|set| !set.is_empty())) + ); +} diff --git a/crates/onestore/tests/edit.rs b/crates/onestore/tests/edit.rs new file mode 100644 index 0000000000000000000000000000000000000000..c44d32de2396a1d69c504a415ef7d950b07da855 --- /dev/null +++ b/crates/onestore/tests/edit.rs @@ -0,0 +1,627 @@ +#[path = "support/checkpoint.rs"] +mod checkpoint; +#[path = "support/disk.rs"] +mod disk; + +use disk::Disk; +use onestore::{ + CommitState, ExGuid, RevisionIndex, Store, + document::{Document, Kind}, +}; + +const SOURCE: &[u8] = include_bytes!( + "../../../corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one" +); + +fn target(source: &[u8]) -> (ExGuid, ExGuid) { + let store = Store::parse(source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + for (sid, space) in &document.spaces { + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + for (oid, node) in &revision.nodes { + if matches!(&node.kind, Kind::RichText { text, .. } if text.starts_with("Fictitious:")) + { + return (*sid, *oid); + } + } + } + panic!("Missing native text fixture") +} + +fn text_runs(source: &[u8], sid: ExGuid, oid: ExGuid) -> serde_json::Value { + let store = Store::parse(source).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + let document = Document::parse(&index).unwrap(); + let space = &document.spaces[&sid]; + serde_json::to_value( + space.revisions[&space.contexts[&ExGuid::default()]] + .text_runs(oid) + .unwrap(), + ) + .unwrap() +} + +fn assert_other_objects_preserved( + before: &onestore::ResolvedRevision<'_>, + after: &onestore::ResolvedRevision<'_>, + edited: ExGuid, +) { + use onestore::{ObjectData, PropertySets}; + let ObjectData::Properties(bytes) = after.objects[&edited].data else { + panic!() + }; + let target = PropertySets::parse(bytes).unwrap(); + let modified = &target.sets[0] + .iter() + .find(|field| field.id == 0x14001d7a) + .unwrap() + .value; + let reachable = before.reachable().unwrap(); + assert_eq!(before.objects.len(), after.objects.len()); + for (id, object) in &before.objects { + if *id == edited { + continue; + } + let current = &after.objects[id]; + assert_eq!(object.jcid, current.jcid); + assert_eq!(object.global_ids, current.global_ids); + let mut pending = vec![*id]; + let mut visited = std::collections::BTreeSet::new(); + while let Some(next) = pending.pop() { + if !visited.insert(next) { + continue; + } + pending.extend(before.objects[&next].references().unwrap().objects); + } + let ancestor = reachable.contains(id) && visited.contains(&edited); + let mut allowed = Vec::new(); + if ancestor { + allowed.push(0x14001d7a); + } + if ancestor && object.jcid == 0x6000b { + allowed.push(0x1c001d3c); + } + if before.roots.get(&2) == Some(id) { + allowed.push(0x1c001cf3); + } + if allowed.is_empty() { + assert_eq!(object.data, current.data); + continue; + } + let [old, new] = [object.data, current.data].map(|data| { + let ObjectData::Properties(bytes) = data else { + panic!() + }; + PropertySets::parse(bytes).unwrap() + }); + if ancestor { + let old_time = old.sets[0].iter().find(|field| field.id == 0x14001d7a); + let new_time = new.sets[0].iter().find(|field| field.id == 0x14001d7a); + assert_eq!(old_time.is_some(), new_time.is_some()); + if let Some(time) = new_time { + assert_eq!(&time.value, modified); + } + } + let [old, new] = [old, new].map(|mut fields| { + fields.sets[0].retain(|field| !allowed.contains(&field.id)); + fields.sets + }); + assert_eq!(old, new); + } +} + +#[test] +fn text_splices_preserve_formats_objects_and_history_in_one_transaction() { + let (sid, oid) = target(SOURCE); + let old = Store::parse(SOURCE).unwrap(); + let old_index = RevisionIndex::parse(&old).unwrap(); + let before = text_runs(SOURCE, sid, oid); + for replacement in ["", "🦀", "A longer replacement with 日本語 and e\u{301}"] { + let edited = onestore::replace_text(SOURCE, sid, oid, 0..10, replacement).unwrap(); + let store = Store::parse(&edited).unwrap(); + assert_eq!( + store.header.transaction_count, + old.header.transaction_count + 1 + ); + let index = RevisionIndex::parse(&store).unwrap(); + for (space_id, space) in &old_index.spaces { + for rid in space.revisions.keys() { + let previous = old_index.resolve(*space_id, *rid).unwrap(); + let preserved = index.resolve(*space_id, *rid).unwrap(); + assert_eq!(previous.roots, preserved.roots); + for (id, object) in previous.objects { + assert_eq!(object.data, preserved.objects[&id].data); + } + } + let previous = old_index + .resolve(*space_id, space.labels[&(ExGuid::default(), 1)]) + .unwrap(); + let current = index + .resolve( + *space_id, + index.spaces[space_id].labels[&(ExGuid::default(), 1)], + ) + .unwrap(); + assert_eq!(previous.objects.len(), current.objects.len()); + if *space_id == sid { + assert_other_objects_preserved(&previous, ¤t, oid); + } else { + for (id, object) in previous.objects { + assert_eq!(object.data, current.objects[&id].data); + } + } + } + let mut expected = before.clone(); + expected[0]["text"] = format!( + "{replacement}{}", + &before[0]["text"].as_str().unwrap()[10..] + ) + .into(); + assert_eq!(text_runs(&edited, sid, oid), expected); + } +} + +#[test] +fn invalid_text_edits_never_touch_storage() { + let (sid, oid) = target(SOURCE); + let source = onestore::replace_text(SOURCE, sid, oid, 0..0, "🦀").unwrap(); + for (range, replacement) in [ + (1..1, "x"), + (0..999, "x"), + (0..21, "x"), + (0..0, "\n"), + (0..0, "\0"), + ] { + let mut disk = Disk { + visible: source.clone(), + durable: source.clone(), + operation: 0, + fail_at: None, + write_limit: 1024, + random: 1, + }; + let error = + onestore::commit_text(&mut disk, &source, sid, oid, range, replacement).unwrap_err(); + assert_eq!(error.state, CommitState::NotCommitted); + assert_eq!(disk.operation, 0); + assert_eq!(disk.durable, source); + } +} + +#[test] +fn insertion_at_a_style_boundary_uses_the_following_style() { + let (sid, oid) = target(SOURCE); + let before = text_runs(SOURCE, sid, oid); + let edited = onestore::replace_text(SOURCE, sid, oid, 18..18, "🦀").unwrap(); + let mut expected = before.clone(); + expected[1]["text"] = format!("🦀{}", before[1]["text"].as_str().unwrap()).into(); + assert_eq!(text_runs(&edited, sid, oid), expected); +} + +#[test] +fn automatic_titles_follow_native_line_and_utf16_limits() { + for (text, expected) in [ + ( + " first\tline \rsecond".to_string(), + "first\tline".to_string(), + ), + ("A".repeat(500), "A".repeat(255)), + ( + format!("{}🦀after", "A".repeat(254)), + format!("{}🦀", "A".repeat(254)), + ), + (" \t ".to_string(), "".to_string()), + ] { + let source = onestore::create_section("title.one", &text, "Title fixture").unwrap(); + let check = |bytes: &[u8], expected: &str| { + let store = Store::parse(bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let (sid, page) = document.pages().unwrap()[0]; + let space = &document.spaces[&sid]; + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + let Kind::Metadata { title, .. } = &revision.nodes[&revision.roots[&2]].kind else { + panic!() + }; + let Kind::Page { + alternate_title, .. + } = &revision.nodes[&page].kind + else { + panic!() + }; + assert_eq!(title.as_deref(), Some(expected)); + assert_eq!(alternate_title.as_deref(), Some(expected)); + let (oid, _) = revision + .nodes + .iter() + .find(|(_, n)| matches!(n.kind, Kind::RichText { .. })) + .unwrap(); + (sid, *oid) + }; + let (sid, oid) = check(&source, &expected); + let cleared = + onestore::replace_text(&source, sid, oid, 0..text.encode_utf16().count() as u32, "") + .unwrap(); + check(&cleared, ""); + let written = onestore::replace_text(&cleared, sid, oid, 0..0, " new 🦀 name ").unwrap(); + check(&written, "new 🦀 name"); + } +} + +#[test] +fn automatic_titles_follow_native_rtl_and_attachment_order() { + let mut checked = 0; + for path in [ + "../../corpus/m7/automatic-titles/rtl-and-attachments.one", + "../../corpus/m7/automatic-titles/widths-and-limits.one", + ] { + let source = std::fs::read(path).unwrap(); + let store = Store::parse(&source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + for (sid, page) in document.pages().unwrap() { + let space = &document.spaces[&sid]; + let rid = space.contexts[&ExGuid::default()]; + let revision = &space.revisions[&rid]; + let Kind::Page { rtl, .. } = &revision.nodes[&page].kind else { + panic!() + }; + if *rtl != Some(true) + && !revision + .nodes + .values() + .any(|n| matches!(n.kind, Kind::Attachment { .. })) + { + continue; + } + let Kind::Metadata { + title: Some(title), .. + } = &revision.nodes[&revision.roots[&2]].kind + else { + panic!() + }; + let original = index.resolve(sid, rid).unwrap(); + for (oid, node) in &revision.nodes { + let Kind::RichText { + text, + boilerplate: false, + .. + } = &node.kind + else { + continue; + }; + if node.extra[0].iter().any(|field| field.id == 0x88001cb4) { + continue; + } + let changed = onestore::replace_text(&source, sid, *oid, 0..0, "Edited ").unwrap(); + let store = Store::parse(&changed).unwrap(); + let current = RevisionIndex::parse(&store).unwrap(); + let after = Document::parse(¤t).unwrap(); + let space = &after.spaces[&sid]; + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + let Kind::Metadata { + title: Some(actual), + .. + } = &revision.nodes[&revision.roots[&2]].kind + else { + panic!() + }; + let expected = if text == title { + format!("Edited {title}") + } else { + title.clone() + }; + assert_eq!(actual, &expected); + let active = current + .resolve(sid, current.spaces[&sid].labels[&(ExGuid::default(), 1)]) + .unwrap(); + assert_other_objects_preserved(&original, &active, *oid); + checked += 1; + } + } + } + assert_eq!(checked, 10); +} + +#[test] +fn an_emptied_final_run_retains_its_insertion_style() { + let (sid, oid) = target(SOURCE); + let before = text_runs(SOURCE, sid, oid); + let erased = onestore::replace_text(SOURCE, sid, oid, 22..27, "").unwrap(); + let edited = onestore::replace_text(&erased, sid, oid, 22..22, "a").unwrap(); + let mut expected = before.clone(); + expected[3]["text"] = "a".into(); + assert_eq!(text_runs(&edited, sid, oid), expected); +} + +#[test] +fn title_text_and_navigation_caches_publish_together() { + let source = + std::fs::read("../../corpus/m6/native-structure-01/notebook/synthetic.one").unwrap(); + let store = Store::parse(&source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let (sid, page) = document + .pages() + .unwrap() + .into_iter() + .find(|(sid, _)| { + let space = &document.spaces[sid]; + space.revisions[&space.contexts[&ExGuid::default()]] + .nodes + .values() + .any(|node| { + matches!(node.kind, Kind::RichText { .. }) + && node.extra[0].iter().any(|field| field.id == 0x88001cb4) + }) + }) + .unwrap(); + let rid = document.spaces[&sid].contexts[&ExGuid::default()]; + let revision = &document.spaces[&sid].revisions[&rid]; + let metadata = revision.roots[&2]; + let (oid, node) = revision + .nodes + .iter() + .find(|(_, node)| { + matches!(node.kind, Kind::RichText { .. }) + && node.extra[0].iter().any(|field| field.id == 0x88001cb4) + }) + .unwrap(); + let Kind::RichText { text, runs, .. } = &node.kind else { + panic!() + }; + assert_eq!(runs.len(), 1); + let end = text.encode_utf16().count() as u32; + let state = |bytes: &[u8]| { + let store = Store::parse(bytes).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + let document = Document::parse(&index).unwrap(); + let space = &document.spaces[&sid]; + let current = &space.revisions[&space.contexts[&ExGuid::default()]]; + serde_json::json!([ + ¤t.nodes[oid].kind, + ¤t.nodes[&metadata].kind, + ¤t.nodes[&page].kind, + current + .nodes + .iter() + .map(|(id, node)| (*id, node.modified)) + .collect::>(), + ]) + }; + let checkpoint = checkpoint::pending(&source, sid, *oid, 0x14001d7a); + for (source, write_limit) in [(source.as_slice(), 17), (checkpoint.as_slice(), 257)] { + let before = state(source); + for replacement in ["Renamed 🦀 日本語", ""] { + let disk = |fail_at| Disk { + visible: source.to_vec(), + durable: source.to_vec(), + operation: 0, + fail_at, + write_limit, + random: 42, + }; + let mut success = disk(None); + onestore::commit_text(&mut success, source, sid, *oid, 0..end, replacement).unwrap(); + let after = state(&success.durable); + assert_eq!(after[0]["text"], replacement); + assert_eq!( + after[1]["title"], + if replacement.is_empty() { + "Black highlight, automatic text" + } else { + replacement + } + ); + assert_eq!( + after[2]["alternate_title"], + if replacement.is_empty() { + serde_json::json!("Black highlight, automatic text") + } else { + serde_json::json!("") + } + ); + let written = Store::parse(&success.durable).unwrap(); + assert_eq!( + written.header.transaction_count, + Store::parse(source).unwrap().header.transaction_count + 1 + ); + let updated = RevisionIndex::parse(&written).unwrap(); + let old = index.resolve(sid, rid).unwrap(); + let current = updated + .resolve(sid, updated.spaces[&sid].labels[&(ExGuid::default(), 1)]) + .unwrap(); + for (id, object) in &old.objects { + assert_eq!( + object.data, + updated.resolve(sid, rid).unwrap().objects[id].data + ); + } + assert_other_objects_preserved(&old, ¤t, *oid); + for at in source.len().div_ceil(193)..=success.operation { + let mut interrupted = disk(Some(at)); + let error = + onestore::commit_text(&mut interrupted, source, sid, *oid, 0..end, replacement) + .unwrap_err(); + let observed = state(&interrupted.durable); + match error.state { + CommitState::NotCommitted => assert_eq!(observed, before), + CommitState::Committed => assert_eq!(observed, after), + CommitState::Unknown => assert!(observed == before || observed == after), + } + } + } + } +} + +#[test] +fn native_conflict_pages_are_readable_but_not_random_edit_targets() { + let source = + std::fs::read("../../corpus/m6/live-collaboration-15/vm-restarted/notebook/synthetic.one") + .unwrap(); + let store = Store::parse(&source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let pages = document.pages().unwrap(); + assert_eq!(pages.len(), 1); + let main = &document.spaces[&pages[0].0]; + let main = &main.revisions[&main.contexts[&ExGuid::default()]]; + let conflict_spaces = &main.nodes[&main.roots[&1]].spaces; + assert_eq!(conflict_spaces.len(), 1); + let mut conflicts = 0; + for sid in conflict_spaces { + assert!(pages.iter().all(|(page_space, _)| page_space != sid)); + let space = &document.spaces[sid]; + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + for (oid, node) in &revision.nodes { + if !matches!(node.kind, Kind::RichText { .. }) { + continue; + } + assert!(onestore::replace_text(&source, *sid, *oid, 0..0, "edit").is_err()); + conflicts += 1; + } + } + assert!(conflicts > 0); +} + +#[test] +fn interrupted_text_commits_never_publish_mismatched_run_boundaries() { + let (sid, oid) = target(SOURCE); + let checkpoint = checkpoint::pending(SOURCE, sid, oid, 0x14001d7a); + for source in [SOURCE, checkpoint.as_slice()] { + let make_disk = |fail_at, random| Disk { + visible: source.to_vec(), + durable: source.to_vec(), + operation: 0, + fail_at, + write_limit: usize::MAX, + random, + }; + let before = text_runs(source, sid, oid); + let mut success = make_disk(None, 1); + onestore::commit_text(&mut success, source, sid, oid, 0..10, "🐈 mixed edit").unwrap(); + let after = text_runs(&success.durable, sid, oid); + assert_ne!(before, after); + for at in source.len().div_ceil(193)..=success.operation { + for seed in [1, 42] { + let mut disk = make_disk(Some(at), seed); + let error = + onestore::commit_text(&mut disk, source, sid, oid, 0..10, "🐈 mixed edit") + .unwrap_err(); + let observed = text_runs(&disk.durable, sid, oid); + match error.state { + CommitState::NotCommitted => assert_eq!(observed, before), + CommitState::Committed => assert_eq!(observed, after), + CommitState::Unknown => assert!(observed == before || observed == after), + } + } + } + } +} + +#[test] +fn empty_and_legacy_native_text_gain_unicode_without_losing_existing_properties() { + use onestore::{ObjectData, PropertySets, Value}; + for (path, original) in [ + ( + "../../corpus/m6/native-empty-link-01/notebook/synthetic.one", + "", + ), + ( + "../../corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one", + "Fictitious plain text.", + ), + ] { + let source = std::fs::read(path).unwrap(); + let store = Store::parse(&source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + let mut targets = Vec::new(); + for (sid, space) in &document.spaces { + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + for (oid, node) in &revision.nodes { + if matches!(&node.kind, Kind::RichText { text, boilerplate: false, .. } if text == original) + { + targets.push((*sid, *oid)); + } + } + } + assert_eq!(targets.len(), 1); + let (sid, oid) = targets[0]; + let old_rid = index.spaces[&sid].labels[&(ExGuid::default(), 1)]; + let old = index.resolve(sid, old_rid).unwrap(); + let ObjectData::Properties(blob) = old.objects[&oid].data else { + panic!() + }; + let properties = PropertySets::parse(blob).unwrap(); + assert!(!properties.sets[0].iter().any(|p| p.id == 0x1c001c22)); + let expected = format!("🦀 café {original}"); + let written = onestore::replace_text(&source, sid, oid, 0..0, "🦀 café ").unwrap(); + let after_store = Store::parse(&written).unwrap(); + assert!(after_store.checksum_mismatches.is_empty()); + let after = RevisionIndex::parse(&after_store).unwrap(); + after.validate_current().unwrap(); + let current = after + .resolve(sid, after.spaces[&sid].labels[&(ExGuid::default(), 1)]) + .unwrap(); + let ObjectData::Properties(blob) = current.objects[&oid].data else { + panic!() + }; + let updated = PropertySets::parse(blob).unwrap(); + assert_eq!(updated.sets[0].len(), properties.sets[0].len() + 1); + for property in &properties.sets[0] { + if property.id != 0x14001d7a { + assert!(updated.sets[0].iter().any(|p| p == property)); + } + } + let encoded: Vec<_> = expected + .encode_utf16() + .chain([0]) + .flat_map(u16::to_le_bytes) + .collect(); + assert!( + updated.sets[0] + .iter() + .any(|p| p.id == 0x1c001c22 && p.value == Value::Bytes(&encoded)) + ); + assert_eq!( + after.resolve(sid, old_rid).unwrap().objects[&oid].data, + old.objects[&oid].data + ); + assert_other_objects_preserved(&old, ¤t, oid); + let before = text_runs(&source, sid, oid); + let observed = text_runs(&written, sid, oid); + let mut intended = before.clone(); + intended[0]["text"] = expected.into(); + assert_eq!(observed, intended); + let disk = |fail_at, random| Disk { + visible: source.clone(), + durable: source.clone(), + operation: 0, + fail_at, + write_limit: 17, + random, + }; + let mut success = disk(None, 1); + onestore::commit_text(&mut success, &source, sid, oid, 0..0, "🦀 café ").unwrap(); + for at in source.len().div_ceil(193)..=success.operation { + for seed in [1, 42] { + let mut interrupted = disk(Some(at), seed); + let error = + onestore::commit_text(&mut interrupted, &source, sid, oid, 0..0, "🦀 café ") + .unwrap_err(); + let actual = text_runs(&interrupted.durable, sid, oid); + match error.state { + CommitState::NotCommitted => assert_eq!(actual, before), + CommitState::Committed => assert_eq!(actual, observed), + CommitState::Unknown => assert!(actual == before || actual == observed), + } + } + } + } +} diff --git a/crates/onestore/tests/fuzz_seeds.rs b/crates/onestore/tests/fuzz_seeds.rs new file mode 100644 index 0000000000000000000000000000000000000000..781bb1e8366f280cf2c3321224d89404e33c3317 --- /dev/null +++ b/crates/onestore/tests/fuzz_seeds.rs @@ -0,0 +1,25 @@ +use onestore::{Reference, Store}; +use std::{collections::BTreeSet, fs}; + +#[test] +#[ignore = "Generates the local fuzz corpus"] +fn seed_property_fuzzer() { + let bytes = + fs::read("../../corpus/native/20260905-05/snapshots/07-table/notebook/synthetic.one") + .unwrap(); + let store = Store::parse(&bytes).unwrap(); + let mut seeds = BTreeSet::new(); + for node in store.lists.values().flat_map(|list| &list.nodes) { + if matches!(node.id, 0xa4 | 0xa5 | 0xc4 | 0xc5) + && let Some(Reference::Data(chunk)) = node.reference + { + let start = usize::try_from(chunk.offset).unwrap(); + let end = start + usize::try_from(chunk.length).unwrap(); + seeds.insert(&bytes[start..end]); + } + } + fs::create_dir_all("../../fuzz/corpus/properties").unwrap(); + for (index, seed) in seeds.iter().enumerate() { + fs::write(format!("../../fuzz/corpus/properties/native-{index}"), seed).unwrap(); + } +} diff --git a/crates/onestore/tests/properties.rs b/crates/onestore/tests/properties.rs new file mode 100644 index 0000000000000000000000000000000000000000..426c24003d8d658bb5b3313ff44d9969bcc7b76e --- /dev/null +++ b/crates/onestore/tests/properties.rs @@ -0,0 +1,99 @@ +use onestore::{IdStream, PropertySets, Reference, Store, Value}; +use std::fs; + +#[test] +fn native_property_chunks_preserve_unicode_and_ascii_text() { + let bytes = + fs::read("../../corpus/native/20260905-05/snapshots/07-table/notebook/synthetic.one") + .unwrap(); + let store = Store::parse(&bytes).unwrap(); + let mut strings = Vec::new(); + for node in store.lists.values().flat_map(|list| &list.nodes) { + if matches!(node.id, 0xa4 | 0xa5 | 0xc4 | 0xc5) + && let Some(Reference::Data(chunk)) = node.reference + { + let start = usize::try_from(chunk.offset).unwrap(); + let end = start + usize::try_from(chunk.length).unwrap(); + let object = PropertySets::parse(&bytes[start..end]).unwrap(); + for property in object.sets.iter().flatten() { + if let Value::Bytes(data) = property.value { + if property.id == 0x1c001c22 { + let text = String::from_utf16( + &data + .chunks_exact(2) + .map(|pair| u16::from_le_bytes([pair[0], pair[1]])) + .collect::>(), + ) + .unwrap(); + assert!(text.ends_with('\0')); + strings.push(text.trim_end_matches('\0').to_owned()); + } else if property.id == 0x1c003498 && data.is_ascii() { + strings.push(String::from_utf8(data.to_vec()).unwrap()); + } + } + } + } + } + for expected in [ + "Fictitious: café, 東京, مرحبا", + "Fictitious positioned outline.", + "Left cell", + "Right cell", + ] { + assert!( + strings.iter().any(|text| text == expected), + "{expected}: {strings:?}" + ); + } +} + +#[test] +fn property_nesting_does_not_use_the_call_stack() { + let mut bytes = 0x80000000_u32.to_le_bytes().to_vec(); + for _ in 0..100_000 { + bytes.extend_from_slice(&1_u16.to_le_bytes()); + bytes.extend_from_slice(&0x44000001_u32.to_le_bytes()); + } + bytes.extend_from_slice(&0_u16.to_le_bytes()); + let properties = PropertySets::parse(&bytes).unwrap(); + assert_eq!(properties.sets.len(), 100_001); + drop(properties); +} + +#[test] +fn nested_sets_consume_reference_streams_in_property_order() { + let mut bytes = 0x80000002_u32.to_le_bytes().to_vec(); + bytes.extend_from_slice(&0x101_u32.to_le_bytes()); + bytes.extend_from_slice(&0x202_u32.to_le_bytes()); + bytes.extend_from_slice(&2_u16.to_le_bytes()); + bytes.extend_from_slice(&0x44000001_u32.to_le_bytes()); + bytes.extend_from_slice(&0x20000002_u32.to_le_bytes()); + bytes.extend_from_slice(&1_u16.to_le_bytes()); + bytes.extend_from_slice(&0x20000003_u32.to_le_bytes()); + let properties = PropertySets::parse(&bytes).unwrap(); + assert_eq!(properties.sets[0][0].value, Value::Sets(1..2)); + assert_eq!( + properties.sets[1][0].value, + Value::References { + stream: IdStream::Objects, + compact_ids: &0x101_u32.to_le_bytes() + } + ); + assert_eq!( + properties.sets[0][1].value, + Value::References { + stream: IdStream::Objects, + compact_ids: &0x202_u32.to_le_bytes() + } + ); +} + +#[test] +fn impossible_nested_array_sizes_are_rejected_before_allocation() { + let mut bytes = 0x80000000_u32.to_le_bytes().to_vec(); + bytes.extend_from_slice(&1_u16.to_le_bytes()); + bytes.extend_from_slice(&0x40000001_u32.to_le_bytes()); + bytes.extend_from_slice(&u32::MAX.to_le_bytes()); + bytes.extend_from_slice(&0x44000000_u32.to_le_bytes()); + assert!(PropertySets::parse(&bytes).is_err()); +} diff --git a/crates/onestore/tests/revisions.rs b/crates/onestore/tests/revisions.rs new file mode 100644 index 0000000000000000000000000000000000000000..9b12b439b522d7aaf0ea25da326dbf82b673a2e6 --- /dev/null +++ b/crates/onestore/tests/revisions.rs @@ -0,0 +1,214 @@ +use onestore::{ExGuid, FileDataReference, ObjectData, PropertySets, RevisionIndex, Store, Value}; +use std::fs; + +const TABLE: &str = "../../corpus/native/20260905-05/snapshots/07-table/notebook/synthetic.one"; + +#[test] +fn native_encryption_remains_opaque() { + let bytes = + fs::read("../../corpus/native-encrypted/encrypted-01/notebook/synthetic.one").unwrap(); + let store = Store::parse(&bytes).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + let mut encrypted = 0; + for (osid, space) in &index.spaces { + for (rid, revision) in &space.revisions { + let resolved = index.resolve(*osid, *rid).unwrap(); + if revision.encrypted { + encrypted += 1; + assert!( + resolved + .objects + .values() + .any(|object| matches!(object.data, ObjectData::Encrypted(_))) + ); + assert_eq!( + resolved.reachable().unwrap_err().message, + "Encrypted property references are unavailable" + ); + } + } + } + assert!(encrypted > 0); +} + +#[test] +fn external_payload_names_cannot_escape_the_onefiles_directory() { + for (reference, valid) in [ + ("2a83ae62-6754-4383-8e2b-4033ff3cfba1.onebin", true), + ( + "../2a83ae62-6754-4383-8e2b-4033ff3cfba1.onebin", + false, + ), + ( + "C:\\2a83ae62-6754-4383-8e2b-4033ff3cfba1.onebin", + false, + ), + ( + "2a83ae62-6754-4383-8e2b-4033ff3cfba1.onebin:stream", + false, + ), + ("{2a83ae62-6754-4383-8e2b-4033ff3cfba1}", true), + ("", true), + ("garbage", false), + ] { + let bytes: Vec<_> = reference + .encode_utf16() + .flat_map(u16::to_le_bytes) + .collect(); + let object = onestore::Object { + jcid: 0x80036, + reference_count: 1, + data: ObjectData::File { + reference: &bytes, + extension: &[], + }, + global_ids: Default::default(), + }; + assert_eq!(object.file_reference().is_ok(), valid, "{reference}"); + } +} + +#[test] +fn active_revision_contains_current_text_and_exact_attachment_bytes() { + let bytes = fs::read(TABLE).unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let mut strings = Vec::new(); + let mut attachments = Vec::new(); + let mut pages = 0; + for (osid, space) in &index.spaces { + let rid = space.labels[&(ExGuid::default(), 1)]; + let revision = index.resolve(*osid, rid).unwrap(); + for oid in revision.reachable().unwrap() { + let object = &revision.objects[&oid]; + pages += usize::from(object.jcid == 0x6000b); + if let Some(FileDataReference::Internal(guid)) = object.file_reference().unwrap() + && object.jcid == 0x80036 + { + attachments.push(store.file_data(guid).unwrap()); + } + if object.jcid != 0x6000e { + continue; + } + let ObjectData::Properties(data) = object.data else { + panic!() + }; + let props = PropertySets::parse(data).unwrap(); + let unicode = props.sets[0] + .iter() + .find(|property| property.id == 0x1c001c22); + if let Some(property) = unicode { + let Value::Bytes(data) = property.value else { + panic!() + }; + let text = String::from_utf16( + &data + .chunks_exact(2) + .map(|pair| u16::from_le_bytes([pair[0], pair[1]])) + .collect::>(), + ) + .unwrap(); + strings.push(text.strip_suffix('\0').unwrap().to_owned()); + } else if let Some(property) = props.sets[0] + .iter() + .find(|property| property.id == 0x1c003498) + { + let Value::Bytes(data) = property.value else { + panic!() + }; + strings.push(String::from_utf8(data.to_vec()).unwrap()); + } + } + } + strings.sort(); + assert_eq!( + strings, + [ + "Fictitious positioned outline.", + "Fictitious: café, 東京, مرحبا", + "Left cell", + "Right cell" + ] + ); + assert_eq!(pages, 1); + assert_eq!( + attachments, + [fs::read("../../corpus/native/20260905-05/assets/fictitious-attachment.txt").unwrap()] + ); +} + +#[test] +fn self_dependent_revision_is_rejected() { + let mut bytes = fs::read(TABLE).unwrap(); + let store = Store::parse(&bytes).unwrap(); + let node = store + .lists + .values() + .flat_map(|list| &list.nodes) + .find(|node| node.id == 0x1e) + .unwrap(); + let start = node.payload.as_ptr().addr() - bytes.as_ptr().addr(); + bytes.copy_within(start..start + 20, start + 20); + let store = Store::parse(&bytes).unwrap(); + assert_eq!( + RevisionIndex::parse(&store).unwrap_err().message, + "Revision dependency is not an earlier revision" + ); +} + +#[test] +fn damaged_read_only_object_is_rejected_by_its_hash() { + let mut bytes = fs::read(TABLE).unwrap(); + let store = Store::parse(&bytes).unwrap(); + let node = store + .lists + .values() + .flat_map(|list| &list.nodes) + .find(|node| node.id == 0xc4) + .unwrap(); + let onestore::Reference::Data(chunk) = node.reference.unwrap() else { + panic!() + }; + bytes[usize::try_from(chunk.offset).unwrap()] ^= 1; + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + assert!( + index + .spaces + .iter() + .any(|(osid, space)| space.revisions.keys().any(|rid| { + index + .resolve(*osid, *rid) + .is_err_and(|error| error.message == "Read-only object checksum mismatch") + })) + ); +} + +#[test] +fn reference_counts_and_graph_cycles_are_checked_independently_of_chunk_hashes() { + let bytes = fs::read(TABLE).unwrap(); + let store = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let space = &index.spaces[&index.root]; + let rid = space.labels[&(ExGuid::default(), 1)]; + let mut revision = index.resolve(index.root, rid).unwrap(); + revision.reachable().unwrap(); + let root = revision.roots[&1]; + revision.objects.get_mut(&root).unwrap().reference_count += 1; + assert_eq!( + revision.reachable().unwrap_err().message, + "Stored object reference count disagrees with the reachable graph" + ); + let mut data = 0x80000001_u32.to_le_bytes().to_vec(); + data.extend_from_slice(&(0x100 | root.n).to_le_bytes()); + data.extend_from_slice(&1_u16.to_le_bytes()); + data.extend_from_slice(&0x20000001_u32.to_le_bytes()); + let object = revision.objects.get_mut(&root).unwrap(); + object.data = ObjectData::Properties(&data); + object.global_ids = std::sync::Arc::new([(1, root.guid)].into()); + assert_eq!( + revision.reachable().unwrap_err().message, + "Object references form a cycle" + ); +} diff --git a/crates/onestore/tests/storage.rs b/crates/onestore/tests/storage.rs new file mode 100644 index 0000000000000000000000000000000000000000..49d0c2040b567c6dadabeac7ede732559a33f1b4 --- /dev/null +++ b/crates/onestore/tests/storage.rs @@ -0,0 +1,246 @@ +use onestore::{Chunk, FileDataReference, Reference, RevisionIndex, Store}; +use std::{fs, path::Path}; + +const TEXT: &str = "../../corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one"; + +#[test] +fn native_file_data_alignment_is_relative_to_the_object() { + let source = + fs::read("../../corpus/m6/native-template-controls-01/notebook/synthetic.one").unwrap(); + let store = Store::parse(&source).unwrap(); + let node = store + .lists + .values() + .flat_map(|l| &l.nodes) + .find(|n| n.id == 0x94) + .unwrap(); + let guid = node.payload[node.payload.len() - 16..].try_into().unwrap(); + let Some(Reference::Data(chunk)) = node.reference else { + panic!("Missing native image container") + }; + assert_eq!(chunk.offset % 8, 4); + let payload = store.file_data(guid).unwrap(); + assert_eq!(payload.len(), 10056); + assert_eq!( + format!("{:x}", md5::compute(payload)), + "e1b57a8851177dd25dc05b50b904656a" + ); + let blob = store.chunk_data(chunk).unwrap(); + for alignment in 0..8 { + let mut bytes = source.clone(); + let offset = bytes.len().next_multiple_of(8) + alignment; + bytes.resize(offset, 0); + bytes.extend_from_slice(blob); + let mut relocated = Store::parse(&bytes).unwrap(); + let node = relocated + .lists + .values_mut() + .flat_map(|l| &mut l.nodes) + .find(|n| n.id == 0x94) + .unwrap(); + node.reference = Some(Reference::Data(Chunk { + offset: offset as u64, + length: chunk.length, + })); + assert_eq!( + relocated.file_data(guid).unwrap(), + payload, + "alignment {alignment}" + ); + } + let mut corrupt = source.clone(); + corrupt[(chunk.offset + chunk.length - 1) as usize] ^= 1; + assert!(Store::parse(&corrupt).unwrap().file_data(guid).is_err()); +} + +fn files(path: &Path, result: &mut Vec) { + for entry in fs::read_dir(path).unwrap() { + let path = entry.unwrap().path(); + if path.is_dir() { + files(&path, result); + } else if path + .extension() + .is_some_and(|ext| ext == "one" || ext == "onetoc2") + { + result.push(path); + } + } +} + +#[test] +fn native_corpus_has_committed_lists_and_matching_checksums() { + let mut paths = Vec::new(); + for path in [ + "../../corpus/native", + "../../corpus/native-ink", + "../../corpus/native-delete", + ] { + files(Path::new(path), &mut paths); + } + assert!(paths.len() >= 35); + for path in paths { + let bytes = fs::read(&path).unwrap(); + let store = + Store::parse(&bytes).unwrap_or_else(|error| panic!("{}: {error}", path.display())); + assert!(store.checksum_mismatches.is_empty(), "{}", path.display()); + assert!(!store.lists.is_empty()); + let index = RevisionIndex::parse(&store) + .unwrap_or_else(|error| panic!("{}: {error}", path.display())); + index + .validate_current() + .unwrap_or_else(|error| panic!("{}: {error}", path.display())); + for (osid, space) in &index.spaces { + for rid in space.revisions.keys() { + let revision = index + .resolve(*osid, *rid) + .unwrap_or_else(|error| panic!("{}: {error}", path.display())); + revision + .reachable() + .unwrap_or_else(|error| panic!("{}: {error}", path.display())); + for object in revision.objects.values() { + if let Some(FileDataReference::Internal(guid)) = + object.file_reference().unwrap() + { + store.file_data(guid).unwrap(); + } + } + } + } + } +} + +#[test] +fn compressed_nil_references_are_normalized_before_scaling() { + let source = fs::read(TEXT).unwrap(); + let store = Store::parse(&source).unwrap(); + let node = store + .lists + .values() + .flat_map(|list| &list.nodes) + .find(|node| node.id == 0x84) + .unwrap(); + for (format, width) in [(0_u32, 8_usize), (1, 4), (2, 2), (3, 4)] { + let mut bytes = source.clone(); + let header = u32::from_le_bytes(bytes[node.offset..node.offset + 4].try_into().unwrap()); + let changed = (header & !((3 << 23) | (3 << 25))) | (format << 23) | (2 << 25); + bytes[node.offset..node.offset + 4].copy_from_slice(&changed.to_le_bytes()); + bytes[node.offset + 4..node.offset + 4 + width].fill(0xff); + bytes[node.offset + 4 + width] = 0; + let parsed = Store::parse(&bytes).unwrap(); + let changed = parsed + .lists + .values() + .flat_map(|list| &list.nodes) + .find(|candidate| candidate.offset == node.offset) + .unwrap(); + assert_eq!( + changed.reference, + Some(onestore::Reference::Data(onestore::Chunk { + offset: u64::MAX, + length: 0 + })) + ); + } +} + +#[test] +fn native_log_prefixes_define_readable_states() { + let mut bytes = + fs::read("../../corpus/native/20260905-05/snapshots/00-empty/notebook/synthetic.one") + .unwrap(); + let transactions = Store::parse(&bytes).unwrap().header.transaction_count; + assert_eq!(transactions, 4); + for count in 1..=transactions { + bytes[96..100].copy_from_slice(&count.to_le_bytes()); + let store = + Store::parse(&bytes).unwrap_or_else(|error| panic!("transaction {count}: {error}")); + assert!(store.checksum_mismatches.is_empty()); + } +} + +#[test] +fn unused_links_and_tail_bytes_are_ignored() { + let mut bytes = fs::read(TEXT).unwrap(); + let store = Store::parse(&bytes).unwrap(); + let expected: Vec<_> = store + .lists + .iter() + .map(|(id, list)| (*id, list.nodes.len())) + .collect(); + let tails: Vec<_> = store + .lists + .values() + .map(|list| *list.fragments.last().unwrap()) + .collect(); + for tail in tails { + let end = usize::try_from(tail.offset + tail.length).unwrap(); + bytes[end - 20..end - 8].fill(0xfe); + } + bytes.extend_from_slice(&[0xff; 4096]); + let store = Store::parse(&bytes).unwrap(); + assert_eq!( + store + .lists + .iter() + .map(|(id, list)| (*id, list.nodes.len())) + .collect::>(), + expected + ); +} + +#[test] +fn malformed_structure_is_rejected() { + let source = fs::read(TEXT).unwrap(); + let root = usize::try_from(Store::parse(&source).unwrap().header.root.offset).unwrap(); + for (offset, replacement) in [ + (96, vec![0; 4]), + (160, vec![0xff; 12]), + (root, vec![0; 8]), + (root + 12, 1_u32.to_le_bytes().to_vec()), + (root + 16, vec![0; 4]), + ] { + let mut bytes = source.clone(); + bytes[offset..offset + replacement.len()].copy_from_slice(&replacement); + assert!(Store::parse(&bytes).is_err(), "offset {offset:#x}"); + } + for end in 0..1024 { + assert!(Store::parse(&source[..end]).is_err()); + } +} + +#[test] +fn bit_changes_in_header_and_first_chunks_do_not_panic() { + let mut bytes = fs::read(TEXT).unwrap(); + for index in 0..4096 { + for bit in 0..8 { + bytes[index] ^= 1 << bit; + let _ = Store::parse(&bytes); + bytes[index] ^= 1 << bit; + } + } +} + +#[test] +fn checksum_damage_is_reported_without_discarding_committed_content() { + let mut bytes = fs::read(TEXT).unwrap(); + bytes[2060] ^= 1; + let store = Store::parse(&bytes).unwrap(); + assert_eq!(store.checksum_mismatches[0], 2056); + assert_eq!(store.header.transaction_count, 16); +} + +#[test] +fn native_toc_continuation_excludes_the_flushed_entry_from_crc() { + let path = "../../corpus/m6/native-structure-01/notebook/Open Notebook.onetoc2"; + let mut bytes = fs::read(path).unwrap(); + let store = Store::parse(&bytes).unwrap(); + assert_eq!(store.header.transaction_log.length, 44); + assert_eq!( + u64::from_le_bytes(bytes[0x640..0x648].try_into().unwrap()), + 0xac4 + ); + assert!(store.checksum_mismatches.is_empty()); + assert_eq!(&bytes[0xacc..0xad4], &[1, 0, 0, 0, 0x29, 0x9d, 0xf0, 0x68]); + bytes[0xad0] ^= 1; + assert_eq!(Store::parse(&bytes).unwrap().checksum_mismatches, [0xacc]); +} diff --git a/crates/onestore/tests/support/checkpoint.rs b/crates/onestore/tests/support/checkpoint.rs new file mode 100644 index 0000000000000000000000000000000000000000..4c048644b3445f3223cc7d0b396ea925597c873b --- /dev/null +++ b/crates/onestore/tests/support/checkpoint.rs @@ -0,0 +1,21 @@ +use onestore::{ExGuid, RevisionIndex, Store}; + +pub fn pending(source: &[u8], sid: ExGuid, oid: ExGuid, property: u32) -> Vec { + let mut source = source.to_vec(); + for value in 1_000_000_u32.. { + let store = Store::parse(&source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let rid = index.spaces[&sid].labels[&(ExGuid::default(), 1)]; + let depth = + std::iter::successors(Some(rid), |id| index.spaces[&sid].revisions[id].dependency) + .count(); + assert!(depth <= 512); + if depth == 512 { + return source; + } + source = + onestore::replace_property_bytes(&source, sid, oid, property, &value.to_le_bytes()) + .unwrap(); + } + unreachable!() +} diff --git a/crates/onestore/tests/support/disk.rs b/crates/onestore/tests/support/disk.rs new file mode 100644 index 0000000000000000000000000000000000000000..c51e092ba3466fb5b34ea408d3dd8d3d0031d6ad --- /dev/null +++ b/crates/onestore/tests/support/disk.rs @@ -0,0 +1,54 @@ +pub struct Disk { + pub visible: Vec, + pub durable: Vec, + pub operation: usize, + pub fail_at: Option, + pub write_limit: usize, + pub random: u64, +} + +impl Disk { + fn interrupt(&mut self) -> std::io::Result<()> { + self.operation += 1; + if self.fail_at != Some(self.operation) { + return Ok(()); + } + self.durable.resize(self.visible.len(), 0); + for (durable, visible) in self.durable.iter_mut().zip(&self.visible) { + self.random ^= self.random << 13; + self.random ^= self.random >> 7; + self.random ^= self.random << 17; + if self.random & 1 != 0 { + *durable = *visible; + } + } + Err(std::io::Error::other("Injected storage interruption")) + } +} + +impl onestore::CommitIo for Disk { + fn read_at(&mut self, offset: u64, bytes: &mut [u8]) -> std::io::Result { + self.interrupt()?; + let offset = offset as usize; + let size = bytes + .len() + .min(193) + .min(self.visible.len().saturating_sub(offset)); + bytes[..size].copy_from_slice(&self.visible[offset..offset + size]); + Ok(size) + } + fn write_at(&mut self, offset: u64, bytes: &[u8]) -> std::io::Result { + let offset = offset as usize; + let size = bytes.len().min(self.write_limit); + self.visible + .resize(self.visible.len().max(offset + size), 0); + self.visible[offset..offset + size].copy_from_slice(&bytes[..size]); + self.interrupt()?; + Ok(size) + } + fn flush(&mut self) -> std::io::Result<()> { + self.interrupt()?; + self.durable.clone_from(&self.visible); + Ok(()) + } +} diff --git a/crates/onestore/tests/writer.rs b/crates/onestore/tests/writer.rs new file mode 100644 index 0000000000000000000000000000000000000000..ffd7efc1a76a06a530a57d236f90cd1e9e51aab8 --- /dev/null +++ b/crates/onestore/tests/writer.rs @@ -0,0 +1,450 @@ +use onestore::{ + ExGuid, ObjectData, PropertySets, RevisionIndex, Store, Value, replace_property_bytes, +}; +use std::fs; + +#[test] +fn scalar_edit_appends_a_revision_and_preserves_every_prior_object() { + let source = + fs::read("../../corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one") + .unwrap(); + let store = Store::parse(&source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let mut selected = None; + for (osid, space) in &index.spaces { + let revision = index + .resolve(*osid, space.labels[&(ExGuid::default(), 1)]) + .unwrap(); + for oid in revision.reachable().unwrap() { + let object = &revision.objects[&oid]; + if let ObjectData::Properties(bytes) = object.data { + for property in &PropertySets::parse(bytes).unwrap().sets[0] { + if property.value == Value::Bytes(b"Fictitious plain text.") { + assert!(selected.replace((*osid, oid, property.id)).is_none()); + } + } + } + } + } + let (osid, oid, property) = selected.unwrap(); + assert_eq!( + replace_property_bytes(&source, osid, oid, property, b"Fictitious plain text.").unwrap(), + source + ); + for length in 0..=40 { + let value = vec![b'x'; length]; + let written = replace_property_bytes(&source, osid, oid, property, &value).unwrap(); + assert_preserved_committed_bytes(&source, &written); + let parsed = Store::parse(&written).unwrap(); + assert!(parsed.checksum_mismatches.is_empty()); + assert_eq!( + parsed.header.transaction_count, + store.header.transaction_count + 1 + ); + assert_eq!(parsed.header.generation, store.header.generation + 1); + assert_ne!(parsed.header.deny_read_id, store.header.deny_read_id); + let after = RevisionIndex::parse(&parsed).unwrap(); + after.validate_current().unwrap(); + for (space_id, space) in &index.spaces { + for rid in space.revisions.keys() { + let before = index.resolve(*space_id, *rid).unwrap(); + let unchanged = after.resolve(*space_id, *rid).unwrap(); + assert_eq!(before.roots, unchanged.roots); + assert_eq!(before.objects.len(), unchanged.objects.len()); + for (id, object) in before.objects { + let same = &unchanged.objects[&id]; + assert_eq!(object.jcid, same.jcid); + assert_eq!(object.reference_count, same.reference_count); + assert_eq!(object.global_ids, same.global_ids); + assert_eq!(object.data, same.data); + } + } + } + let space = &after.spaces[&osid]; + let active = after + .resolve(osid, space.labels[&(ExGuid::default(), 1)]) + .unwrap(); + let ObjectData::Properties(data) = active.objects[&oid].data else { + panic!() + }; + let properties = PropertySets::parse(data).unwrap(); + assert_eq!( + properties.sets[0] + .iter() + .find(|candidate| candidate.id == property) + .unwrap() + .value, + Value::Bytes(&value) + ); + } +} + +#[test] +fn toc_color_edit_uses_its_native_revision_encoding_and_crc() { + let source = fs::read( + "../../corpus/native/20260905-05/snapshots/02-text/notebook/Open Notebook.onetoc2", + ) + .unwrap(); + let store = Store::parse(&source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let rid = index.spaces[&index.root].labels[&(ExGuid::default(), 1)]; + let revision = index.resolve(index.root, rid).unwrap(); + let oid = revision.roots[&1]; + let written = + replace_property_bytes(&source, index.root, oid, 0x14001cbe, &[0x33, 0x66, 0x99, 0]) + .unwrap(); + let after = Store::parse(&written).unwrap(); + assert!(after.checksum_mismatches.is_empty()); + assert_preserved_committed_bytes(&source, &written); + let current = RevisionIndex::parse(&after).unwrap(); + current.validate_current().unwrap(); + assert_eq!( + current.resolve(index.root, rid).unwrap().objects[&oid].data, + revision.objects[&oid].data + ); + let active = current + .resolve( + index.root, + current.spaces[&index.root].labels[&(ExGuid::default(), 1)], + ) + .unwrap(); + let ObjectData::Properties(blob) = active.objects[&oid].data else { + panic!() + }; + assert!( + PropertySets::parse(blob).unwrap().sets[0] + .iter() + .any(|p| p.id == 0x14001cbe && p.value == Value::Bytes(&[0x33, 0x66, 0x99, 0])) + ); +} + +#[test] +fn fresh_section_has_unique_identities_and_exact_utf16_text() { + let text = "Created in Rust: café 東京 🦀"; + let first = onestore::create_section("synthetic.one", text, "Fixture Author").unwrap(); + let second = onestore::create_section("synthetic.one", text, "Fixture Author").unwrap(); + let a = Store::parse(&first).unwrap(); + let b = Store::parse(&second).unwrap(); + assert_ne!(a.header.file_id, b.header.file_id); + assert!(a.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&a).unwrap(); + index.validate_current().unwrap(); + assert_eq!(index.spaces.len(), 2); + let expected: Vec<_> = text + .encode_utf16() + .chain([0]) + .flat_map(u16::to_le_bytes) + .collect(); + let mut found = 0; + for (osid, space) in &index.spaces { + let revision = index + .resolve(*osid, space.labels[&(ExGuid::default(), 1)]) + .unwrap(); + for oid in revision.reachable().unwrap() { + let object = &revision.objects[&oid]; + if object.jcid == 0x6000e { + let ObjectData::Properties(data) = object.data else { + panic!() + }; + assert!( + PropertySets::parse(data).unwrap().sets[0] + .iter() + .any(|p| p.id == 0x1c001c22 && p.value == Value::Bytes(&expected)) + ); + found += 1; + } + } + } + assert_eq!(found, 1); + for text in ["line\nfeed", "embedded\0nul"] { + assert!(onestore::create_section("a.one", text, "").is_err()); + } + for name in ["a.onetoc2", "../a.one", "a\\b.one", "a\0.one"] { + assert!(onestore::create_section(name, "text", "").is_err()); + } +} + +#[test] +fn malformed_creation_sequences_are_rejected_before_object_resolution() { + let source = onestore::create_section("a.one", "text", "").unwrap(); + let store = Store::parse(&source).unwrap(); + let node = store + .lists + .values() + .flat_map(|list| &list.nodes) + .find(|node| node.id == 0x84) + .unwrap(); + let at = node.offset; + let mut damaged = source.clone(); + let header = u32::from_le_bytes(damaged[at..at + 4].try_into().unwrap()); + damaged[at..at + 4].copy_from_slice(&((header & !0x3ff) | 0x5a).to_le_bytes()); + let store = Store::parse(&damaged).unwrap(); + assert_eq!( + RevisionIndex::parse(&store).unwrap_err().message, + "Object group lacks its dependency overrides" + ); + let store = Store::parse(&source).unwrap(); + let root = store + .lists + .values() + .find(|list| list.nodes.iter().any(|node| node.id == 4)) + .unwrap(); + let selector = root.nodes.iter().find(|node| node.id == 4).unwrap(); + let start = root.nodes[0].offset; + let end = selector.offset + 24; + let mut damaged = source.clone(); + damaged[start..end].rotate_right(24); + let store = Store::parse(&damaged).unwrap(); + assert_eq!( + RevisionIndex::parse(&store).unwrap_err().message, + "Root object space is referenced before its declaration" + ); +} + +#[test] +fn created_toc_preserves_section_order_names_and_identities() { + let entries = [("second.one", [2; 16]), ("first.one", [1; 16])]; + let bytes = onestore::create_table_of_contents("Open Notebook.onetoc2", &entries).unwrap(); + let store = Store::parse(&bytes).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + let revision = index + .resolve( + index.root, + index.spaces[&index.root].labels[&(ExGuid::default(), 1)], + ) + .unwrap(); + let root = &revision.objects[&revision.roots[&1]]; + for (oid, (name, identity)) in root.references().unwrap().objects.iter().zip(entries) { + let ObjectData::Properties(data) = revision.objects[oid].data else { + panic!() + }; + let props = PropertySets::parse(data).unwrap(); + let expected: Vec<_> = name + .encode_utf16() + .chain([0]) + .flat_map(u16::to_le_bytes) + .collect(); + assert!( + props.sets[0] + .iter() + .any(|p| p.id == 0x1c001d94 && p.value == Value::Bytes(&identity)) + ); + assert!( + props.sets[0] + .iter() + .any(|p| p.id == 0x1c001d6b && p.value == Value::Bytes(&expected)) + ); + } + assert_eq!(root.references().unwrap().objects.len(), entries.len()); + assert!( + onestore::create_table_of_contents( + "Open Notebook.onetoc2", + &[("same.one", [1; 16]), ("SAME.one", [2; 16])] + ) + .is_err() + ); + assert!( + onestore::create_table_of_contents( + "Open Notebook.onetoc2", + &[("a.one", [1; 16]), ("b.one", [1; 16])] + ) + .is_err() + ); + let empty = onestore::create_table_of_contents("Open Notebook.onetoc2", &[]).unwrap(); + let store = Store::parse(&empty).unwrap(); + RevisionIndex::parse(&store) + .unwrap() + .validate_current() + .unwrap(); +} + +fn assert_preserved_committed_bytes(source: &[u8], written: &[u8]) { + let before = Store::parse(source).unwrap(); + let after = Store::parse(written).unwrap(); + for node in before.lists.values().flat_map(|list| &list.nodes) { + let header = u32::from_le_bytes(source[node.offset..node.offset + 4].try_into().unwrap()); + let size = ((header >> 10) & 0x1fff) as usize; + assert!( + source[node.offset..node.offset + size] == written[node.offset..node.offset + size], + "Committed node changed at {}", + node.offset + ); + if let Some(onestore::Reference::Data(chunk)) = node.reference + && chunk.length > 0 + { + assert_eq!( + before.chunk_data(chunk).unwrap(), + after.chunk_data(chunk).unwrap() + ); + } + } + let mut uncommitted = written.to_vec(); + uncommitted[..1024].copy_from_slice(&source[..1024]); + let old = Store::parse(&uncommitted).unwrap(); + assert!(old.checksum_mismatches.is_empty()); + RevisionIndex::parse(&old) + .unwrap() + .validate_current() + .unwrap(); +} + +#[test] +fn toc_writes_cross_fragment_and_counter_boundaries_without_crc_drift() { + let mut bytes = + fs::read("../../corpus/m6/native-structure-01/notebook/Open Notebook.onetoc2").unwrap(); + for i in 0_u32..260 { + let store = Store::parse(&bytes).unwrap(); + assert!(store.checksum_mismatches.is_empty(), "edit {i}"); + let index = RevisionIndex::parse(&store).unwrap(); + let root = index.root; + let revision = index + .resolve(root, index.spaces[&root].labels[&(ExGuid::default(), 1)]) + .unwrap(); + let oid = revision.roots[&1]; + let written = + replace_property_bytes(&bytes, root, oid, 0x14001cbe, &i.to_le_bytes()).unwrap(); + assert_preserved_committed_bytes(&bytes, &written); + bytes = written; + } + let store = Store::parse(&bytes).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + assert!(store.header.transaction_count >= 262); +} + +#[test] +fn checkpoints_bound_dependencies_and_preserve_native_objects_and_history() { + for (path, section) in [ + ( + "../../corpus/native/20260905-05/snapshots/06-attachment/notebook/synthetic.one", + true, + ), + ( + "../../corpus/m6/native-structure-01/notebook/Open Notebook.onetoc2", + false, + ), + ] { + let mut bytes = fs::read(path).unwrap(); + let initial = Store::parse(&bytes).unwrap(); + let index = RevisionIndex::parse(&initial).unwrap(); + let mut candidates = Vec::new(); + for (sid, space) in &index.spaces { + let revision = index + .resolve(*sid, space.labels[&(ExGuid::default(), 1)]) + .unwrap(); + for oid in revision.reachable().unwrap() { + let object = &revision.objects[&oid]; + if object.jcid != if section { 0x6000e } else { 0x20001 } { + continue; + } + let ObjectData::Properties(blob) = object.data else { + panic!() + }; + let property = if section { 0x14001d7a } else { 0x14001cbe }; + if PropertySets::parse(blob).unwrap().sets[0] + .iter() + .any(|p| p.id == property) + { + candidates.push((*sid, oid, property)); + } + } + } + assert!(!candidates.is_empty()); + let sid = candidates[0].0; + candidates.retain(|candidate| candidate.0 == sid); + if section { + let revision = index + .resolve(sid, index.spaces[&sid].labels[&(ExGuid::default(), 1)]) + .unwrap(); + assert!( + revision + .objects + .values() + .any(|o| matches!(o.data, ObjectData::File { .. })) + ); + assert!(revision.objects.values().any(|o| o.jcid & 0x100000 != 0)); + } + let mut checkpoints = 0; + for operation in 0_u32..1025 { + let (_, oid, property) = candidates[operation as usize % candidates.len()]; + let store = Store::parse(&bytes).unwrap(); + let before = RevisionIndex::parse(&store).unwrap(); + let rid = before.spaces[&sid].labels[&(ExGuid::default(), 1)]; + let value = (1_000_000 + operation).to_le_bytes(); + let written = replace_property_bytes(&bytes, sid, oid, property, &value).unwrap(); + let updated = Store::parse(&written).unwrap(); + assert!(updated.checksum_mismatches.is_empty()); + assert_eq!( + updated.header.transaction_count, + store.header.transaction_count + 1 + ); + let after = RevisionIndex::parse(&updated).unwrap(); + after.validate_current().unwrap(); + let next = after.spaces[&sid].labels[&(ExGuid::default(), 1)]; + let depth = + std::iter::successors(Some(next), |id| after.spaces[&sid].revisions[id].dependency) + .count(); + assert!(depth <= 512); + if after.spaces[&sid].revisions[&next].dependency.is_none() { + checkpoints += 1; + assert_preserved_committed_bytes(&bytes, &written); + let old = before.resolve(sid, rid).unwrap(); + let current = after.resolve(sid, next).unwrap(); + assert_eq!(old.roots, current.roots); + assert_eq!(old.objects.len(), current.objects.len()); + for (id, object) in &old.objects { + let same = ¤t.objects[id]; + assert_eq!(object.jcid, same.jcid); + assert_eq!(object.reference_count, same.reference_count); + let a = object.references().unwrap(); + let b = same.references().unwrap(); + assert_eq!(a.objects, b.objects); + assert_eq!(a.object_spaces, b.object_spaces); + assert_eq!(a.contexts, b.contexts); + if section { + assert_eq!(object.global_ids, same.global_ids); + if *id != oid { + assert_eq!(object.data, same.data); + } + } + if let (ObjectData::Properties(a), ObjectData::Properties(b)) = + (object.data, same.data) + { + let a = PropertySets::parse(a).unwrap(); + let b = PropertySets::parse(b).unwrap(); + assert_eq!(a.sets.len(), b.sets.len()); + for (a, b) in a.sets.iter().zip(&b.sets) { + assert_eq!(a.len(), b.len()); + for (a, b) in a.iter().zip(b) { + assert_eq!(a.id, b.id); + if *id == oid && a.id == property { + assert_eq!(b.value, Value::Bytes(&value)); + } else if !matches!(a.value, Value::References { .. }) { + assert_eq!(a.value, b.value); + } + } + } + } + } + for (space_id, space) in &before.spaces { + for previous in space.revisions.keys() { + let old = before.resolve(*space_id, *previous).unwrap(); + let preserved = after.resolve(*space_id, *previous).unwrap(); + assert_eq!(old.roots, preserved.roots); + assert_eq!(old.objects.len(), preserved.objects.len()); + for (id, object) in old.objects { + let same = &preserved.objects[&id]; + assert_eq!(object.jcid, same.jcid); + assert_eq!(object.reference_count, same.reference_count); + assert_eq!(object.global_ids, same.global_ids); + assert_eq!(object.data, same.data); + } + } + } + } + bytes = written; + } + assert_eq!(checkpoints, 2, "{path}"); + } +} diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock new file mode 100644 index 0000000000000000000000000000000000000000..60579236e039128517842e559a9dcba0f72033dd --- /dev/null +++ b/fuzz/Cargo.lock @@ -0,0 +1,196 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "cc" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "005ec2760ca554fae18df7a11195552ec576cd665632a881bc011d5bb2fd4d80" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "find-msvc-tools" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "md5" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebb8d8732c6a6df3d8f032a82911cfc747e00efb95cc46e8d0acd5b5b88570c" + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "onestore" +version = "0.1.0" +dependencies = [ + "getrandom", + "md5", + "nix", + "serde", +] + +[[package]] +name = "onestore-fuzz" +version = "0.0.0" +dependencies = [ + "libfuzzer-sys", + "md5", + "onestore", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "syn" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..3b3035b2e50c2dfd6b073c530800d942835d38ed --- /dev/null +++ b/fuzz/Cargo.toml @@ -0,0 +1,71 @@ +[package] +name = "onestore-fuzz" +version = "0.0.0" +edition = "2024" +publish = false + +[package.metadata] +cargo-fuzz = true + +[dependencies] +libfuzzer-sys = "0.4" +onestore = { path = "../crates/onestore" } +md5 = "0.8.1" + +[[bin]] +name = "store" +path = "fuzz_targets/store.rs" +test = false +doc = false +bench = false + +[workspace] + +[[bin]] +name = "properties" +path = "fuzz_targets/properties.rs" +test = false +doc = false +bench = false + +[[bin]] +name = "revisions" +path = "fuzz_targets/revisions.rs" +test = false +doc = false +bench = false + +[[bin]] +name = "write_scalar" +path = "fuzz_targets/write_scalar.rs" +test = false +doc = false +bench = false + +[[bin]] +name = "create" +path = "fuzz_targets/create.rs" +test = false +doc = false +bench = false + +[[bin]] +name = "commit" +path = "fuzz_targets/commit.rs" +test = false +doc = false +bench = false + +[[bin]] +name = "document" +path = "fuzz_targets/document.rs" +test = false +doc = false +bench = false + +[[bin]] +name = "edit_text" +path = "fuzz_targets/edit_text.rs" +test = false +doc = false +bench = false diff --git a/fuzz/fuzz_targets/commit.rs b/fuzz/fuzz_targets/commit.rs new file mode 100644 index 0000000000000000000000000000000000000000..71dbce5fee068fb890ed0fe7d3cd23e520b58f19 --- /dev/null +++ b/fuzz/fuzz_targets/commit.rs @@ -0,0 +1,89 @@ +#![no_main] +use libfuzzer_sys::fuzz_target; +use onestore::{CommitState, ExGuid, ObjectData, PropertySets, RevisionIndex, Store, Value}; +use std::sync::LazyLock; + +#[path = "../../crates/onestore/tests/support/disk.rs"] +mod disk; +use disk::Disk; + +const SOURCES: [&[u8]; 2] = [ + include_bytes!("../../corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one"), + include_bytes!("../../corpus/append/round-01/tx-255/notebook/synthetic.one"), +]; +static TARGET: LazyLock<(ExGuid, ExGuid, u32)> = LazyLock::new(|| { + let store = Store::parse(SOURCES[0]).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + for (osid, space) in &index.spaces { + let revision = index + .resolve(*osid, space.labels[&(ExGuid::default(), 1)]) + .unwrap(); + for (oid, object) in revision.objects { + if let ObjectData::Properties(blob) = object.data { + for property in &PropertySets::parse(blob).unwrap().sets[0] { + if property.value == Value::Bytes(b"Fictitious plain text.") { + return (*osid, oid, property.id); + } + } + } + } + } + panic!("Missing native seed property") +}); + +fn current(bytes: &[u8]) -> Vec { + let store = Store::parse(bytes).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + let (osid, oid, property) = *TARGET; + let revision = index + .resolve(osid, index.spaces[&osid].labels[&(ExGuid::default(), 1)]) + .unwrap(); + let ObjectData::Properties(blob) = revision.objects[&oid].data else { + panic!() + }; + let properties = PropertySets::parse(blob).unwrap(); + let Value::Bytes(value) = properties.sets[0] + .iter() + .find(|p| p.id == property) + .unwrap() + .value + else { + panic!() + }; + value.to_vec() +} + +fuzz_target!(|input: &[u8]| { + if input.len() < 12 { + return; + } + let mut source = SOURCES[usize::from(input[0].is_multiple_of(4))].to_vec(); + let (osid, oid, property) = *TARGET; + for step in 0..=input[1] % 4 { + let mut value = input[12..].to_vec(); + value.push(step); + let before = current(&source); + let mut storage = Disk { + visible: source.clone(), + durable: source.clone(), + operation: 0, + fail_at: Some(usize::from(u16::from_le_bytes([input[2], input[3]]))), + write_limit: usize::from(input[4]) + 1, + random: u64::from_le_bytes(input[4..12].try_into().unwrap()), + }; + let result = + onestore::commit_property_bytes(&mut storage, &source, osid, oid, property, &value); + let persisted = current(&storage.durable); + match result { + Ok(()) => assert_eq!(persisted, value), + Err(error) => match error.state { + CommitState::NotCommitted => assert_eq!(persisted, before), + CommitState::Committed => assert_eq!(persisted, value), + CommitState::Unknown => assert!(persisted == before || persisted == value), + }, + } + source = storage.durable; + } +}); diff --git a/fuzz/fuzz_targets/create.rs b/fuzz/fuzz_targets/create.rs new file mode 100644 index 0000000000000000000000000000000000000000..e96037a09fb4bee5a2b6b83037bdc1171f8f9826 --- /dev/null +++ b/fuzz/fuzz_targets/create.rs @@ -0,0 +1,72 @@ +#![no_main] +use libfuzzer_sys::fuzz_target; +use onestore::{ExGuid, ObjectData, PropertySets, RevisionIndex, Store, Value, create_section}; +fuzz_target!(|input: &[u8]| { + let count = input.first().copied().unwrap_or(0) as usize % 32; + let entries: Vec<_> = (0..count) + .map(|i| (format!("section-{i}.one"), [i as u8 + 1; 16])) + .collect(); + let sections: Vec<_> = entries + .iter() + .map(|(name, id)| (name.as_str(), *id)) + .collect(); + let toc = onestore::create_table_of_contents("Open Notebook.onetoc2", §ions).unwrap(); + let store = Store::parse(&toc).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + let revision = index + .resolve( + index.root, + index.spaces[&index.root].labels[&(ExGuid::default(), 1)], + ) + .unwrap(); + assert_eq!( + revision.objects[&revision.roots[&1]] + .references() + .unwrap() + .objects + .len(), + count + ); + let Ok(text) = std::str::from_utf8(input) else { + return; + }; + let result = create_section("synthetic.one", text, "Fuzz author"); + if text.contains(['\0', '\n']) { + assert!(result.is_err()); + return; + } + let bytes = result.unwrap(); + let store = Store::parse(&bytes).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + let expected: Vec<_> = text + .encode_utf16() + .chain([0]) + .flat_map(u16::to_le_bytes) + .collect(); + let mut found = 0; + for (osid, space) in &index.spaces { + let revision = index + .resolve(*osid, space.labels[&(ExGuid::default(), 1)]) + .unwrap(); + for object in revision + .objects + .values() + .filter(|object| object.jcid == 0x6000e) + { + let ObjectData::Properties(data) = object.data else { + panic!() + }; + assert!( + PropertySets::parse(data).unwrap().sets[0] + .iter() + .any(|p| p.id == 0x1c001c22 && p.value == Value::Bytes(&expected)) + ); + found += 1; + } + } + assert_eq!(found, 1); +}); diff --git a/fuzz/fuzz_targets/document.rs b/fuzz/fuzz_targets/document.rs new file mode 100644 index 0000000000000000000000000000000000000000..c2e2dab7087349a52ebf32bb5970db47565aea23 --- /dev/null +++ b/fuzz/fuzz_targets/document.rs @@ -0,0 +1,100 @@ +#![no_main] +use libfuzzer_sys::fuzz_target; +use onestore::{ObjectData, Reference, RevisionIndex, Store, document::Document}; +use std::sync::LazyLock; + +static SOURCES: LazyLock>> = LazyLock::new(|| { + let mut sources = vec![ + include_bytes!("../../corpus/append/round-01/complex/notebook/synthetic.one").to_vec(), + include_bytes!("../../corpus/m6/native-probes-01/notebook/synthetic.one").to_vec(), + include_bytes!("../../corpus/m6/native-structure-01/notebook/synthetic.one").to_vec(), + include_bytes!("../../corpus/m6/native-features-01/notebook/Features.one").to_vec(), + include_bytes!("../../corpus/m6/native-template-controls-01/notebook/synthetic.one") + .to_vec(), + include_bytes!("../../corpus/m6/native-break-controls-02/notebook/synthetic.one").to_vec(), + include_bytes!("../../corpus/m6/native-empty-link-01/notebook/synthetic.one").to_vec(), + include_bytes!("../../corpus/m6/native-origin-controls-01/input/notebook/synthetic.one") + .to_vec(), + include_bytes!("../../corpus/m6/native-page-direction-03/notebook/synthetic.one").to_vec(), + include_bytes!("../../corpus/m6/native-math-01/notebook/synthetic.one").to_vec(), + include_bytes!("../../corpus/collaboration/round-01/offline/notebook/synthetic.one") + .to_vec(), + ]; + if let Some(paths) = std::env::var_os("ONESTORE_DOCUMENT_SEEDS") { + sources.extend(std::env::split_paths(&paths).map(|path| std::fs::read(path).unwrap())); + } + sources +}); +static RANGES: LazyLock, Vec)>> = LazyLock::new(|| { + let mut ranges = Vec::new(); + for (source_index, source) in SOURCES.iter().enumerate() { + let store = Store::parse(source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + for (sid, space) in &document.spaces { + for rid in space.revisions.keys() { + let revision = index.resolve(*sid, *rid).unwrap(); + for oid in revision.reachable().unwrap() { + let object = &revision.objects[&oid]; + if let ObjectData::Properties(bytes) = object.data { + let start = bytes.as_ptr().addr() - source.as_ptr().addr(); + let hashes = store + .lists + .values() + .flat_map(|list| &list.nodes) + .filter_map(|node| { + if matches!(node.id, 0xc2 | 0xc4 | 0xc5) + && let Some(Reference::Data(chunk)) = node.reference + && chunk.offset == start as u64 + && chunk.length == bytes.len() as u64 + { + Some( + node.payload.as_ptr().addr() - source.as_ptr().addr() + + node.payload.len() + - 16, + ) + } else { + None + } + }) + .collect(); + if !ranges.iter().any(|(s, r, _)| { + *s == source_index && *r == (start..start + bytes.len()) + }) { + ranges.push((source_index, start..start + bytes.len(), hashes)); + } + } + } + } + } + } + ranges +}); + +fuzz_target!(|data: &[u8]| { + if data.len() < 4 { + return; + } + let (source, range, hashes) = + &RANGES[usize::from(u16::from_le_bytes([data[0], data[1]])) % RANGES.len()]; + let offset = usize::from(u16::from_le_bytes([data[2], data[3]])) % range.len(); + let mut bytes = SOURCES[*source].to_vec(); + let size = (range.len() - offset).min(data.len() - 4); + bytes[range.start + offset..range.start + offset + size].copy_from_slice(&data[4..4 + size]); + let digest = md5::compute(&bytes[range.clone()]).0; + for offset in hashes { + bytes[*offset..*offset + 16].copy_from_slice(&digest); + } + let store = Store::parse(&bytes).unwrap(); + if let Ok(index) = RevisionIndex::parse(&store) { + if let Ok(document) = Document::parse(&index) { + for space in document.spaces.values().flat_map(|s| s.revisions.values()) { + for (id, node) in &space.nodes { + if matches!(node.kind, onestore::document::Kind::RichText { .. }) { + let _ = space.text_runs(*id); + } + } + } + } + } +}); diff --git a/fuzz/fuzz_targets/edit_text.rs b/fuzz/fuzz_targets/edit_text.rs new file mode 100644 index 0000000000000000000000000000000000000000..b515803829fa8d87929cc868bc9ee70a8228814e --- /dev/null +++ b/fuzz/fuzz_targets/edit_text.rs @@ -0,0 +1,186 @@ +#![no_main] +use libfuzzer_sys::fuzz_target; +use onestore::{ + CommitState, ExGuid, RevisionIndex, Store, + document::{Document, Kind}, +}; +use std::sync::LazyLock; + +#[path = "../../crates/onestore/tests/support/checkpoint.rs"] +mod checkpoint; +#[path = "../../crates/onestore/tests/support/disk.rs"] +mod disk; +use disk::Disk; + +const SOURCE: &[u8] = include_bytes!( + "../../corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one" +); +static CASES: LazyLock<[(Vec, ExGuid, ExGuid); 7]> = LazyLock::new(|| { + let fixtures: [(&[u8], &str); 6] = [ + (SOURCE, "Fictitious"), + ( + include_bytes!( + "../../corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one" + ), + "Fictitious", + ), + ( + include_bytes!("../../corpus/m6/native-empty-link-01/notebook/synthetic.one"), + "", + ), + ( + include_bytes!("../../corpus/m6/native-structure-01/notebook/synthetic.one"), + "Native feature probes", + ), + ( + include_bytes!("../../corpus/m7/automatic-titles/widths-and-limits.one"), + "Right narrow.", + ), + ( + include_bytes!("../../corpus/m7/automatic-titles/widths-and-limits.one"), + "Left wide.", + ), + ]; + let [ordinary, legacy, empty, title, rtl_title, rtl_body] = fixtures.map(|(source, prefix)| { + let store = Store::parse(source).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + let document = Document::parse(&index).unwrap(); + for (sid, space) in &document.spaces { + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + for (oid, node) in &revision.nodes { + if matches!(&node.kind, Kind::RichText { text, boilerplate: false, .. } + if if prefix.is_empty() { text.is_empty() } else { text.starts_with(prefix) }) + { + return (source.to_vec(), *sid, *oid); + } + } + } + panic!("Missing text fixture") + }); + let checkpoint = ( + checkpoint::pending(&ordinary.0, ordinary.1, ordinary.2, 0x14001d7a), + ordinary.1, + ordinary.2, + ); + [ + ordinary, legacy, empty, checkpoint, title, rtl_title, rtl_body, + ] +}); + +fn characters(source: &[u8], sid: ExGuid, oid: ExGuid) -> Vec<(char, String)> { + let store = Store::parse(source).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + index.validate_current().unwrap(); + let document = Document::parse(&index).unwrap(); + let space = &document.spaces[&sid]; + let revision = &space.revisions[&space.contexts[&ExGuid::default()]]; + let node = &revision.nodes[&oid]; + if node.extra[0].iter().any(|field| field.id == 0x88001cb4) { + let Kind::RichText { text, .. } = &node.kind else { + panic!() + }; + let text = text.trim_start().split('\r').next().unwrap(); + let Kind::Metadata { title, .. } = &revision.nodes[&revision.roots[&2]].kind else { + panic!() + }; + let pages: Vec<_> = document + .pages() + .unwrap() + .into_iter() + .filter(|(id, _)| *id == sid) + .collect(); + let [(_, page)] = pages.as_slice() else { + panic!() + }; + let Kind::Page { + alternate_title, .. + } = &revision.nodes[page].kind + else { + panic!() + }; + assert_eq!( + title.as_deref().unwrap(), + if text.is_empty() { + alternate_title.as_deref().unwrap_or("") + } else { + text + } + ); + if !text.is_empty() { + assert!(alternate_title.as_deref().unwrap_or("").is_empty()); + } + } + let runs = revision.text_runs(oid).unwrap(); + let mut characters: Vec<_> = runs + .iter() + .flat_map(|run| { + run.text + .chars() + .map(move |c| (c, format!("{:?}", run.format))) + }) + .collect(); + // The terminal marker retains insertion formatting when the final run is empty. + characters.push(('\0', format!("{:?}", runs.last().unwrap().format))); + characters +} + +fuzz_target!(|input: &[u8]| { + let (source, sid, oid) = &CASES[usize::from(input.last().copied().unwrap_or(0)) % CASES.len()]; + let (sid, oid) = (*sid, *oid); + let mut persisted_source = source.clone(); + let mut caches = std::array::from_fn::<_, 6, _>(|_| source.clone()); + for step in input.chunks_exact(8).take(16) { + let actor = usize::from(step[6]) % caches.len(); + if step[7] % 3 == 0 { + caches[actor].clone_from(&persisted_source); + continue; + } + let source = &caches[actor]; + let current = characters(&persisted_source, sid, oid); + let before = characters(source, sid, oid); + let a = usize::from(step[0]) % before.len(); + let b = usize::from(step[1]) % before.len(); + let start = a.min(b); + let end = a.max(b); + let offset = before[..start] + .iter() + .map(|(c, _)| c.len_utf16() as u32) + .sum::(); + let removed = before[start..end] + .iter() + .map(|(c, _)| c.len_utf16() as u32) + .sum::(); + let replacement = ["", "a", "🦀e\u{301}", "日本語", "\n", "\0"][usize::from(step[2]) % 6]; + let mut expected = before.clone(); + let format = before[start].1.clone(); + expected.splice(start..end, replacement.chars().map(|c| (c, format.clone()))); + let mut storage = Disk { + visible: persisted_source.clone(), + durable: persisted_source.clone(), + operation: 0, + fail_at: (step[3] & 1 != 0) + .then_some(source.len().div_ceil(193) + usize::from(step[4]) + 1), + write_limit: usize::from(step[5]) + 1, + random: u64::from_le_bytes(step.try_into().unwrap()), + }; + let result = onestore::commit_text( + &mut storage, + source, + sid, + oid, + offset..offset + removed, + replacement, + ); + let persisted = characters(&storage.durable, sid, oid); + match result { + Ok(()) => assert_eq!(persisted, expected), + Err(error) => match error.state { + CommitState::NotCommitted => assert_eq!(persisted, current), + CommitState::Committed => assert_eq!(persisted, expected), + CommitState::Unknown => assert!(persisted == current || persisted == expected), + }, + } + persisted_source = storage.durable; + } +}); diff --git a/fuzz/fuzz_targets/properties.rs b/fuzz/fuzz_targets/properties.rs new file mode 100644 index 0000000000000000000000000000000000000000..e17b1626561e4a8ed23815087a304b6a6a2378a6 --- /dev/null +++ b/fuzz/fuzz_targets/properties.rs @@ -0,0 +1,7 @@ +#![no_main] + +use libfuzzer_sys::fuzz_target; + +fuzz_target!(|data: &[u8]| { + let _ = onestore::PropertySets::parse(data); +}); diff --git a/fuzz/fuzz_targets/revisions.rs b/fuzz/fuzz_targets/revisions.rs new file mode 100644 index 0000000000000000000000000000000000000000..e4f405675955cb3b90fc56e3d2803fc459c9ed8c --- /dev/null +++ b/fuzz/fuzz_targets/revisions.rs @@ -0,0 +1,12 @@ +#![no_main] +use libfuzzer_sys::fuzz_target; +use onestore::{RevisionIndex, Store}; + +fuzz_target!(|data: &[u8]| { + if let Ok(store) = Store::parse(data) + && let Ok(index) = RevisionIndex::parse(&store) + { + let _ = index.validate_current(); + let _ = onestore::document::Document::parse(&index); + } +}); diff --git a/fuzz/fuzz_targets/store.rs b/fuzz/fuzz_targets/store.rs new file mode 100644 index 0000000000000000000000000000000000000000..ef761c361901bd3b1c918f46f8a7df7c9367893e --- /dev/null +++ b/fuzz/fuzz_targets/store.rs @@ -0,0 +1,7 @@ +#![no_main] + +use libfuzzer_sys::fuzz_target; + +fuzz_target!(|data: &[u8]| { + let _ = onestore::Store::parse(data); +}); diff --git a/fuzz/fuzz_targets/write_scalar.rs b/fuzz/fuzz_targets/write_scalar.rs new file mode 100644 index 0000000000000000000000000000000000000000..11d816e44367ab6ab9327738f9f3a613441c418d --- /dev/null +++ b/fuzz/fuzz_targets/write_scalar.rs @@ -0,0 +1,58 @@ +#![no_main] +use libfuzzer_sys::fuzz_target; +use onestore::{ + ExGuid, ObjectData, PropertySets, RevisionIndex, Store, Value, replace_property_bytes, +}; +use std::sync::LazyLock; + +const SOURCE: &[u8] = + include_bytes!("../../corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one"); +static TARGET: LazyLock<(ExGuid, ExGuid, u32)> = LazyLock::new(|| { + let store = Store::parse(SOURCE).unwrap(); + let index = RevisionIndex::parse(&store).unwrap(); + for (osid, space) in &index.spaces { + let revision = index + .resolve(*osid, space.labels[&(ExGuid::default(), 1)]) + .unwrap(); + for (oid, object) in revision.objects { + if let ObjectData::Properties(data) = object.data { + for property in &PropertySets::parse(data).unwrap().sets[0] { + if property.value == Value::Bytes(b"Fictitious plain text.") { + return (*osid, oid, property.id); + } + } + } + } + } + panic!("Missing native seed property") +}); + +fuzz_target!(|value: &[u8]| { + let (osid, oid, property) = *TARGET; + let bytes = replace_property_bytes(SOURCE, osid, oid, property, value).unwrap(); + let mut before_commit = bytes.clone(); + before_commit[..1024].copy_from_slice(&SOURCE[..1024]); + let old = Store::parse(&before_commit).unwrap(); + assert!(old.checksum_mismatches.is_empty()); + RevisionIndex::parse(&old) + .unwrap() + .validate_current() + .unwrap(); + let store = Store::parse(&bytes).unwrap(); + assert!(store.checksum_mismatches.is_empty()); + let index = RevisionIndex::parse(&store).unwrap(); + let rid = index.spaces[&osid].labels[&(ExGuid::default(), 1)]; + let current = index.resolve(osid, rid).unwrap(); + let ObjectData::Properties(data) = current.objects[&oid].data else { + panic!() + }; + let properties = PropertySets::parse(data).unwrap(); + assert_eq!( + properties.sets[0] + .iter() + .find(|candidate| candidate.id == property) + .unwrap() + .value, + Value::Bytes(value) + ); +}); diff --git a/tools/compare_native.py b/tools/compare_native.py new file mode 100644 index 0000000000000000000000000000000000000000..1e6a7be93eccb5236d3cfddc1ced251fa7078f52 --- /dev/null +++ b/tools/compare_native.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +"""Compare native captures while excluding cache identities and selection state.""" +import argparse +import base64 +import difflib +import hashlib +import json +from pathlib import Path +import xml.etree.ElementTree as ET +from native_xml import ns, pages + + +def content(node): + attrs = {key: value for key, value in node.attrib.items() + if key not in ('ID', 'objectID', 'pathCache', 'selected', 'isCurrentlyViewed')} + text = node.text + if node.tag == '{%s}Data' % ns['one'] and text: + text = hashlib.sha256(base64.b64decode(''.join(text.split()), validate=True)).hexdigest() + elif text is not None and not text.strip() and node.tag != '{%s}T' % ns['one']: + text = None + return node.tag, sorted(attrs.items()), text, [content(child) for child in node] + + +def compare(actual, expected): + captured = [] + for directory in (actual, expected): + by_id = {page.get('ID'): page for page in pages(directory)} + hierarchy = ET.parse(directory / 'hierarchy.xml') + ordered = [page.get('ID') for page in hierarchy.findall('.//one:Page', ns)] + if len(ordered) != len(by_id) or set(ordered) != set(by_id): + raise ValueError('Native page capture does not match its hierarchy: ' + str(directory)) + captured.append({ + 'pages': [content(by_id[key]) for key in ordered], + 'attachments': sorted(hashlib.sha256(path.read_bytes()).hexdigest() + for path in directory.glob('*.attachment')), + }) + if captured[0] != captured[1]: + difference = '\n'.join(difflib.unified_diff( + json.dumps(captured[1], indent=2, ensure_ascii=False).splitlines(), + json.dumps(captured[0], indent=2, ensure_ascii=False).splitlines(), + fromfile=str(expected), tofile=str(actual), + )) + (actual.parent / 'native.diff').write_text(difference + '\n') + raise AssertionError('Native content differs; inspect ' + str(actual.parent / 'native.diff')) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('actual', type=Path) + parser.add_argument('expected', type=Path) + args = parser.parse_args() + compare(args.actual, args.expected) + print('Native document content and attachment bytes match') diff --git a/tools/concurrent_rust.py b/tools/concurrent_rust.py new file mode 100644 index 0000000000000000000000000000000000000000..f303c8190fd938faeddd2a47de6be530a3b63f27 --- /dev/null +++ b/tools/concurrent_rust.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python3 +"""Race independent Rust clients and verify every observed append against committed operations.""" +import argparse +from collections import Counter +from contextlib import contextmanager +import hashlib +import json +import os +from pathlib import Path +import subprocess +import time + +ROOT = Path(__file__).resolve().parent.parent +CLIENT = ROOT / 'target/debug/examples/concurrent_client' + + +def verify(logs, initial_transaction, writers, operations, edit=False): + commits = [(actor, event) for actor, events in logs.items() for event in events if event['event'] == 'commit'] + assert Counter(actor for actor, _ in commits) == {f'w{i}': operations for i in range(writers)}, 'Missing or extra acknowledged operations' + ordered = sorted(commits, key=lambda pair: pair[1]['source_transaction']) + versions = {initial_transaction: 'Concurrent edits:'} + seen = set() + for i, (actor, event) in enumerate(ordered): + transaction = initial_transaction + i + assert event['source_transaction'] == transaction, 'Two writers committed the same snapshot or skipped a transaction' + assert event['token'] == f' [{actor}:{event["operation"]}]', 'Committed token differs from intended operation' + assert (actor, event['operation']) not in seen, 'An operation committed twice' + seen.add((actor, event['operation'])) + if edit: + intent, = [e for e in logs[actor] if e['event'] == 'intent' and e['attempt'] == event['attempt']] + assert intent['before'] == versions[transaction] and intent['source_transaction'] == transaction, 'Intent used another snapshot' + assert intent['operation'] == event['operation'] and intent['token'] == event['token'], 'Acknowledgement differs from intent' + assert intent['replacement'] == ' café 🦀' + event['token'], 'Unexpected replacement text' + start, end = intent['range'] + units = intent['before'].encode('utf-16-le') + assert len(versions[initial_transaction]) <= start <= end <= len(units) // 2, 'Invalid edit range' + units[:start * 2].decode('utf-16-le') + units[end * 2:].decode('utf-16-le') + versions[transaction + 1] = (units[:start * 2] + intent['replacement'].encode('utf-16-le') + units[end * 2:]).decode('utf-16-le') + else: + versions[transaction + 1] = versions[transaction] + event['token'] + observations = 0 + intervals = [] + for actor, events in logs.items(): + assert events and events[0]['event'] == 'ready' and events[-1]['event'] == 'done', 'Client did not finish' + previous = initial_transaction + for event in events: + if event['event'] in ('commit', 'retry'): + intervals.append((actor, event['started_us'], event['finished_us'])) + if event['event'] != 'read': + continue + transaction = event['transaction'] + assert transaction >= previous, 'A reader went backwards' + previous = transaction + assert transaction in versions and event['text'] == versions[transaction], 'A reader observed a lost, partial, duplicated or invented edit' + for _, commit in ordered: + published = commit['source_transaction'] + 1 + if commit['finished_us'] < event['started_us']: + assert transaction >= published, 'Read missed an already acknowledged commit' + if commit['started_us'] > event['finished_us']: + assert transaction < published, 'Read observed a future commit' + observations += 1 + overlap = sum(a != b and max(start, other_start) < min(end, other_end) + for i, (a, start, end) in enumerate(intervals) + for b, other_start, other_end in intervals[i + 1:]) + assert overlap, 'Writer calls never overlapped' + return {'commits': len(commits), 'observations': observations, 'overlapping_writer_calls': overlap, + 'retries': sum(e['event'] == 'retry' for events in logs.values() for e in events), + 'final_transaction': initial_transaction + len(commits), 'final_text': versions[max(versions)]} + + +@contextmanager +def running_clients(output, source, writers, readers, operations, seed, timeout=600, edit=False): + start, stop = output / 'start', output / 'stop' + (output / 'clients.json').write_text(json.dumps({'writers': writers, 'readers': readers, 'operations': operations, + 'seed': seed, 'edit': edit, 'client_sha256': hashlib.sha256(CLIENT.read_bytes()).hexdigest()}, indent=2)) + processes = {} + streams = [] + try: + for mode, count in [('write', writers), ('read', readers)]: + for i in range(count): + actor = mode[0] + str(i) + out = (output / f'{actor}.jsonl').open('w') + err = (output / f'{actor}.stderr').open('w') + streams.extend([out, err]) + processes[actor] = subprocess.Popen([CLIENT, 'edit' if edit and mode == 'write' else mode, source, actor, str(operations), start, stop, + str(seed + i + (10000 if mode == 'read' else 0))], stdout=out, stderr=err) + deadline = time.monotonic() + timeout + while not all((output / f'{actor}.jsonl').stat().st_size for actor in processes): + if any(p.poll() is not None for p in processes.values()) or time.monotonic() > deadline: + raise RuntimeError('A client failed before the start barrier.') + time.sleep(.01) + yield processes + while any(p.poll() is None for p in processes.values()): + failed = {actor: p.returncode for actor, p in processes.items() if p.returncode not in (None, 0)} + if failed or time.monotonic() > deadline: + raise RuntimeError(f'Concurrent clients failed or timed out: {failed}') + if all(p.poll() == 0 for actor, p in processes.items() if actor.startswith('w')): + stop.touch(exist_ok=True) + time.sleep(.05) + assert all(p.returncode == 0 for p in processes.values()), 'A client exited unsuccessfully' + finally: + for process in processes.values(): + if process.poll() is None: + process.terminate() + for process in processes.values(): + try: + process.wait(timeout=5) + except subprocess.TimeoutExpired: + process.kill() + process.wait() + for stream in streams: + stream.close() + (output / 'teardown.json').write_text(json.dumps({actor: p.returncode for actor, p in processes.items()}, indent=2)) + + +def run(output, writers, readers, operations, seed, notebook=None, timeout=600, edit=False): + if min(writers, readers, operations) < 1 or writers < 2: + raise ValueError('Choose at least two writers, one reader and one operation.') + output = output.resolve() + output.mkdir(parents=True, exist_ok=False) + notebook = output / 'notebook' if notebook is None else notebook.resolve() + notebook.mkdir() + source = notebook / 'synthetic.one' + seed_file = output / 'initial.one' + subprocess.run([CLIENT, 'init', seed_file], check=True) + initial = seed_file.read_bytes() + with source.open('xb') as stream: + stream.write(initial) + stream.flush() + os.fsync(stream.fileno()) + start, stop = output / 'start', output / 'stop' + (output / 'run.json').write_text(json.dumps({'initial_sha256': hashlib.sha256(initial).hexdigest(), + 'generator_sha256': hashlib.sha256(CLIENT.read_bytes()).hexdigest()}, indent=2)) + started = time.monotonic() + with running_clients(output, source, writers, readers, operations, seed, timeout, edit) as processes: + start.touch() + logs = {actor: [json.loads(line) for line in (output / f'{actor}.jsonl').read_text().splitlines()] for actor in processes} + result = verify(logs, int.from_bytes(initial[96:100], 'little'), writers, operations, edit) + final = subprocess.run([CLIENT, 'read', source, 'final', '1', start, stop, str(seed)], check=True, capture_output=True, text=True) + (output / 'final.jsonl').write_text(final.stdout) + final_read, = [json.loads(line) for line in final.stdout.splitlines() if json.loads(line)['event'] == 'read'] + assert final_read['text'] == result['final_text'] and final_read['transaction'] == result['final_transaction'], 'Final file lost an acknowledged edit' + result['elapsed_seconds'] = time.monotonic() - started + final_bytes = source.read_bytes() + result['final_sha256'] = hashlib.sha256(final_bytes).hexdigest() + (output / 'final.one').write_bytes(final_bytes) + (output / 'result.json').write_text(json.dumps(result, indent=2)) + print(json.dumps({k: v for k, v in result.items() if k != 'final_text'}), flush=True) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('output', type=Path) + parser.add_argument('--writers', type=int, default=4) + parser.add_argument('--readers', type=int, default=3) + parser.add_argument('--operations', type=int, default=30) + parser.add_argument('--seed', type=int, default=1) + parser.add_argument('--notebook-dir', type=Path) + parser.add_argument('--timeout', type=int, default=600) + parser.add_argument('--edit', action='store_true') + args = parser.parse_args() + run(args.output, args.writers, args.readers, args.operations, args.seed, args.notebook_dir, args.timeout, args.edit) diff --git a/tools/crash_recovery.py b/tools/crash_recovery.py new file mode 100644 index 0000000000000000000000000000000000000000..3c371a3bacbc9f35731f87fd49dcdb45fe6af16a --- /dev/null +++ b/tools/crash_recovery.py @@ -0,0 +1,40 @@ +"""Independent append-intent accounting across an abrupt storage interruption.""" +from collections import Counter +import re + + +def verify_text(baseline, current, logs): + events = [event for rows in logs.values() for event in rows] + intents = {event['token'] for event in events if event['event'] == 'intent'} + possible = set() + for rows in logs.values(): + outcomes = {event['attempt']: event for event in rows if event['event'] in ('commit', 'retry', 'commit_error')} + for event in rows: + if event['event'] != 'intent': continue + outcome = outcomes.get(event['attempt']) + if outcome is None or outcome['event'] == 'commit' or (outcome['event'] == 'commit_error' and outcome['state'] != 'NotCommitted'): + possible.add(event['token']) + acknowledged = [event for event in events if event['event'] == 'commit' or + (event['event'] == 'commit_error' and event['state'] == 'Committed')] + assert len({event['token'] for event in acknowledged}) == len(acknowledged), 'An edit was acknowledged twice' + + def tokens(text): + assert text.startswith(baseline), 'Previously retained content changed' + suffix = text[len(baseline):] + found = re.findall(r' \[w\d+:\d+\]', suffix) + assert ''.join(found) == suffix, 'Unexpected or partially persisted text' + assert all(count == 1 for count in Counter(found).values()), 'An edit was replayed twice' + assert set(found) <= intents, 'Text has no matching editing intent' + return set(found) + + persisted = tokens(current) + assert persisted <= possible, 'A definitively uncommitted edit appeared in storage' + assert {event['token'] for event in acknowledged} <= persisted, 'A durability-acknowledged edit was lost' + reads = [event for event in events if event['event'] == 'read'] + for read in reads: + observed = tokens(read['text']) + assert {event['token'] for event in acknowledged if event['finished_us'] < read['started_us']} <= observed, 'A read missed an acknowledged edit' + assert not {event['token'] for event in acknowledged if event['started_us'] > read['finished_us']} & observed, 'A read observed a future edit' + return {'acknowledged': len(acknowledged), 'retained': len(persisted), + 'unacknowledged_retained': sorted(persisted - {event['token'] for event in acknowledged}), + 'reads': len(reads), 'text': current} diff --git a/tools/document_model.py b/tools/document_model.py new file mode 100644 index 0000000000000000000000000000000000000000..3e64de11844ddb31ae238858b6c16b1c77fffa3f --- /dev/null +++ b/tools/document_model.py @@ -0,0 +1,58 @@ +"""Traversal of the exported document's referenced revisions.""" +import os +from pathlib import Path + +EXPORTER = Path(os.environ.get('ONESTORE_DOCUMENT', Path(__file__).resolve().parent.parent / 'target/debug/examples/document')) + +DEFAULT_CONTEXT = '{00000000-0000-0000-0000-000000000000},0' + + +def view(document, sid, context=DEFAULT_CONTEXT): + space = document['spaces'][sid] + rid = space['contexts'][context] + return rid, space['revisions'][rid] + + +def ordered_pages(document): + _, root = view(document, document['root']) + section = root['nodes'][root['roots']['1']] + if section['kind']['type'] == 'Encrypted': + return + assert section['kind']['type'] == 'Section' + for series in section['children']: + for space in root['nodes'][series]['spaces']: + rid, page = view(document, space) + manifest = page['nodes'][page['roots']['1']] + assert manifest['kind']['type'] == 'Manifest' + for oid in manifest['content']: + assert page['nodes'][oid]['kind']['type'] == 'Page' + yield space, rid, page, oid + + +def version_pages(document, sid, revision): + manifest = revision['nodes'][revision['roots']['1']]['kind'] + context = manifest['history'] + if context is None: + return + _, history = view(document, sid, context) + root = history['nodes'][history['roots']['1']] + assert root['kind']['type'] == 'VersionHistory' + for proxy_id in root['children']: + proxy = history['nodes'][proxy_id] + assert proxy['kind']['type'] == 'VersionProxy' + context = proxy['kind']['context'] + rid, revision = view(document, sid, context) + manifest = revision['nodes'][revision['roots']['1']] + assert manifest['kind']['type'] == 'Manifest' + for oid in manifest['content']: + assert revision['nodes'][oid]['kind']['type'] == 'Page' + yield context, rid, revision, oid, proxy + + +def walk(space, root): + pending = [root] + while pending: + oid = pending.pop() + node = space['nodes'][oid] + yield oid, node + pending.extend(reversed(node['structure'] + node['content'] + node['children'])) diff --git a/tools/feature_fixture.py b/tools/feature_fixture.py new file mode 100644 index 0000000000000000000000000000000000000000..ec9cc537cb36fa1426acc77dceb61ab50bbdb71d --- /dev/null +++ b/tools/feature_fixture.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +"""Generate schema-validated inputs for native document feature controls.""" +import argparse +import json +from pathlib import Path +import shutil +import wave + +from lxml import etree as ET +from PIL import Image + +ROOT = Path(__file__).resolve().parent.parent +NS = 'http://schemas.microsoft.com/office/onenote/2010/onenote' + + +def generate(destination): + destination.mkdir(parents=True, exist_ok=False) + notebook = destination / 'notebook' + shutil.copytree(ROOT / 'corpus/writer/create-notebook-01/notebook', notebook) + assets = notebook / 'fixture-data'; assets.mkdir() + image = Image.new('RGB', (96, 64)) + image.putdata([(x * 2, y * 3, (x + y) % 256) for y in range(64) for x in range(96)]) + for extension in ('png', 'jpg', 'bmp', 'tiff', 'gif'): + image.save(assets / ('pattern.' + extension)) + (assets / 'attachment.txt').write_bytes(b'Fictitious attachment\r\n\x00\xff\r\n') + with wave.open(str(assets / 'silence.wav'), 'wb') as sound: + sound.setparams((1, 2, 8000, 8000, 'NONE', 'not compressed')) + sound.writeframes(b'\0' * 16000) + fixture = {'sections': ['Features.one', 'Group A/Duplicate.one', 'Group B/Nested/Duplicate.one', 'Empty.one'], 'pages': []} + schema = ET.XMLSchema(ET.parse(str(ROOT / 'resources/onenote2010-com/OneNote2010.xsd'))) + + def page(title, content, section='Features.one', attributes='', definitions=''): + xml = f'{definitions}{title}{content}' + schema.assertValid(ET.fromstring(xml.encode())) + fixture['pages'].append({'section': section, 'xml': xml}) + + def outline(body, x=72, y=108): + return f'{body}' + + for extension in ('png', 'jpg', 'bmp', 'tiff', 'gif'): + body = f'' + page('Image ' + extension, body) + for background, printout in [('false', 'false'), ('true', 'false'), ('false', 'true'), ('true', 'true')]: + page(f'Image role background={background}, printout={printout}', f'' + outline('Foreground role control')) + page('Files and recording', outline('Recording annotation')) + page('Paragraph controls', outline('Inherited strike and spacingCentered paragraphمرحبا بالعالمCollapsed parentHidden child remains storedGrandchild
B        C]]>
'), definitions='') + body = '' + for sequence in range(5): + for index in range(2): + restart = ' restartNumberingAt="3"' if index == 0 else '' + body += f'Sequence {sequence}, item {index}' + page('Numbering controls', outline(body)) + page('Task controls', outline('Disabled standalone task')) + for section in ('Group A/Duplicate.one', 'Group B/Nested/Duplicate.one'): + for level in (1, 2, 3): + page('Repeated title', outline(f'Group path {section}, level {level}'), section, f'pageLevel="{level}"') + (notebook / 'fixture.json').write_text(json.dumps(fixture, ensure_ascii=False, indent=2)) + print(f'Generated {len(fixture["pages"])} schema-validated native pages; expected total {len(fixture["pages"]) + 1}.') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('destination', type=Path) + generate(parser.parse_args().destination) diff --git a/tools/history_campaign.py b/tools/history_campaign.py new file mode 100644 index 0000000000000000000000000000000000000000..be85a13109f45446fc3aa305c2c5d4a8c740ec29 --- /dev/null +++ b/tools/history_campaign.py @@ -0,0 +1,221 @@ +#!/usr/bin/env python3 +"""Generate and compare independently specified native edit histories.""" +import argparse +import copy +import json +from pathlib import Path +import random +import shutil +import signal +import subprocess +import tempfile +import xml.etree.ElementTree as ET + +from document_model import EXPORTER, ordered_pages +from native_xml import ns, Text, project_text + +ROOT = Path(__file__).resolve().parent.parent + + +def reduce_history(history): + state = copy.deepcopy(history['initial']) + for op in history['operations']: + kind = op['kind'] + if kind == 'insert': state['paragraphs'].insert(op['index'], copy.deepcopy(op['paragraph'])) + elif kind == 'delete': state['paragraphs'].pop(op['index']) + elif kind == 'move': state['paragraphs'].insert(op['to'], state['paragraphs'].pop(op['index'])) + elif kind == 'position': state['x'], state['y'] = op['x'], op['y'] + elif kind == 'cell': state['table'][op['row']][op['column']] = op['text'] + else: state['paragraphs'][op['index']][kind] = op['value'] + return state + + +def generate(destination, count, start=0): + destination.mkdir(parents=True, exist_ok=False) + notebook = destination / 'notebook' + shutil.copytree(ROOT / 'corpus/writer/create-notebook-01/notebook', notebook) + histories = [] + samples = ['Repeated words', 'café 東京 مرحبا', 'A😀e\u0301Z', 'literal & "quotes"', 'tabs\there', ' ]]> end', 'simple text'] + def paragraph(identifier, text): + return {'id': identifier, 'text': text, 'bold': False, 'italic': False, 'underline': False, + 'strike': False, 'color': '#000000', 'highlight': '#ffff00', 'font_size': 11, + 'link': '', 'tag': False} + kinds = ['text', 'bold', 'italic', 'underline', 'strike', 'color', 'highlight', 'font_size', 'link', 'tag', 'insert', 'delete', 'move', 'position', 'cell'] + for seed in range(start, start + count): + rng = random.Random(seed) + history = {'seed': seed, 'title': f'History {seed:06}', 'initial': { + 'paragraphs': [paragraph(f'p{i}', f'Initial {i}') for i in range(4)], + 'table': [[f'Cell {row},{column}' for column in range(2)] for row in range(2)], 'x': 72, 'y': 108}, 'operations': []} + for step in range(20): + state = reduce_history(history) + kind = kinds[step % len(kinds)] if seed < 3 else rng.choice(kinds) + index = rng.randrange(len(state['paragraphs'])) + op = {'kind': kind, 'index': index} + if kind == 'insert': op['paragraph'] = paragraph(f'new{step}', rng.choice(samples)) + elif kind == 'delete' and len(state['paragraphs']) == 1: op = {'kind': 'text', 'index': 0, 'value': rng.choice(samples)} + elif kind == 'move': op['to'] = rng.randrange(len(state['paragraphs'])) + elif kind == 'position': op.update(x=rng.randrange(1, 7) * 36, y=rng.randrange(2, 10) * 36) + elif kind == 'cell': op.update(row=rng.randrange(2), column=rng.randrange(2), text=rng.choice(samples)) + elif kind == 'text': op['value'] = rng.choice(samples) + elif kind in ('bold', 'italic', 'underline', 'strike', 'tag'): op['value'] = not state['paragraphs'][index][kind] + elif kind in ('color', 'highlight'): op['value'] = rng.choice(['#000000', '#ff0000', '#00ffff', '#ffff00', '#00ff00']) + elif kind == 'font_size': op['value'] = rng.choice([9, 11, 14, 18]) + elif kind == 'link': op['value'] = '' if state['paragraphs'][index]['link'] else f'https://example.invalid/{seed}/{step}?a=1&b=2' + history['operations'].append(op) + histories.append(history) + (notebook / 'histories.json').write_text(json.dumps(histories, ensure_ascii=False, indent=2)) + + +def compare(capture, seed=None): + histories = json.loads((capture / 'notebook/histories.json').read_text()) + if seed is not None: + histories = [h for h in histories if h['seed'] == seed] + if len(histories) != 1: + raise ValueError('The capture must contain exactly one history with this seed.') + native = {ET.parse(p).getroot().get('name'): ET.parse(p).getroot() for p in (capture / 'read').glob('page-*.xml')} + with tempfile.TemporaryDirectory() as temporary: + export = Path(temporary) / 'model' + subprocess.run([EXPORTER, capture / 'notebook/synthetic.one', export], check=True) + document = json.loads((export / 'document.json').read_text()) + resolved = json.loads((export / 'text.json').read_text()) + actual = {} + for sid, rid, space, oid in ordered_pages(document): + title = ''.join(n['kind']['text'] for n in space['nodes'].values() if n['kind']['type'] == 'RichText' and n['kind']['text'].startswith('History ')) + if title: actual[title] = (sid, rid, space, oid) + failures = [] + for history in histories: + try: + expected = reduce_history(history) + title = history['title']; page = native[title] + sid, rid, space, oid = actual[title] + outlines = [space['nodes'][i] for i in space['nodes'][oid]['children'] if space['nodes'][i]['kind']['type'] == 'Outline'] + assert len(outlines) == 1, (title, 'outline count') + native_outline = page.find('one:Outline', ns) + native_oes = native_outline.findall('one:OEChildren/one:OE', ns) + native_text = [n.find('one:T', ns) for n in native_oes if n.find('one:T', ns) is not None] + paragraphs = [space['nodes'][i] for i in outlines[0]['children']] + content = [p['content'][0] for p in paragraphs] + text_ids = [i for i in content if space['nodes'][i]['kind']['type'] == 'RichText'] + assert len(text_ids) == len(native_text) == len(expected['paragraphs']), (title, 'paragraph count') + for wanted, oid, native_t in zip(expected['paragraphs'], text_ids, native_text, strict=True): + runs = [r for r in resolved[sid][rid][oid] if not r['format']['hidden']] + assert ''.join(r['text'] for r in runs) == wanted['text'], (title, wanted['id'], 'Rust text') + assert ''.join(Text(native_t.text or '').parts) == project_text(wanted['text']), (title, wanted['id'], 'native text') + leading = len(wanted['text']) - len(wanted['text'].lstrip(' \t')) + actual_links = [r['link'] or '' for r in runs for _ in r['text']] + expected_links = ['' if index < leading else wanted['link'] for index in range(len(wanted['text']))] + assert actual_links == expected_links, (title, wanted['id'], 'hyperlink', actual_links, expected_links) + for r in runs: + if not r['text']: + continue + for flag in ('bold', 'italic', 'underline', 'strike'): + assert bool(r['format'][flag]) == (False if flag == 'underline' and wanted['link'] else wanted[flag]), (title, wanted['id'], flag) + assert r['format']['font_size'] == wanted['font_size'], (title, wanted['id'], 'font size') + for field in ('color', 'highlight'): + value = '#dbdb00' if field == 'color' and wanted[field] == '#ffff00' else wanted[field] + rgb = bytes.fromhex(value[1:]) + assert r['format'][field] == (0xff000000 if field == 'color' and wanted['link'] else int.from_bytes(rgb, 'little')), (title, wanted['id'], field, r['format'][field], wanted[field]) + tags = space['nodes'][oid]['tags'] + assert bool(tags) == wanted['tag'], (title, wanted['id'], 'tag') + table = [space['nodes'][i] for i in content if space['nodes'][i]['kind']['type'] == 'Table'] + assert len(table) == 1, (title, 'table count') + cells = [[ ''.join(r['text'] for paragraph in space['nodes'][cell]['children'] + for text in space['nodes'][paragraph]['content'] for r in resolved[sid][rid][text] if not r['format']['hidden']) + for cell in space['nodes'][row]['children']] for row in table[0]['children']] + assert cells == expected['table'], (title, 'table contents') + for axis in ('x', 'y'): + assert abs(outlines[0]['layout'][axis] - expected[axis]) < .002, (title, axis) + except AssertionError as failure: + failures.append(failure.args[0]) + (capture / 'history-differences.json').write_text(json.dumps(failures, ensure_ascii=False, indent=2)) + if failures: + raise AssertionError(failures[0]) + print(f'Passed {len(histories)} independently specified native histories, {sum(len(h["operations"]) for h in histories)} operations.') + + +def shrink(capture, destination, seed): + from native_runner import capture as native_capture + histories = json.loads((capture / 'notebook/histories.json').read_text()) + history, = [h for h in histories if h['seed'] == seed] + try: + compare(capture, seed) + except AssertionError as failure: + signature = failure.args[0][:3] + else: + raise ValueError('The selected history passes; there is no discrepancy to shrink.') + destination.mkdir(parents=True, exist_ok=False) + (destination / 'source.json').write_text(json.dumps({'capture': str(capture.resolve()), 'seed': seed, + 'signature': signature}, indent=2)) + attempt = 0 + + def reproduces(candidate): + nonlocal attempt + try: + reduce_history(candidate) + except IndexError: + return False + attempt += 1 + root = destination / f'attempt-{attempt:03}' + root.mkdir() + shutil.copytree(ROOT / 'corpus/writer/create-notebook-01/notebook', root / 'input') + (root / 'input/histories.json').write_text(json.dumps([candidate], ensure_ascii=False, indent=2)) + native_capture(root / 'input', root / 'capture', 2, ROOT / 'tools/native/history.ps1') + observed = None + try: + compare(root / 'capture', seed) + except AssertionError as failure: + observed = failure.args[0] + matches = observed is not None and observed[:3] == signature + (root / 'comparison.json').write_text(json.dumps({'discrepancy': observed, 'same_failure': matches}, indent=2)) + print(f'Shrink attempt {attempt}: {len(candidate["operations"])} operations; same discrepancy: {matches}', flush=True) + return matches + + if not reproduces(history): + raise ValueError('The original discrepancy did not reproduce in a fresh clone.') + granularity = 2 + while history['operations']: + operations = history['operations'] + width = max(1, (len(operations) + granularity - 1) // granularity) + for start in range(0, len(operations), width): + candidate = {**history, 'operations': operations[:start] + operations[start + width:]} + if reproduces(candidate): + history = candidate + granularity = max(2, granularity - 1) + break + else: + if width == 1: + break + granularity = min(len(operations), granularity * 2) + (destination / 'minimal.json').write_text(json.dumps(history, ensure_ascii=False, indent=2)) + for index, operation in enumerate(history['operations']): + choices = [] + if operation['kind'] == 'text': choices = [{'value': ''}, {'value': 'A'}] + elif operation['kind'] == 'cell': choices = [{'text': ''}, {'text': 'A'}] + elif operation['kind'] == 'position': choices = [{'x': 0, 'y': 0}] + elif operation['kind'] == 'font_size': choices = [{'value': 11}] + for replacement in choices: + candidate = copy.deepcopy(history) + candidate['operations'][index].update(replacement) + if candidate != history and reproduces(candidate): + history = candidate + break + (destination / 'minimal.json').write_text(json.dumps(history, ensure_ascii=False, indent=2)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + sub = parser.add_subparsers(dest='command', required=True) + generation = sub.add_parser('generate'); generation.add_argument('destination', type=Path) + generation.add_argument('--count', type=int, default=100); generation.add_argument('--start', type=int, default=0) + comparison = sub.add_parser('compare'); comparison.add_argument('capture', type=Path) + comparison.add_argument('--seed', type=int) + shrinking = sub.add_parser('shrink'); shrinking.add_argument('capture', type=Path) + shrinking.add_argument('destination', type=Path); shrinking.add_argument('--seed', type=int, required=True) + args = parser.parse_args() + if args.command == 'generate': generate(args.destination, args.count, args.start) + elif args.command == 'compare': compare(args.capture, args.seed) + else: + def interrupted(_signal, _frame): + raise KeyboardInterrupt + signal.signal(signal.SIGTERM, interrupted) + shrink(args.capture, args.destination, args.seed) diff --git a/tools/import-corpus.py b/tools/import-corpus.py new file mode 100644 index 0000000000000000000000000000000000000000..4299d53e3275a9a68b7a6cb167fae0c16b0b3f14 --- /dev/null +++ b/tools/import-corpus.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +"""Extract a native capture with links for identical files.""" +import hashlib +import os +from pathlib import Path, PurePosixPath +import sys +import zipfile + +archive, destination = map(Path, sys.argv[1:]) +destination.mkdir(parents=True, exist_ok=False) +seen = {} +with zipfile.ZipFile(archive) as captured: + for entry in captured.infolist(): + relative = PurePosixPath(entry.filename.replace('\\', '/')) + if relative.is_absolute() or '..' in relative.parts: + raise ValueError('Archive path escapes the corpus directory') + target = destination.joinpath(*relative.parts) + if entry.filename.endswith(('/', '\\')): + target.mkdir(parents=True, exist_ok=True) + continue + target.parent.mkdir(parents=True, exist_ok=True) + data = captured.read(entry) + digest = hashlib.sha256(data).digest() + if digest in seen: + target.symlink_to(os.path.relpath(seen[digest], target.parent)) + else: + target.write_bytes(data) + target.chmod(0o444) + seen[digest] = target +print(f'Imported {len(seen)} distinct files into {destination}') diff --git a/tools/native/cold.ps1 b/tools/native/cold.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..a0b99e7aeb86f4dc10032537800501a52ad65b4f --- /dev/null +++ b/tools/native/cold.ps1 @@ -0,0 +1,27 @@ +param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '') +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before resetting its test cache.' } +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ($CloneHost) { + if ($CloneHost -notmatch '^ONE-[A-Z0-9-]+$' -or [Environment]::MachineName -ne $CloneHost) { + throw 'The disposable clone hostname does not match this machine.' + } + New-Item "$key\Options\Paths" -Force | Out-Null + New-ItemProperty "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value 'C:\one-tests\Loose.one' -Force | Out-Null +} elseif ((Get-ItemProperty "$key\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before resetting the test cache.' +} +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$parked = Join-Path 'C:\one-tests\caches' ([IO.Path]::GetFileName($root)) +if (Test-Path $parked) { throw 'Choose a new run; its parked cache already exists.' } +New-Item -ItemType Directory -Path 'C:\one-tests\caches' -Force | Out-Null +if (Test-Path $cache) { Move-Item -LiteralPath $cache -Destination $parked } +if (Test-Path "$key\OpenNotebooks") { Remove-Item "$key\OpenNotebooks" -Recurse } +New-Item "$key\OpenNotebooks" | Out-Null +New-ItemProperty "$key\OpenNotebooks" -Name '1' -PropertyType String -Value "$root\notebook" | Out-Null diff --git a/tools/native/collaborate.ps1 b/tools/native/collaborate.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..4a13a4320675250d49eac958bd3a020ca3b882f6 --- /dev/null +++ b/tools/native/collaborate.ps1 @@ -0,0 +1,105 @@ +param([Parameter(Mandatory=$true)][string]$Root, + [Parameter(Mandatory=$true)][string]$SharedPath, + [Parameter(Mandatory=$true)][string]$CloneHost, + [switch]$ResumeCache, + [int]$StartSequence = 1) +function Keep-Container($page, $target) { + $container = $target + while ($container.ParentNode -ne $page.DocumentElement) { $container = $container.ParentNode } + foreach ($sibling in @($page.DocumentElement.ChildNodes)) { + if ($sibling -ne $container -and $sibling.LocalName -in @('Outline', 'Title', 'Image', 'InkDrawing')) { + [void]$page.DocumentElement.RemoveChild($sibling) + } + } +} +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +. "$PSScriptRoot\text.ps1" +if ($SharedPath -notmatch '^\\\\192\.168\.77\.1\\agent\\m6-[a-z0-9-]+$') { throw 'Choose a disposable Linux lab notebook.' } +if ($env:COMPUTERNAME -ne $CloneHost) { throw 'The collaboration controller requires its owned clone.' } +if (-not $ResumeCache) { & "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost } +$shared = $SharedPath +if (-not (Test-Path "$shared\synthetic.one")) { throw 'Create the shared fixture first.' } +New-Item -ItemType Directory "$Root\inbox", "$Root\outbox" -Force | Out-Null +$user = 'HKCU:\Software\Microsoft\Office\Common\UserInfo' +New-Item $user -Force | Out-Null +New-ItemProperty $user -Name UserName -Value $CloneHost -PropertyType String -Force | Out-Null +New-ItemProperty $user -Name UserInitials -Value $CloneHost.Substring($CloneHost.Length - 3) -PropertyType String -Force | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy($shared, '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + [IO.File]::WriteAllText("$Root\ready", 'ready') + $deadline = [DateTime]::UtcNow.AddMinutes(30) + $sequence = $StartSequence + while ([DateTime]::UtcNow -lt $deadline) { + $name = '{0:d4}.json' -f $sequence + $input = "$Root\inbox\$name" + if (-not (Test-Path $input)) { Start-Sleep -Milliseconds 100; continue } + $command = Get-Content -Raw -Encoding UTF8 $input | ConvertFrom-Json + $output = "$Root\outbox\$sequence" + New-Item -ItemType Directory $output | Out-Null + try { + if ($command.action -in @('prepare-stress', 'stress')) { + . "$PSScriptRoot\stress.ps1" + Invoke-Stress $app $section $command $output $shared + } + elseif ($command.action -eq 'sync') { $app.SyncHierarchy($notebook) } + elseif ($command.action -eq 'kill-process') { + Get-Process ONENOTE | Stop-Process -Force + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = New-Object -ComObject OneNote.Application + $app.OpenHierarchy($shared, '', [ref]$notebook, 0) + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + } + elseif ($command.action -eq 'edit' -or $command.action -eq 'snapshot') { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText("$output\hierarchy.xml", $hierarchy, [Text.Encoding]::UTF8) + [xml]$tree = $hierarchy + $matches = 0 + $editedPage = $null + $i = 0 + foreach ($node in $tree.SelectNodes('//*[local-name()="Page"]')) { + $content = '' + $app.GetPageContent($node.GetAttribute('ID'), [ref]$content, 1, 1) + [IO.File]::WriteAllText("$output\page-$i.xml", $content, [Text.Encoding]::UTF8) + [xml]$page = $content + if ($command.action -eq 'edit') { + $targets = @($page.SelectNodes('//*[local-name()="T"]') | Where-Object { + (Get-ParagraphText $_.InnerText) -eq $command.expected + }) + if ($targets.Count -gt 1) { throw 'Expected one matching text object.' } + if ($targets.Count -eq 1) { + $matches++ + if ($matches -gt 1) { throw 'The text occurs on multiple pages.' } + $targets[0].InnerText = [Security.SecurityElement]::Escape($command.text) + Keep-Container $page $targets[0] + $editedPage = $page + } + } + $i++ + } + if ($command.action -eq 'edit' -and $matches -ne 1) { throw 'Expected one matching text object.' } + if ($editedPage) { $app.UpdatePageContent($editedPage.OuterXml, [DateTime]::MinValue, 1, $false) } + } elseif ($command.action -ne 'close') { throw 'Unknown collaboration command.' } + [IO.File]::WriteAllText("$output\done", 'ok') + } catch { + [IO.File]::WriteAllText("$output\error", $_.Exception.ToString()) + } + if ($command.action -eq 'close') { break } + $sequence++ + } +} finally { + try { if ($notebook) { $app.CloseNotebook($notebook, $false) } } + finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + [IO.File]::WriteAllText("$Root\closed", 'closed') + } +} diff --git a/tools/native/corpus.ps1 b/tools/native/corpus.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..dc141982633ebed1b4bd9cd0b50274ddcff6ec6e --- /dev/null +++ b/tools/native/corpus.ps1 @@ -0,0 +1,667 @@ +<# +Usage: .\corpus.ps1 -Mode Create -Root C:\one-tests\runs\20260904-01 + .\corpus.ps1 -Mode Capture -Root C:\one-tests\runs\20260904-01 -Step 08-manual-ink +#> +[CmdletBinding()] +param( + [ValidateSet('Create', 'Capture')] + [string]$Mode = 'Create', + + [Parameter(Mandatory = $true)] + [string]$Root, + + [string]$Step +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +$schema = 1 +$namespace = 'http://schemas.microsoft.com/office/onenote/2010/onenote' +$runs = [IO.Path]::GetFullPath('C:\one-tests\runs').TrimEnd('\') +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +$markerPath = Join-Path $root '.native-corpus.json' +$manifestPath = Join-Path $root 'manifest.json' +$logPath = Join-Path $root 'operation-log.jsonl' +$notebookPath = Join-Path $root 'notebook' +$sectionName = 'synthetic.one' +$sectionPath = Join-Path $notebookPath $sectionName +$script:app = $null +$script:openedNotebookId = $null +$script:sectionId = $null +$script:manifest = $null + +function Write-Json { + param( + $Value, + [string]$Path + ) + + $Value | ConvertTo-Json -Depth 20 | Set-Content -LiteralPath $Path -Encoding UTF8 +} + +function Save-Manifest { + if ($null -ne $script:manifest) { + Write-Json $script:manifest $manifestPath + } +} + +function Add-Log { + param( + [string]$Action, + [string]$Fixture, + $Details + ) + + $entry = [pscustomobject][ordered]@{ + at_utc = [DateTime]::UtcNow.ToString('o') + fixture = $Fixture + action = $Action + details = $Details + } + $entry | ConvertTo-Json -Depth 12 -Compress | Add-Content -LiteralPath $logPath -Encoding UTF8 +} + +function Add-Fixture { + param( + [string]$Name, + [string]$Status, + [string]$Description, + $Details + ) + + $script:manifest.fixtures = @($script:manifest.fixtures) + [pscustomobject][ordered]@{ + name = $Name + status = $Status + description = $Description + at_utc = [DateTime]::UtcNow.ToString('o') + details = $Details + } + Save-Manifest +} + +function Assert-RunRoot { + $parent = [IO.Path]::GetDirectoryName($root) + if (-not [String]::Equals($parent, $runs, [StringComparison]::OrdinalIgnoreCase)) { + throw 'Choose a new direct child of C:\one-tests\runs.' + } + if ([String]::Equals($root, $runs, [StringComparison]::OrdinalIgnoreCase)) { + throw 'Choose a run directory below C:\one-tests\runs.' + } + + $oneTests = [IO.Path]::GetDirectoryName($runs) + if (-not (Test-Path -LiteralPath $oneTests -PathType Container)) { + throw 'Create C:\one-tests before running this harness.' + } + if (-not (Test-Path -LiteralPath $runs -PathType Container)) { + New-Item -ItemType Directory -Path $runs | Out-Null + } + if (((Get-Item -LiteralPath $runs -Force).Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0) { + throw 'C:\one-tests\runs cannot be a reparse point.' + } +} + +function Assert-PathUnderRoot { + param([string]$Path) + + $full = [IO.Path]::GetFullPath($Path) + if (-not $full.StartsWith("$root\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'The harness can write only below its run root.' + } + return $full +} + +function Get-TreeState { + param([string]$Path) + + $full = Assert-PathUnderRoot $Path + $files = @(Get-ChildItem -LiteralPath $full -Force -File -Recurse | Sort-Object FullName) + $entries = @( + foreach ($file in $files) { + $relative = $file.FullName.Substring($full.Length).TrimStart('\') + [pscustomobject][ordered]@{ + path = $relative + bytes = [int64]$file.Length + sha256 = (Get-FileHash -LiteralPath $file.FullName -Algorithm SHA256).Hash.ToLowerInvariant() + } + } + ) + $lines = @($entries | ForEach-Object { "$($_.path)`t$($_.bytes)`t$($_.sha256)" }) + $bytes = [Text.Encoding]::UTF8.GetBytes([String]::Join("`n", $lines)) + $treeHash = [Security.Cryptography.SHA256]::Create().ComputeHash($bytes) + [pscustomobject][ordered]@{ + file_count = $entries.Count + byte_count = [int64](($entries | Measure-Object -Property bytes -Sum).Sum) + sha256 = ([BitConverter]::ToString($treeHash) -replace '-', '').ToLowerInvariant() + files = $entries + } +} + +function Copy-Snapshot { + param([string]$Fixture) + + $snapshot = Join-Path (Join-Path $root 'snapshots') $Fixture + Assert-PathUnderRoot $snapshot | Out-Null + if (Test-Path -LiteralPath $snapshot) { + throw "Snapshot '$Fixture' already exists." + } + $before = Get-TreeState $notebookPath + New-Item -ItemType Directory -Path $snapshot | Out-Null + Copy-Item -LiteralPath $notebookPath -Destination $snapshot -Recurse -Force + $copied = Get-TreeState (Join-Path $snapshot 'notebook') + $after = Get-TreeState $notebookPath + if ($before.sha256 -ne $copied.sha256 -or $before.sha256 -ne $after.sha256) { + throw "Snapshot '$Fixture' changed while copying." + } + $state = [pscustomobject][ordered]@{ + source_before = [pscustomobject][ordered]@{ file_count = $before.file_count; byte_count = $before.byte_count; sha256 = $before.sha256 } + copied = [pscustomobject][ordered]@{ file_count = $copied.file_count; byte_count = $copied.byte_count; sha256 = $copied.sha256 } + source_after = [pscustomobject][ordered]@{ file_count = $after.file_count; byte_count = $after.byte_count; sha256 = $after.sha256 } + files = $copied.files + } + Write-Json $state (Join-Path $snapshot 'snapshot.json') + return $state +} + +function Assert-NotebookPaths { + param([string]$Hierarchy) + + [xml]$document = $Hierarchy + foreach ($node in @($document.SelectNodes('//*[@path]'))) { + $path = $node.GetAttribute('path') + if (-not [String]::IsNullOrWhiteSpace($path)) { + $full = [IO.Path]::GetFullPath($path) + if (-not $full.StartsWith("$notebookPath\", [StringComparison]::OrdinalIgnoreCase) -and + -not [String]::Equals($full.TrimEnd('\'), $notebookPath, [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote returned a hierarchy path outside the generated notebook.' + } + } + } + return $document +} + +function Get-PageXml { + param([string]$PageId) + + $page = '' + $script:app.GetPageContent($PageId, [ref]$page, 3, $schema) + return $page +} + +function Get-PageIds { + param([xml]$Hierarchy) + + $manager = New-Object Xml.XmlNamespaceManager($Hierarchy.NameTable) + $manager.AddNamespace('one', $namespace) + return @($Hierarchy.SelectNodes('//one:Page', $manager) | ForEach-Object { $_.GetAttribute('ID') }) +} + +function Read-ReadyGeneratedNotebook { + param([int]$ExpectedPageCount = -1) + + if ([String]::IsNullOrWhiteSpace($script:openedNotebookId) -or [String]::IsNullOrWhiteSpace($script:sectionId)) { + throw 'The generated notebook and section must be open before readiness is checked.' + } + $deadline = (Get-Date).AddSeconds(15) + $lastError = $null + while ((Get-Date) -lt $deadline) { + try { + $hierarchy = '' + $script:app.GetHierarchy($script:openedNotebookId, 4, [ref]$hierarchy, $schema) + $document = Assert-NotebookPaths $hierarchy + $manager = New-Object Xml.XmlNamespaceManager($document.NameTable) + $manager.AddNamespace('one', $namespace) + $sections = @($document.SelectNodes('//one:Section', $manager) | Where-Object { + [String]::Equals($_.GetAttribute('ID'), $script:sectionId, [StringComparison]::OrdinalIgnoreCase) -and + [String]::Equals([IO.Path]::GetFullPath($_.GetAttribute('path')).TrimEnd('\'), $sectionPath, [StringComparison]::OrdinalIgnoreCase) + }) + if ($sections.Count -ne 1) { throw 'OneNote has not returned the generated section in the hierarchy.' } + $pageIds = @(Get-PageIds $document | Where-Object { -not [String]::IsNullOrWhiteSpace($_) }) + if ($ExpectedPageCount -ge 0 -and $pageIds.Count -ne $ExpectedPageCount) { + throw "Expected $ExpectedPageCount persisted pages, found $($pageIds.Count)." + } + $pageContents = @() + foreach ($pageId in $pageIds) { + $pageContents += Get-PageXml $pageId + } + return [pscustomobject][ordered]@{ + hierarchy = $hierarchy + page_ids = $pageIds + page_contents = $pageContents + } + } + catch { + $lastError = $_.Exception.Message + Start-Sleep -Milliseconds 250 + } + } + throw "OneNote did not return the generated section ready for capture: $lastError" +} + +function Get-SolePageId { + $state = Read-ReadyGeneratedNotebook + $pages = @($state.page_ids) + if ($pages.Count -ne 1 -or [String]::IsNullOrWhiteSpace($pages[0])) { + throw 'The generated notebook must contain exactly one page.' + } + return $pages[0] +} + +function Confirm-Closed { + param([string]$NotebookId) + + $probe = '' + $closed = $false + try { + $script:app.GetHierarchy($NotebookId, 0, [ref]$probe, $schema) + $closed = [String]::IsNullOrWhiteSpace($probe) + } + catch { + $closed = $true + } + if (-not $closed) { + throw 'OneNote still reports the generated notebook as open.' + } +} + +function Write-PageEvidence { + param( + [string]$Directory, + [string]$Hierarchy, + [string[]]$PageIds, + [string[]]$PageContents + ) + + if ($PageIds.Count -ne $PageContents.Count) { + throw 'Page evidence is incomplete.' + } + Assert-PathUnderRoot $Directory | Out-Null + $pagesDirectory = Join-Path $Directory 'pages' + New-Item -ItemType Directory -Path $pagesDirectory | Out-Null + [IO.File]::WriteAllText((Join-Path $Directory 'hierarchy.xml'), $Hierarchy, [Text.Encoding]::UTF8) + $pages = @() + for ($index = 0; $index -lt $PageIds.Count; $index++) { + $pageFile = 'page-{0:d2}.xml' -f $index + [IO.File]::WriteAllText((Join-Path $pagesDirectory $pageFile), $PageContents[$index], [Text.Encoding]::UTF8) + $pages += [pscustomobject][ordered]@{ id = $PageIds[$index]; file = "pages\\$pageFile" } + } + return $pages +} + +function Open-GeneratedNotebook { + param([int]$ExpectedPageCount = -1) + + $opened = '' + $script:app.OpenHierarchy($notebookPath, '', [ref]$opened, 0) + if ([String]::IsNullOrWhiteSpace($opened)) { + throw 'OneNote did not open the generated notebook.' + } + $script:openedNotebookId = $opened + $section = '' + $script:app.OpenHierarchy($sectionName, $opened, [ref]$section, 0) + if ([String]::IsNullOrWhiteSpace($section)) { + throw 'OneNote did not find the generated section.' + } + $script:sectionId = $section + $state = Read-ReadyGeneratedNotebook $ExpectedPageCount + Add-Log 'open_notebook' $null @{ notebook_id = $opened; path = $notebookPath; expected_page_count = if ($ExpectedPageCount -ge 0) { $ExpectedPageCount } else { $null }; actual_page_count = $state.page_ids.Count } + return $state +} + +function Sync-CloseGeneratedNotebook { + param( + [string]$Fixture, + [string]$Phase + ) + + $closingId = $script:openedNotebookId + if ([String]::IsNullOrWhiteSpace($closingId)) { throw 'The generated notebook must be open before it is synced.' } + $script:app.SyncHierarchy($closingId) + Add-Log 'sync_hierarchy' $Fixture @{ notebook_id = $closingId; phase = $Phase } + $script:app.CloseNotebook($closingId, $false) + $script:openedNotebookId = $null + Confirm-Closed $closingId + Add-Log 'close_notebook' $Fixture @{ notebook_id = $closingId; phase = $Phase; confirmed = $true } +} + +function Capture-Notebook { + param([string]$Fixture) + + $evidence = Join-Path (Join-Path $root 'evidence') $Fixture + Assert-PathUnderRoot $evidence | Out-Null + if (Test-Path -LiteralPath $evidence) { + throw "Evidence '$Fixture' already exists." + } + $baseline = Read-ReadyGeneratedNotebook + $expectedPageCount = $baseline.page_ids.Count + Sync-CloseGeneratedNotebook $Fixture 'stabilize' + $snapshot = Copy-Snapshot $Fixture + Add-Log 'copy_snapshot' $Fixture @{ sha256 = $snapshot.copied.sha256; file_count = $snapshot.copied.file_count; byte_count = $snapshot.copied.byte_count } + $state = Open-GeneratedNotebook $expectedPageCount + + New-Item -ItemType Directory -Path $evidence | Out-Null + $pages = @(Write-PageEvidence $evidence $state.hierarchy $state.page_ids $state.page_contents) + if ($Fixture -eq '06-attachment') { + $cachePaths = @( + foreach ($pageXml in @($state.page_contents)) { + [xml]$pageDocument = $pageXml + $manager = New-Object Xml.XmlNamespaceManager($pageDocument.NameTable) + $manager.AddNamespace('one', $namespace) + foreach ($file in @($pageDocument.SelectNodes('//one:InsertedFile', $manager))) { + if ($file.GetAttribute('preferredName') -eq 'fictitious-attachment.txt' -and -not [String]::IsNullOrWhiteSpace($file.GetAttribute('pathCache'))) { + $file.GetAttribute('pathCache') + } + } + } + ) + if ($cachePaths.Count -ne 1 -or -not (Test-Path -LiteralPath $cachePaths[0] -PathType Leaf)) { + throw 'OneNote did not return one readable cached generated attachment.' + } + $attachment = [IO.File]::ReadAllBytes($cachePaths[0]) + [IO.File]::WriteAllBytes((Join-Path $evidence 'attachment.txt'), $attachment) + Add-Log 'capture_attachment_cache' $Fixture @{ bytes = $attachment.Length } + } + $native = [pscustomobject][ordered]@{ + fixture = $Fixture + notebook_id = $script:openedNotebookId + section_id = $script:sectionId + hierarchy_file = 'hierarchy.xml' + pages = $pages + } + Write-Json $native (Join-Path $evidence 'native.json') + Add-Log 'capture_native_api' $Fixture @{ page_count = $pages.Count; schema = $schema } + + Sync-CloseGeneratedNotebook $Fixture 'persist' + $reopened = Open-GeneratedNotebook $expectedPageCount + $reopenedDirectory = Join-Path $evidence 'reopened' + if (Test-Path -LiteralPath $reopenedDirectory) { throw "Reopened evidence for '$Fixture' already exists." } + New-Item -ItemType Directory -Path $reopenedDirectory | Out-Null + $reopenedPages = @(Write-PageEvidence $reopenedDirectory $reopened.hierarchy $reopened.page_ids $reopened.page_contents) + Write-Json ([pscustomobject][ordered]@{ + expected_page_count = $expectedPageCount + actual_page_count = $reopenedPages.Count + hierarchy_file = 'hierarchy.xml' + pages = $reopenedPages + }) (Join-Path $reopenedDirectory 'native.json') + Add-Log 'reopen_ready' $Fixture @{ expected_page_count = $expectedPageCount; actual_page_count = $reopenedPages.Count } + return [pscustomobject][ordered]@{ + evidence = $evidence.Substring($root.Length).TrimStart('\') + reopened_evidence = (Join-Path (Join-Path 'evidence' $Fixture) 'reopened') + snapshot = (Join-Path 'snapshots' $Fixture) + } +} + +function Invoke-Step { + param( + [string]$Name, + [string]$Description, + [scriptblock]$Action + ) + + try { + Add-Log 'begin_fixture' $Name @{ description = $Description } + & $Action + $capture = Capture-Notebook $Name + Add-Fixture $Name 'captured' $Description $capture + } + catch { + Add-Log 'fixture_failed' $Name @{ error = $_.Exception.Message } + Add-Fixture $Name 'failed' $Description @{ error = $_.Exception.Message } + throw + } +} + +function Invoke-PageUpdate { + param( + [string]$Fixture, + [string]$Xml, + $Details + ) + + $input = Join-Path (Join-Path $root 'inputs') "$Fixture.xml" + Assert-PathUnderRoot $input | Out-Null + [IO.File]::WriteAllText($input, $Xml, [Text.Encoding]::UTF8) + $script:app.UpdatePageContent($Xml, [DateTime]::MinValue, $schema, $false) + Add-Log 'update_page_content' $Fixture $Details +} + +function Get-OfficeMetadata { + $clsid = (Get-Item -LiteralPath 'Registry::HKEY_CLASSES_ROOT\OneNote.Application\CLSID').GetValue('') + $server = (Get-Item -LiteralPath "Registry::HKEY_CLASSES_ROOT\CLSID\$clsid\LocalServer32").GetValue('') + $match = [regex]::Match($server, '^"(?[^"]+\.exe)"|^(?[^\s]+\.exe)', [Text.RegularExpressions.RegexOptions]::IgnoreCase) + if (-not $match.Success) { + throw 'OneNote LocalServer32 does not resolve an executable.' + } + $path = $match.Groups['path'].Value + if (-not (Test-Path -LiteralPath $path -PathType Leaf)) { + throw 'OneNote LocalServer32 executable is unavailable.' + } + $version = (Get-Item -LiteralPath $path).VersionInfo.FileVersion + if ([String]::IsNullOrWhiteSpace($version)) { + throw 'OneNote executable has no file version.' + } + return [pscustomobject][ordered]@{ + prog_id = 'OneNote.Application' + clsid = $clsid + local_server = $server + executable = $path + file_version = $version + xml_schema = 'xs2010' + xml_schema_value = $schema + xml_namespace = $namespace + } +} + +function Wait-ForStableFile { + param([string]$Path) + + $full = Assert-PathUnderRoot $Path + $deadline = (Get-Date).AddSeconds(30) + while ((Get-Date) -lt $deadline) { + if (Test-Path -LiteralPath $full -PathType Leaf) { + $first = Get-Item -LiteralPath $full + $firstHash = (Get-FileHash -LiteralPath $full -Algorithm SHA256).Hash.ToLowerInvariant() + Start-Sleep -Milliseconds 500 + $second = Get-Item -LiteralPath $full + $secondHash = (Get-FileHash -LiteralPath $full -Algorithm SHA256).Hash.ToLowerInvariant() + if ($first.Length -eq $second.Length -and $firstHash -eq $secondHash) { + return [pscustomobject][ordered]@{ bytes = [int64]$second.Length; sha256 = $secondHash } + } + } + Start-Sleep -Milliseconds 500 + } + throw 'OneNote did not finish writing the package within 30 seconds.' +} + +$profile = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +if ((Get-ItemProperty "$profile\Options\Paths").UnfiledNotesSection -ne 'C:\one-tests\Loose.one' -or + -not (Test-Path 'C:\one-tests\profile-original-cache')) { + throw 'Park the personal OneNote profile before running native tests.' +} +if (Get-Process ONENOTE -ErrorAction SilentlyContinue) { throw 'Close OneNote before creating fixtures.' } +Assert-RunRoot + +if ($Mode -eq 'Create') { + if (Test-Path -LiteralPath $root) { + throw 'Choose a root that does not exist.' + } + New-Item -ItemType Directory -Path $root | Out-Null + foreach ($directory in 'assets', 'evidence', 'inputs', 'snapshots') { + New-Item -ItemType Directory -Path (Join-Path $root $directory) | Out-Null + } + Write-Json ([pscustomobject][ordered]@{ + format = 'onenote-native-stage1-root-v1' + root = $root + generated = $true + }) $markerPath + $script:manifest = [pscustomobject][ordered]@{ + format = 'onenote-native-stage1-v1' + status = 'running' + root = $root + created_at_utc = [DateTime]::UtcNow.ToString('o') + office = Get-OfficeMetadata + harness = [pscustomobject][ordered]@{ + source_path = $PSCommandPath + source_sha256 = (Get-FileHash -LiteralPath $PSCommandPath -Algorithm SHA256).Hash.ToLowerInvariant() + } + notebook = [pscustomobject][ordered]@{ path = 'notebook'; section = $sectionName } + fixtures = @() + operation_log = 'operation-log.jsonl' + } + Save-Manifest +} +else { + if (-not (Test-Path -LiteralPath $root -PathType Container) -or -not (Test-Path -LiteralPath $markerPath -PathType Leaf)) { + throw 'Capture requires a generated corpus root.' + } + if (((Get-Item -LiteralPath $root -Force).Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0) { + throw 'Capture root cannot be a reparse point.' + } + if (-not (Test-Path -LiteralPath $manifestPath -PathType Leaf) -or -not (Test-Path -LiteralPath $notebookPath -PathType Container)) { + throw 'Capture requires the generated manifest and notebook.' + } + try { + $marker = Get-Content -LiteralPath $markerPath -Raw | ConvertFrom-Json + } + catch { + throw 'Capture requires a readable generated corpus marker.' + } + if ($marker.format -ne 'onenote-native-stage1-root-v1' -or $marker.generated -ne $true -or + -not [String]::Equals([IO.Path]::GetFullPath($marker.root).TrimEnd('\'), $root, [StringComparison]::OrdinalIgnoreCase)) { + throw 'Capture root marker does not match this generated corpus.' + } + if ([String]::IsNullOrWhiteSpace($Step) -or $Step -notmatch '^[0-9]{2}-[a-z0-9-]+$') { + throw 'Choose a lowercase numbered fixture name for -Step.' + } + $script:manifest = Get-Content -LiteralPath $manifestPath -Raw | ConvertFrom-Json +} + +try { + $script:app = New-Object -ComObject OneNote.Application + Add-Log 'connect_com' $null @{ prog_id = 'OneNote.Application'; schema = $schema } + + if ($Mode -eq 'Capture') { + Open-GeneratedNotebook + $capture = Capture-Notebook $Step + Add-Fixture $Step 'captured' 'Manual native fixture.' $capture + } + else { + $attachmentPath = Join-Path $root 'assets\fictitious-attachment.txt' + $imagePath = Join-Path $root 'assets\fictitious-image.png' + [IO.File]::WriteAllText($attachmentPath, 'Fictitious attachment for native corpus.', [Text.Encoding]::UTF8) + [IO.File]::WriteAllBytes($imagePath, [Convert]::FromBase64String('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoAAAAASUVORK5CYII=')) + Add-Log 'generate_assets' $null @{ attachment = 'assets\fictitious-attachment.txt'; image = 'assets\fictitious-image.png' } + + Invoke-Step '00-empty' 'New notebook and section.' { + $notebook = '' + $script:app.OpenHierarchy($notebookPath, '', [ref]$notebook, 1) + if ([String]::IsNullOrWhiteSpace($notebook)) { throw 'OneNote did not create the generated notebook.' } + $script:openedNotebookId = $notebook + $section = '' + $script:app.OpenHierarchy($sectionName, $notebook, [ref]$section, 3) + if ([String]::IsNullOrWhiteSpace($section)) { throw 'OneNote did not create the generated section.' } + $script:sectionId = $section + Add-Log 'create_notebook_section' '00-empty' @{ notebook_id = $notebook; section_id = $section; path = $notebookPath } + } + + Invoke-Step '01-blank-page' 'Blank page with no title.' { + $page = '' + $script:app.CreateNewPage($script:sectionId, [ref]$page, 2) + if ([String]::IsNullOrWhiteSpace($page)) { throw 'OneNote did not create the blank page.' } + Add-Log 'create_new_page' '01-blank-page' @{ page_id = $page; style = 'npsBlankPageNoTitle'; value = 2 } + } + + Invoke-Step '02-text' 'Plain text outline.' { + $pageId = Get-SolePageId + $body = '' + $xml = "$body" + Invoke-PageUpdate '02-text' $xml @{ page_id = $pageId; kind = 'plain_text_outline'; input = 'inputs\\02-text.xml' } + } + + Invoke-Step '03-format-unicode' 'Formatted Unicode text replacing the fetched outline.' { + $pageId = Get-SolePageId + $before = Get-PageXml $pageId + [IO.File]::WriteAllText((Join-Path $root 'evidence\03-format-unicode-before.xml'), $before, [Text.Encoding]::UTF8) + [xml]$source = $before + $manager = New-Object Xml.XmlNamespaceManager($source.NameTable) + $manager.AddNamespace('one', $namespace) + $outline = $source.SelectSingleNode('//one:Outline[@objectID]', $manager) + if ($null -eq $outline) { throw 'OneNote did not assign an objectID to the text outline.' } + $text = $outline.SelectSingleNode('.//one:T', $manager) + if ($null -eq $text) { throw 'The fetched text outline has no text node.' } + foreach ($child in @($text.ChildNodes)) { [void]$text.RemoveChild($child) } + $unicode = 'Fictitious: caf' + [char]0x00E9 + ', ' + [char]0x6771 + [char]0x4EAC + ', ' + [char]0x0645 + [char]0x0631 + [char]0x062D + [char]0x0628 + [char]0x0627 + $html = '' + $unicode + '' + [void]$text.AppendChild($source.CreateCDataSection($html)) + $change = New-Object Xml.XmlDocument + $page = $change.CreateElement('one', 'Page', $namespace) + $page.SetAttribute('ID', $pageId) + [void]$page.AppendChild($change.ImportNode($outline, $true)) + [void]$change.AppendChild($page) + Invoke-PageUpdate '03-format-unicode' $change.OuterXml @{ page_id = $pageId; object_id = $outline.GetAttribute('objectID'); kind = 'full_outline_replace'; input = 'inputs\\03-format-unicode.xml' } + } + + Invoke-Step '04-positioned-outline' 'Positioned text outline.' { + $pageId = Get-SolePageId + $body = '' + $xml = "$body" + Invoke-PageUpdate '04-positioned-outline' $xml @{ page_id = $pageId; x = 144; y = 96; input = 'inputs\\04-positioned-outline.xml' } + } + + Invoke-Step '05-image' 'Generated PNG in a positioned outline.' { + $pageId = Get-SolePageId + $data = [Convert]::ToBase64String([IO.File]::ReadAllBytes($imagePath)) + $body = '' + $data + '' + $xml = "$body" + Invoke-PageUpdate '05-image' $xml @{ page_id = $pageId; asset = 'assets\fictitious-image.png'; x = 144; y = 192; input = 'inputs\\05-image.xml' } + } + + Invoke-Step '06-attachment' 'Generated attachment in a positioned outline.' { + $pageId = Get-SolePageId + $body = '' + $xml = "$body" + Invoke-PageUpdate '06-attachment' $xml @{ page_id = $pageId; asset = 'assets\fictitious-attachment.txt'; x = 264; y = 192; input = 'inputs\\06-attachment.xml' } + } + + Invoke-Step '07-table' 'Two-cell native table.' { + $pageId = Get-SolePageId + $body = '' + $xml = "$body" + Invoke-PageUpdate '07-table' $xml @{ page_id = $pageId; x = 144; y = 312; input = 'inputs\\07-table.xml'; kind = 'two_cell_table' } + } + + try { + $packagePath = Join-Path $root 'notebook.onepkg' + $script:app.Publish($script:openedNotebookId, $packagePath, 1, '') + $package = Wait-ForStableFile $packagePath + $capture = Capture-Notebook '08-onepkg' + Add-Fixture '08-onepkg' 'captured' 'Published OneNote package.' @{ package = 'notebook.onepkg'; bytes = $package.bytes; sha256 = $package.sha256; capture = $capture } + Add-Log 'publish_package' '08-onepkg' @{ package = 'notebook.onepkg'; bytes = $package.bytes; sha256 = $package.sha256 } + } + catch { + Add-Log 'fixture_failed' '08-onepkg' @{ error = $_.Exception.Message } + Add-Fixture '08-onepkg' 'failed' 'Published OneNote package.' @{ error = $_.Exception.Message } + } + } + + $script:manifest.status = if (@($script:manifest.fixtures | Where-Object { $_.status -eq 'failed' }).Count -gt 0) { 'completed-with-failures' } else { 'completed' } + $script:manifest | Add-Member -NotePropertyName completed_at_utc -NotePropertyValue ([DateTime]::UtcNow.ToString('o')) -Force + Save-Manifest +} +catch { + if ($null -ne $script:manifest) { + $script:manifest.status = 'failed' + $script:manifest | Add-Member -NotePropertyName failure -NotePropertyValue $_.Exception.Message -Force + Save-Manifest + } + throw +} +finally { + if ($null -ne $script:app -and -not [String]::IsNullOrWhiteSpace($script:openedNotebookId)) { + try { + $script:app.CloseNotebook($script:openedNotebookId, $false) + } + catch { + } + } +} diff --git a/tools/native/delete-fixture.ps1 b/tools/native/delete-fixture.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..96bca7fa117f938a5d541193ededb7fd3460cdc1 --- /dev/null +++ b/tools/native/delete-fixture.ps1 @@ -0,0 +1,36 @@ +param([Parameter(Mandatory=$true)][string]$Root) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { throw 'Choose a run directly below C:\one-tests\runs.' } +& "$PSScriptRoot\cold-current.ps1" -Root $root +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy("$root\notebook", '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + $page = '' + $app.CreateNewPage($section, [ref]$page, 2) + $xml = 'Recoverable deletion marker.' + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $false) + $app.SyncHierarchy($notebook) + $app.CloseNotebook($notebook, $false) + Copy-Item "$root\notebook" "$root\before" -Recurse + $app.OpenHierarchy("$root\notebook", '', [ref]$notebook, 0) + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$tree = $hierarchy + $target = @($tree.SelectNodes('//*[local-name()="Page"]') | Where-Object { $_.GetAttribute('name') -eq 'Recoverable deletion marker.' }) + if ($target.Count -ne 1) { throw 'The generated deletion page did not persist.' } + $app.DeleteHierarchy($target[0].GetAttribute('ID'), [DateTime]::MinValue, $false) + $app.SyncHierarchy($notebook) +} finally { + if ($notebook) { $app.CloseNotebook($notebook, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 +} diff --git a/tools/native/edit-existing.ps1 b/tools/native/edit-existing.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..702022a99e4d6df2c3db94deee92fefa3965fce8 --- /dev/null +++ b/tools/native/edit-existing.ps1 @@ -0,0 +1,46 @@ +param([Parameter(Mandatory=$true)][string]$Root, + [Parameter(Mandatory=$true)][string]$ExpectedText, + [Parameter(Mandatory=$true)][string]$Text) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { throw 'Choose a run directly below C:\one-tests\runs.' } +& "$PSScriptRoot\cold-current.ps1" -Root $root +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy("$root\notebook", '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + $deadline = [DateTime]::UtcNow.AddSeconds(30) + $matches = @() + do { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$tree = $hierarchy + $pages = @($tree.SelectNodes('//*[local-name()="Page"]')) + if ($pages.Count -gt 1) { throw 'Expected a single demo page.' } + if ($pages.Count -eq 1) { + $content = '' + $app.GetPageContent($pages[0].GetAttribute('ID'), [ref]$content, 3, 1) + [xml]$page = $content + $matches = @($page.SelectNodes('//*[local-name()="T"]') | Where-Object { $_.InnerText -eq $ExpectedText }) + if ($matches.Count -eq 1) { break } + } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if ($matches.Count -ne 1) { throw 'Expected one matching demo text object.' } + [IO.File]::WriteAllText("$root\before.xml", $content, [Text.Encoding]::UTF8) + $matches[0].InnerText = [Security.SecurityElement]::Escape($Text) + $app.UpdatePageContent($page.OuterXml, [DateTime]::MinValue, 1, $false) + $app.SyncHierarchy($notebook) +} finally { + try { if ($notebook) { $app.CloseNotebook($notebook, $false) } } + finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/tools/native/features.ps1 b/tools/native/features.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..e80700176b8dc71e8dd0fef31e29e2e1fa37c2be --- /dev/null +++ b/tools/native/features.ps1 @@ -0,0 +1,58 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$namespace = 'http://schemas.microsoft.com/office/onenote/2010/onenote' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sectionId = '' + $app.OpenHierarchy('synthetic.one', $notebookId, [ref]$sectionId, 0) + $cases = @( + @{ name = 'Black highlight control'; html = 'Black highlight, automatic text' }, + @{ name = 'White on black'; html = 'White text on black highlight' }, + @{ name = 'Black on black'; html = 'Black text on black highlight' }, + @{ name = 'Partial black highlight'; html = 'Before middle after' }, + @{ name = 'Yellow control'; html = 'Yellow highlight, automatic text' }, + @{ name = 'Character styles'; html = 'Plain bold italic underline strike super sub font and color' }, + @{ name = 'Unicode runs'; html = 'BMP ' + [char]::ConvertFromUtf32(0x1F600) + 'e' + [char]0x0301 + ' ' + [char]0x6771 + [char]0x4EAC + ' ' + [char]0x0645 + [char]0x0631 + [char]0x062D + [char]0x0628 + [char]0x0627 + '' }, + @{ name = 'Link runs'; html = 'Before Link label after' } + ) + $pageId = '' + $app.CreateNewPage($sectionId, [ref]$pageId, 0) + $body = '' + foreach ($case in $cases) { $body += '' } + $body += '' + $body = '' + $body + $body += '' + $body += '' + $body += '' + $body += '' + $body += '' + $body += '' + foreach ($row in 0..2) { + $body += '' + foreach ($column in 0..1) { + $body += '' + } + $body += '' + } + $body += '' + + $xml = '' + $body + '' + [IO.File]::WriteAllText((Join-Path $inputs 'format-probes.xml'), $xml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $true) + $cases | ConvertTo-Json -Depth 8 | Set-Content (Join-Path $Root 'expected.json') -Encoding UTF8 + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/tools/native/history.ps1 b/tools/native/history.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..cd461e15bee637b103b71825f377ee519998bf96 --- /dev/null +++ b/tools/native/history.ps1 @@ -0,0 +1,83 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$histories = Get-Content (Join-Path $Root 'notebook\histories.json') -Raw -Encoding UTF8 | ConvertFrom-Json +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$namespace = 'http://schemas.microsoft.com/office/onenote/2010/onenote' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sectionId = '' + $app.OpenHierarchy('synthetic.one', $notebookId, [ref]$sectionId, 0) + foreach ($history in $histories) { + $pageId = '' + $app.CreateNewPage($sectionId, [ref]$pageId, 0) + $state = $history.initial + $paragraphs = New-Object Collections.ArrayList + foreach ($paragraph in $state.paragraphs) { [void]$paragraphs.Add($paragraph) } + $ids = @{} + $outlineId = '' + for ($step = -1; $step -lt $history.operations.Count; $step++) { + if ($step -ge 0) { + $op = $history.operations[$step] + switch ($op.kind) { + 'insert' { $paragraphs.Insert($op.index, $op.paragraph) } + 'delete' { $paragraphs.RemoveAt($op.index) } + 'move' { $paragraph = $paragraphs[$op.index]; $paragraphs.RemoveAt($op.index); $paragraphs.Insert($op.to, $paragraph) } + 'position' { $state.x = $op.x; $state.y = $op.y } + 'cell' { $state.table[$op.row][$op.column] = $op.text } + default { $property = $op.kind; $paragraphs[$op.index].$property = $op.value } + } + } + $xml = '' + $history.title + '' + foreach ($paragraph in $paragraphs) { + $xml += '' + [Security.SecurityElement]::Escape($paragraph.text) + '' + if ($paragraph.link) { $html = '' + $html + '' } + $xml += '' + } + $xml += '' + foreach ($row in $state.table) { + $xml += '' + foreach ($cell in $row) { $xml += '' } + $xml += '' + } + $xml += '' + [IO.File]::WriteAllText((Join-Path $inputs ('{0:d6}-{1:d2}.xml' -f $history.seed, ($step + 1))), $xml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $true) + $content = '' + $app.GetPageContent($pageId, [ref]$content, 3, 1) + [xml]$document = $content + $manager = New-Object Xml.XmlNamespaceManager($document.NameTable) + $manager.AddNamespace('one', $namespace) + $outline = $document.SelectSingleNode('/one:Page/one:Outline', $manager) + $outlineId = $outline.GetAttribute('objectID') + $objects = @($outline.SelectNodes('one:OEChildren/one:OE[one:T]', $manager)) + if ($objects.Count -ne $paragraphs.Count) { throw "Native paragraph count changed at seed $($history.seed), step $step." } + for ($index = 0; $index -lt $paragraphs.Count; $index++) { $ids[$paragraphs[$index].id] = $objects[$index].GetAttribute('objectID') } + $log = @{ seed = $history.seed; step = $step; page = $pageId; outline = $outlineId } | ConvertTo-Json -Compress + [IO.File]::AppendAllText((Join-Path $Root 'operations.jsonl'), $log + [Environment]::NewLine, [Text.Encoding]::UTF8) + } + } + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/tools/native/ink.ahk b/tools/native/ink.ahk new file mode 100644 index 0000000000000000000000000000000000000000..025f590cae20a02bb291b50fdc2d37f18d88167f --- /dev/null +++ b/tools/native/ink.ahk @@ -0,0 +1,17 @@ +SendMode("Event") +WinActivate("ahk_class Framework::CFrame") +WinMaximize() +Click(258,36) +Sleep(300) +Click(205,69) +Sleep(300) +MouseMove(650,310) +Click("Down") +MouseMove(690,350,25) +MouseMove(650,390,25) +MouseMove(610,350,25) +MouseMove(650,310,25) +Click("Up") +MouseClickDrag("Left",720,320,760,380,25) +Sleep(300) +Click(21,74) diff --git a/tools/native/network.ps1 b/tools/native/network.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..2e59b9258bc4a12fe52279e70706a8efdda3cd83 --- /dev/null +++ b/tools/native/network.ps1 @@ -0,0 +1,16 @@ +param([Parameter(Mandatory=$true)][string]$LabMac) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$adapter = @(Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object { $_.MACAddress -eq $LabMac }) +if ($adapter.Count -ne 1) { throw 'The clone lab adapter is ambiguous.' } +$release = $adapter[0].ReleaseDHCPLease() +$result = $adapter[0].RenewDHCPLease() +$deadline = [DateTime]::UtcNow.AddSeconds(60) +do { + $adapter = @(Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object { $_.MACAddress -eq $LabMac }) + $addresses = @($adapter[0].IPAddress | Where-Object { $_ -match '^192\.168\.77\.\d+$' -and $_ -ne '192.168.77.1' }) + if ($addresses.Count -eq 1) { break } + Start-Sleep -Milliseconds 250 +} while ([DateTime]::UtcNow -lt $deadline) +if ($addresses.Count -ne 1) { throw ('The clone did not receive a lab IPv4 address; renewal result ' + $result.ReturnValue) } +@{mac=$LabMac;address=$addresses[0];releaseResult=$release.ReturnValue;renewalResult=$result.ReturnValue} | ConvertTo-Json -Compress diff --git a/tools/native/page-direction.ps1 b/tools/native/page-direction.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..6747f5550f6ba4ce077c225c27cb0e3eb5b58383 --- /dev/null +++ b/tools/native/page-direction.ps1 @@ -0,0 +1,45 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + $deadline = [DateTime]::UtcNow.AddSeconds(60) + do { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$tree = $hierarchy + $pages = @($tree.SelectNodes('//*[local-name()="Page"]')) + if ($pages.Count -gt 0) { break } + Start-Sleep -Milliseconds 100 + } while ([DateTime]::UtcNow -lt $deadline) + if ($pages.Count -ne 1) { throw 'The direction fixture requires one page.' } + $content = '' + $app.GetPageContent($pages[0].GetAttribute('ID'), [ref]$content, 1, 1) + [IO.File]::WriteAllText("$Root\before.xml", $content, [Text.Encoding]::UTF8) + [xml]$page = $content + $settings = $page.SelectSingleNode('//*[local-name()="PageSettings"]') + $settings.SetAttribute('RTL', 'true') + $columns = @($page.SelectNodes('//*[local-name()="Column"]')) + for ($i = 0; $i -lt $columns.Count; $i++) { + $columns[$i].SetAttribute('width', (96 + 48 * $i).ToString()) + $columns[$i].SetAttribute('isLocked', 'true') + } + $app.UpdatePageContent($page.OuterXml, [DateTime]::MinValue, 1, $true) + $app.GetPageContent($pages[0].GetAttribute('ID'), [ref]$content, 1, 1) + [IO.File]::WriteAllText("$Root\after.xml", $content, [Text.Encoding]::UTF8) + [xml]$after = $content + if ($after.SelectSingleNode('//*[local-name()="PageSettings"]').GetAttribute('RTL') -ne 'true') { throw 'Native page direction did not change.' } + $app.SyncHierarchy($notebook) + $app.CloseNotebook($notebook, $false) + $notebook = '' +} finally { + if ($notebook) { $app.CloseNotebook($notebook, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/tools/native/pages.ps1 b/tools/native/pages.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..8e428618e3452caa35da88687293b520c273b6c6 --- /dev/null +++ b/tools/native/pages.ps1 @@ -0,0 +1,42 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$fixture = Get-Content (Join-Path $Root 'notebook\fixture.json') -Raw -Encoding UTF8 | ConvertFrom-Json +$inputs = Join-Path $Root 'inputs' +New-Item -ItemType Directory -Path $inputs | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $sections = @{} + foreach ($path in $fixture.sections) { + $parts = $path.Split('/') + if (@($parts | Where-Object { $_ -in @('', '.', '..') -or $_.Contains('\') -or $_.Contains(':') }).Count) { throw 'Invalid fixture section path.' } + $parent = $notebookId + for ($index = 0; $index -lt $parts.Count; $index++) { + $id = '' + $app.OpenHierarchy($parts[$index], $parent, [ref]$id, $(if ($index -eq $parts.Count - 1) {3} else {2})) + $parent = $id + } + $sections[$path] = $id + } + $index = 0 + foreach ($item in $fixture.pages) { + $pageId = '' + $app.CreateNewPage($sections[$item.section], [ref]$pageId, 0) + [xml]$xml = $item.xml.Replace('__ASSETS__', [Security.SecurityElement]::Escape((Join-Path $Root 'notebook\fixture-data'))) + $xml.DocumentElement.SetAttribute('ID', $pageId) + [IO.File]::WriteAllText((Join-Path $inputs ('page-{0:d3}.xml' -f $index)), $xml.OuterXml, [Text.Encoding]::UTF8) + $app.UpdatePageContent($xml.OuterXml, [DateTime]::MinValue, 1, $true) + $index++ + } + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/tools/native/probe.ps1 b/tools/native/probe.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..09bdeec644fcb554e6f0a5de812c1403f626cbac --- /dev/null +++ b/tools/native/probe.ps1 @@ -0,0 +1,51 @@ +param([string]$Root, [string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$results = New-Object Collections.Generic.List[object] +$index = 0 +foreach ($file in @(Get-ChildItem "$Root\inputs" -Filter '*.one' | Sort-Object Name)) { + $case = "C:\one-tests\runs\probe-$index" + $output = "$Root\results\$($file.BaseName)" + New-Item -ItemType Directory "$case\notebook", $output -Force | Out-Null + Copy-Item $file.FullName "$case\notebook\synthetic.one" + Get-Process ONENOTE -ErrorAction SilentlyContinue | ForEach-Object { + Stop-Process -InputObject $_ -Force + if (-not $_.WaitForExit(10000)) { throw 'OneNote did not exit before the cache reset.' } + } + & "$PSScriptRoot\cold-current.ps1" -Root $case -CloneHost $CloneHost + $app = New-Object -ComObject OneNote.Application + $notebook = ''; $section = ''; $hierarchy = ''; $failure = $null; $pages = @() + $started = [DateTime]::UtcNow + try { + $app.OpenHierarchy("$case\notebook", '', [ref]$notebook, 0) + $app.OpenHierarchy("$case\notebook\synthetic.one", '', [ref]$section, 0) + $deadline = [DateTime]::UtcNow.AddSeconds(30) + do { + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$tree = $hierarchy + $pages = @($tree.SelectNodes('//*[local-name()="Page"]')) + if ($pages.Count) { break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + $n = 0 + foreach ($page in $pages) { + $content = '' + $app.GetPageContent($page.GetAttribute('ID'), [ref]$content, 1, 1) + [IO.File]::WriteAllText("$output\page-$n.xml", $content, [Text.Encoding]::UTF8) + $n++ + } + } catch { $failure = $_ | Out-String } + finally { + [IO.File]::WriteAllText("$output\hierarchy.xml", $hierarchy, [Text.Encoding]::UTF8) + $results.Add(@{ name=$file.BaseName; pages=$pages.Count; error=$failure; + seconds=([DateTime]::UtcNow - $started).TotalSeconds; + source_sha256=(Get-FileHash $file.FullName).Hash.ToLowerInvariant() }) + $results | ConvertTo-Json -Depth 5 | Set-Content "$Root\results.json" -Encoding UTF8 + try { if ($notebook) { $app.CloseNotebook($notebook, $false) } } catch {} + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + } + $index++ +} diff --git a/tools/native/profile.ps1 b/tools/native/profile.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..f817aac61859ddf539a4c805f00fe09ceea85227 --- /dev/null +++ b/tools/native/profile.ps1 @@ -0,0 +1,107 @@ +# Usage: .\profile.ps1 Isolate|Restore|Status +# Parks the native OneNote profile for tests. It never changes notebook files. +param( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateSet('Isolate', 'Restore', 'Status')] + [string]$Command +) + +$ErrorActionPreference = 'Stop' +$root = 'C:\one-tests' +$key = 'HKCU:\Software\Microsoft\Office\14.0\OneNote' +$regKey = 'HKCU\Software\Microsoft\Office\14.0\OneNote' +$cache = Join-Path $env:LOCALAPPDATA 'Microsoft\OneNote\14.0' +$originalReg = Join-Path $root 'profile-original.reg' +$originalCache = Join-Path $root 'profile-original-cache' +$testReg = Join-Path $root 'profile-test.reg' +$testCache = Join-Path $root 'profile-test-cache' + +function Test-IsolatedProfile { + if (-not (Test-Path -LiteralPath "$key\Options\Paths")) { return $false } + try { + return (Get-ItemProperty -LiteralPath "$key\Options\Paths" -Name UnfiledNotesSection).UnfiledNotesSection -eq "$root\Loose.one" + } catch { + return $false + } +} + +if ($Command -ne 'Status' -and (Get-Process ONENOTE -ErrorAction SilentlyContinue)) { + throw 'Close OneNote, then run this command again.' +} + +if ($Command -eq 'Status') { + $profile = if (Test-IsolatedProfile) { 'test' } elseif (Test-Path -LiteralPath $key) { 'other' } else { 'missing' } + $activeCache = Test-Path -LiteralPath $cache + $originals = (Test-Path -LiteralPath $originalReg) -and (Test-Path -LiteralPath $originalCache) + $tests = (Test-Path -LiteralPath $testReg) -or (Test-Path -LiteralPath $testCache) + + if ($originals -and $profile -eq 'test') { + Write-Output 'State: isolated. Run Restore when native tests finish.' + } elseif ($originals -and ($tests -or $profile -eq 'missing')) { + Write-Output 'State: restore can resume. Run Restore with OneNote closed.' + } elseif ((Test-Path -LiteralPath $originalReg) -and -not (Test-Path -LiteralPath $originalCache) -and $tests -and $activeCache -and $profile -eq 'other') { + Write-Output 'State: restored. Test backups remain parked.' + } else { + Write-Output 'State: unrecognized. Inspect the paths below before changing the profile.' + } + + Write-Output "Registry: $profile" + Write-Output "Active cache: $activeCache" + Write-Output "Original registry backup: $(Test-Path -LiteralPath $originalReg)" + Write-Output "Original cache backup: $(Test-Path -LiteralPath $originalCache)" + Write-Output "Test registry backup: $(Test-Path -LiteralPath $testReg)" + Write-Output "Test cache backup: $(Test-Path -LiteralPath $testCache)" + return +} + +if ($Command -eq 'Isolate') { + if ((Test-Path -LiteralPath $originalReg) -or (Test-Path -LiteralPath $originalCache)) { + throw 'Original backup already exists. Run Status or Restore before isolating again.' + } + if ((Test-Path -LiteralPath $testReg) -or (Test-Path -LiteralPath $testCache)) { + throw 'Test backup already exists. Inspect Status before isolating again.' + } + if (-not (Test-Path -LiteralPath $key)) { throw 'The OneNote profile registry was not found. Nothing changed.' } + if (-not (Test-Path -LiteralPath $cache)) { throw 'The OneNote cache was not found. Nothing changed.' } + + New-Item -ItemType Directory -Path $root -Force | Out-Null + & reg.exe export $regKey $originalReg + if ($LASTEXITCODE -ne 0) { throw 'The original registry profile was not saved. Nothing changed.' } + Move-Item -LiteralPath $cache -Destination $originalCache + & reg.exe delete $regKey /f + if ($LASTEXITCODE -ne 0) { throw 'The original registry remains saved. Run Restore to recover it.' } + New-Item -Path $key -Force | Out-Null + New-ItemProperty -Path $key -Name FirstBootStatus -PropertyType DWord -Value 0x1000101 | Out-Null + New-Item -Path "$key\Options\Paths" -Force | Out-Null + New-ItemProperty -Path "$key\Options\Paths" -Name UnfiledNotesSection -PropertyType ExpandString -Value "$root\Loose.one" | Out-Null + Write-Output 'State: isolated. The original profile and cache are parked.' + return +} + +if (-not (Test-Path -LiteralPath $originalReg)) { throw 'The original registry backup is missing. Nothing changed.' } +if (-not (Test-Path -LiteralPath $originalCache)) { + if ((Test-Path -LiteralPath $cache) -and (Test-Path -LiteralPath $testReg) -and -not (Test-IsolatedProfile)) { + Write-Output 'State: restored. Test backups remain parked.' + return + } + throw 'The original cache backup is missing. Inspect Status before restoring.' +} +if ((Test-Path -LiteralPath $cache) -and (Test-Path -LiteralPath $testCache)) { + throw 'Both active and parked test caches exist. Inspect Status before restoring.' +} +if (-not (Test-Path -LiteralPath $testReg) -and (Test-Path -LiteralPath $key)) { + & reg.exe export $regKey $testReg + if ($LASTEXITCODE -ne 0) { throw 'The test registry profile was not saved. Nothing changed.' } +} +if ((Test-Path -LiteralPath $cache) -and -not (Test-Path -LiteralPath $testCache)) { + Move-Item -LiteralPath $cache -Destination $testCache +} +if (Test-Path -LiteralPath $key) { + & reg.exe delete $regKey /f + if ($LASTEXITCODE -ne 0) { throw 'The test profile is parked. Run Restore to try again.' } +} +& reg.exe import $originalReg +if ($LASTEXITCODE -ne 0) { throw 'The test profile is parked. Run Restore to try again.' } +if (Test-Path -LiteralPath $cache) { throw 'The original cache is still parked. Run Status before restoring.' } +Move-Item -LiteralPath $originalCache -Destination $cache +Write-Output 'State: restored. Test backups remain parked.' diff --git a/tools/native/read.ps1 b/tools/native/read.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..d61ba414eb59a498d2d686422b476d3263f77b48 --- /dev/null +++ b/tools/native/read.ps1 @@ -0,0 +1,139 @@ +param( + [Parameter(Mandatory=$true)][string]$Root, + [int]$ExpectedPages = -1, + [switch]$UseCurrentCache, + [switch]$Pdf, + [switch]$KeepOpen, + [string]$CloneHost = '' +) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +$root = [IO.Path]::GetFullPath($Root).TrimEnd('\') +if ([IO.Path]::GetDirectoryName($root) -ne 'C:\one-tests\runs') { + throw 'Choose a run directly below C:\one-tests\runs.' +} +$notebook = Join-Path $root 'notebook' +$output = Join-Path $root 'read' +if (Test-Path $output) { throw 'Choose a new read destination.' } +if ($UseCurrentCache) { + if ((Get-ItemProperty 'HKCU:\Software\Microsoft\Office\14.0\OneNote\Options\Paths').UnfiledNotesSection -ne 'C:\one-tests\Loose.one') { + throw 'Park the personal OneNote profile before reading test notebooks.' + } +} else { + & "$PSScriptRoot\cold-current.ps1" -Root $root -CloneHost $CloneHost +} +New-Item -ItemType Directory -Path $output | Out-Null +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +$failure = $null +try { + $app.OpenHierarchy($notebook, '', [ref]$notebookId, 0) + $process = Get-Process ONENOTE + @{ hostname = [Environment]::MachineName; onenote = $process.MainModule.FileVersionInfo.FileVersion; + powershell = $PSVersionTable.PSVersion.ToString(); schema = 'xs2010'; cold = (-not $UseCurrentCache.IsPresent) } | + ConvertTo-Json | Set-Content (Join-Path $output 'environment.json') -Encoding UTF8 + $sections = @() + foreach ($file in @(Get-ChildItem $notebook -Recurse | Where-Object { $_.Extension -eq '.one' })) { + $id = '' + $app.OpenHierarchy($file.FullName, '', [ref]$id, 0) + $sections += $id + } + $deadline = [DateTime]::UtcNow.AddSeconds(300) + $previous = '' + $stableSince = [DateTime]::UtcNow + $settled = $false + do { + $pages = @{} + foreach ($section in $sections) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$xml = $hierarchy + foreach ($node in $xml.SelectNodes('//*[@path]')) { + if (-not $node.GetAttribute('path').StartsWith("$notebook\", [StringComparison]::OrdinalIgnoreCase)) { + throw 'OneNote opened a section outside the copied notebook.' + } + } + foreach ($node in $xml.SelectNodes('//*[local-name()="Page"]')) { + $id = $node.GetAttribute('ID') + $content = '' + $app.GetPageContent($id, [ref]$content, 1, 1) + $pages[$id] = $content + } + } + $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] })) + if ($signature -ne $previous) { + $previous = $signature + $stableSince = [DateTime]::UtcNow + } + if ((($ExpectedPages -ge 0 -and $pages.Count -eq $ExpectedPages) -or + ($ExpectedPages -lt 0 -and $pages.Count -gt 0)) -and + ([DateTime]::UtcNow - $stableSince).TotalSeconds -ge 2) { $settled = $true; break } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) { + $index = 0 + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + $index++ + } + $hierarchy = '' + $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1) + [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8) + throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)." + } + $index = 0 + $payloads = @() + foreach ($id in @($pages.Keys | Sort-Object)) { + [IO.File]::WriteAllText((Join-Path $output ('page-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8) + if ($Pdf) { + $pdfPath = Join-Path $output ('page-{0:d3}.pdf' -f $index) + $app.NavigateTo($id, '', $false) + $app.Publish($id, $pdfPath, 3, '') + if (-not (Test-Path $pdfPath) -or (Get-Item $pdfPath).Length -eq 0) { throw 'OneNote did not publish the page PDF.' } + } + [xml]$page = $pages[$id] + foreach ($file in $page.SelectNodes('//*[local-name()="InsertedFile" or local-name()="MediaFile"]')) { + $bytes = [IO.File]::ReadAllBytes($file.GetAttribute('pathCache')) + $hash = [BitConverter]::ToString([Security.Cryptography.SHA256]::Create().ComputeHash($bytes)).Replace('-', '').ToLowerInvariant() + [IO.File]::WriteAllBytes((Join-Path $output ($hash + '.attachment')), $bytes) + $payloads += @{ page = $id; object = $file.ParentNode.GetAttribute('objectID'); + kind = $file.LocalName; name = $file.GetAttribute('preferredName'); + sha256 = $hash; bytes = $bytes.Length } + } + $index++ + } + [IO.File]::WriteAllText((Join-Path $output 'payloads.json'), (ConvertTo-Json -InputObject $payloads -Depth 4), [Text.Encoding]::UTF8) + $all = '' + $app.GetHierarchy($notebookId, 4, [ref]$all, 1) + [xml]$finalTree = $all + $finalIds = @($finalTree.SelectNodes('//*[local-name()="Page"]') | ForEach-Object { $_.GetAttribute('ID') } | Sort-Object -Unique) + if ($finalIds.Count -ne $pages.Count -or @($finalIds | Where-Object { -not $pages.ContainsKey($_) }).Count -ne 0) { + throw 'The notebook hierarchy changed while collecting page evidence; repeat the cold read.' + } + [IO.File]::WriteAllText((Join-Path $output 'hierarchy.xml'), $all, [Text.Encoding]::UTF8) + Write-Output "Read $($sections.Count) sections and $($pages.Count) pages." +} catch { + $failure = $_ + [IO.File]::WriteAllText((Join-Path $output 'failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + throw +} finally { + try { + try { + if ($notebookId -and $CloneHost) { $app.SyncHierarchy($notebookId) } + if ($notebookId -and -not $KeepOpen -and (-not $UseCurrentCache -or $CloneHost)) { + $app.CloseNotebook($notebookId, $false) + } + } catch { + if ($null -eq $failure) { throw } + [IO.File]::WriteAllText((Join-Path $output 'cleanup-failure.txt'), ($_ | Out-String), [Text.Encoding]::UTF8) + } + } finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + } + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + if (-not $UseCurrentCache -and -not $CloneHost) { + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/tools/native/shared.ps1 b/tools/native/shared.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..94ba189699f494e43537749c8bfc964bc8be106e --- /dev/null +++ b/tools/native/shared.ps1 @@ -0,0 +1,53 @@ +param([Parameter(Mandatory=$true)][string]$Root, + [Parameter(Mandatory=$true)][string]$SharedName, + [Parameter(Mandatory=$true)][string]$ExpectedText, + [Parameter(Mandatory=$true)][string]$Text) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +if ($SharedName -notmatch '^stage[45]-[a-z0-9-]+$') { throw 'Choose a stage 4 or 5 test directory name.' } +& "$PSScriptRoot\cold-current.ps1" -Root $Root +$shared = "A:\one-tests\$SharedName" +if (-not (Test-Path "$shared\synthetic.one")) { throw 'Create the shared fixture before opening OneNote.' } +$app = New-Object -ComObject OneNote.Application +$notebook = '' +try { + $app.OpenHierarchy($shared, '', [ref]$notebook, 0) + $section = '' + $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0) + $deadline = [DateTime]::UtcNow.AddSeconds(30) + $matches = @() + do { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$tree = $hierarchy + $pages = @($tree.SelectNodes('//*[local-name()="Page"]')) + if ($pages.Count -gt 1) { throw 'Expected one shared test page.' } + if ($pages.Count -eq 1) { + $content = '' + $app.GetPageContent($pages[0].GetAttribute('ID'), [ref]$content, 3, 1) + [xml]$page = $content + $matches = @($page.SelectNodes('//*[local-name()="T"]') | Where-Object { $_.InnerText -eq $ExpectedText }) + if ($matches.Count -eq 1) { break } + } + Start-Sleep -Milliseconds 250 + } while ([DateTime]::UtcNow -lt $deadline) + if ($matches.Count -ne 1) { throw 'Expected one matching shared text object.' } + [IO.File]::WriteAllText("$Root\before.xml", $content, [Text.Encoding]::UTF8) + Start-Sleep -Seconds 3 + $matches[0].InnerText = [Security.SecurityElement]::Escape($Text) + $app.UpdatePageContent($page.OuterXml, [DateTime]::MinValue, 1, $false) + $app.SyncHierarchy($notebook) + Start-Sleep -Seconds 5 + $content = '' + $app.GetPageContent($pages[0].GetAttribute('ID'), [ref]$content, 3, 1) + [IO.File]::WriteAllText("$Root\after.xml", $content, [Text.Encoding]::UTF8) +} finally { + try { if ($notebook) { $app.CloseNotebook($notebook, $false) } } + finally { + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + $app = $null + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Get-Process ONENOTE -ErrorAction SilentlyContinue | Wait-Process -Timeout 10 + } +} diff --git a/tools/native/stress.ps1 b/tools/native/stress.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..e4f7b69778914c34aa28a7a972bd2f3d4f24a5ce --- /dev/null +++ b/tools/native/stress.ps1 @@ -0,0 +1,75 @@ +function Invoke-Stress($app, $section, $command, $output, $shared) { + $hierarchy = '' + $app.GetHierarchy($section, 4, [ref]$hierarchy, 1) + [xml]$tree = $hierarchy + $pages = @($tree.SelectNodes('//*[local-name()="Page"]')) + if ($pages.Count -ne 1) { throw 'Expected one stress-test page.' } + $pageId = $pages[0].GetAttribute('ID') + if ($command.action -eq 'prepare-stress') { + for ($i = 0; $i -lt $command.clients; $i++) { + $xml = '' + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $false) + } + return + } + $random = New-Object Random([int]$command.seed) + $events = New-Object IO.StreamWriter("$output\events.jsonl", $false, [Text.Encoding]::UTF8) + $events.AutoFlush = $true + try { + [IO.File]::WriteAllText("$output\ready", 'ready') + $deadline = [DateTime]::UtcNow.AddMinutes(10) + while (-not (Test-Path "$shared\stress-start")) { + if ([DateTime]::UtcNow -gt $deadline) { throw 'Stress start timed out.' } + Start-Sleep -Milliseconds 20 + } + for ($i = 0; $i -lt $command.operations; $i++) { + Start-Sleep -Milliseconds $random.Next(10, 100) + $started = [DateTime]::UtcNow.Ticks + $content = '' + $app.GetPageContent($pageId, [ref]$content, 1, 1) + [xml]$page = $content + $matches = @($page.SelectNodes('//*[local-name()="T"]') | Where-Object { + (Get-ParagraphText $_.InnerText).StartsWith($command.prefix) + }) + if ($matches.Count -ne 1) { throw 'Expected one stress-test paragraph.' } + $before = Get-ParagraphText $matches[0].InnerText + $token = ' [n' + $command.actor + ':' + $i + ']' + $start = $end = $before.Length + $replacement = $token + $bold = $italic = $false + if ($command.edit) { + $boundaries = New-Object 'Collections.Generic.List[int]' + for ($at = $command.prefix.Length; $at -le $before.Length; $at++) { + $boundaries.Add($at) + if ($at -lt $before.Length -and [char]::IsHighSurrogate($before[$at])) { $at++ } + } + $first = $boundaries[$random.Next($boundaries.Count)] + $second = $boundaries[$random.Next($boundaries.Count)] + $start = [Math]::Min($first, $second) + $end = [Math]::Max($first, $second) + $replacement = ' caf' + [char]0xe9 + ' ' + [char]::ConvertFromUtf32(0x1f980) + $token + $bold = $random.Next(2) -eq 1 + $italic = $random.Next(2) -eq 1 + } + $after = $before.Substring(0, $start) + $replacement + $before.Substring($end) + $html = [Security.SecurityElement]::Escape($after) + if ($command.edit) { + $weight = if ($bold) { 'bold' } else { 'normal' } + $style = if ($italic) { 'italic' } else { 'normal' } + $html = '' + $html + '' + } + $matches[0].InnerText = $html + Keep-Container $page $matches[0] + $updateStarted = [DateTime]::UtcNow.Ticks + $app.UpdatePageContent($page.OuterXml, [DateTime]::MinValue, 1, $false) + $updated = [DateTime]::UtcNow.Ticks + $events.WriteLine((@{ operation=$i; before=$before; token=$token; started_ticks=$started; + range=@($start, $end); replacement=$replacement; bold=$bold; italic=$italic; + update_started_ticks=$updateStarted; updated_ticks=$updated } | ConvertTo-Json -Compress)) + if ($i -eq 0) { [IO.File]::WriteAllText("$output\editing", 'editing') } + if ($command.sync_every -gt 0 -and (($i + 1) % $command.sync_every) -eq 0) { + $app.SyncHierarchy($section) + } + } + } finally { $events.Dispose() } +} diff --git a/tools/native/template.ps1 b/tools/native/template.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..824eec360daddbb8bf513da314411eafc864a31c --- /dev/null +++ b/tools/native/template.ps1 @@ -0,0 +1,26 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $files = @(Get-ChildItem (Join-Path $Root 'notebook') | Where-Object { $_.Extension -eq '.one' }) + if ($files.Count -ne 1) { throw 'Provide exactly one copied section for the template probe.' } + $sectionId = '' + $app.OpenHierarchy($files[0].Name, $notebookId, [ref]$sectionId, 0) + $pageId = '' + $app.CreateNewPage($sectionId, [ref]$pageId, 0) + $xml = 'Native template probe' + $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $true) + @{ page = $pageId; operation = 'CreateNewPage with npsDefault, then set title' } | ConvertTo-Json | Set-Content (Join-Path $Root 'expected.json') -Encoding UTF8 + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/tools/native/text.ps1 b/tools/native/text.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..75e9e71207b599d16eaaf68824ca30831860610a --- /dev/null +++ b/tools/native/text.ps1 @@ -0,0 +1,13 @@ +function Get-ParagraphText([string]$html) { + $plain = [regex]::Replace($html, '<[^>]*>', '') + $plain = [regex]::Replace($plain, '&#(?:x([0-9a-fA-F]+)|([0-9]+));', { + param($match) + $value = if ($match.Groups[1].Success) { + [Convert]::ToInt32($match.Groups[1].Value, 16) + } else { [int]$match.Groups[2].Value } + # The Win7 framework leaves supplementary numeric entities undecoded. + if ($value -gt 0xffff -and $value -le 0x10ffff) { [char]::ConvertFromUtf32($value) } + else { $match.Value } + }) + [Net.WebUtility]::HtmlDecode($plain) +} diff --git a/tools/native/toc-boundaries.ps1 b/tools/native/toc-boundaries.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..6197696b07e0fb0becd1571504a89d3740ee47d7 --- /dev/null +++ b/tools/native/toc-boundaries.ps1 @@ -0,0 +1,28 @@ +param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' +& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost +$app = New-Object -ComObject OneNote.Application +$notebookId = '' +try { + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $names = @() + foreach ($index in 0..79) { + $name = 'Boundary section {0:d3}.one' -f $index + $section = '' + $app.OpenHierarchy($name, $notebookId, [ref]$section, 3) + $app.SyncHierarchy($notebookId) + $app.CloseNotebook($notebookId, $false) + $notebookId = '' + $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebookId, 0) + $names += $name + } + $names | ConvertTo-Json | Set-Content (Join-Path $Root 'expected.json') -Encoding UTF8 + $app.CloseNotebook($notebookId, $false) + $notebookId = '' +} finally { + if ($notebookId) { $app.CloseNotebook($notebookId, $false) } + [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app) + [GC]::Collect() + [GC]::WaitForPendingFinalizers() +} diff --git a/tools/native_collaboration.py b/tools/native_collaboration.py new file mode 100644 index 0000000000000000000000000000000000000000..747d8e3b26ed15f13a77d0cf8ee6c6d786eb1548 --- /dev/null +++ b/tools/native_collaboration.py @@ -0,0 +1,514 @@ +#!/usr/bin/env python3 +"""Replay shared notebook edits with disposable OneNote clients and a Linux server.""" +import argparse +import errno +from contextlib import ExitStack, contextmanager +from concurrent.futures import ThreadPoolExecutor +from threading import Lock +import hashlib +import json +import os +from pathlib import Path +import shutil +import signal +import subprocess +import tarfile +import time +import xml.etree.ElementTree as ET + +from native_runner import ROOT, clone, command, windows, vm, collect_artifacts +from native_xml import texts +from document_model import ordered_pages, view, walk +import linux_vm + + +def reachable_page_text(model): + (sid, _, _, _), = ordered_pages(model) + pending, retained = [sid], {} + while pending: + sid = pending.pop() + if sid in retained: continue + _, revision = view(model, sid) + manifest = revision['nodes'][revision['roots']['1']] + assert manifest['kind']['type'] == 'Manifest' + page, = manifest['content'] + assert revision['nodes'][page]['kind']['type'] == 'Page' + retained[sid] = sorted(node['kind']['text'] for _, node in walk(revision, page) if node['kind']['type'] == 'RichText') + pending.extend(manifest['spaces']) + return retained + + +def verify_final_state(model): + (sid, main), (conflict_sid, competing) = reachable_page_text(model).items() + main, competing = set(main), set(competing) + assert {'Native lock recovery.', 'Client B online cell.'} <= main + edits = {'Client A concurrent edit.', 'Client B concurrent edit.'} + assert len(main & edits) == len(competing & edits) == 1 and edits <= main | competing + return {'main_space': sid, 'conflict_space': conflict_sid, 'competing_edits': sorted(edits)} + + +def replay(output, server, stress_clients=0, stress_operations=30, sync_every=1, rust_writers=4, rust_readers=3, edit=False, seed=710, conflict_clients=0, abrupt=False): + if linux_vm.instance_path(server).exists(): + raise ValueError('Choose a new Linux VM name; existing machines are not owned by this run.') + output = output.resolve() + output.mkdir(parents=True, exist_ok=False) + mount = output / 'mount' + mount.mkdir() + mounted = False + scripts = output / 'scripts' + scripts.mkdir() + for name in ('cold.ps1', 'collaborate.ps1', 'network.ps1', 'stress.ps1', 'text.ps1'): + shutil.copyfile(ROOT / 'tools/native' / name, scripts / name) + (output / 'run.json').write_text(json.dumps({'server': server, 'stress_clients': stress_clients, 'conflict_clients': conflict_clients, 'stress_operations': stress_operations, 'sync_every': sync_every, 'rust_writers': rust_writers, 'rust_readers': rust_readers, 'edit': edit, 'seed': seed, 'abrupt': abrupt, + 'harness_sha256': {name: hashlib.sha256((ROOT / 'tools' / name).read_bytes()).hexdigest() for name in ('native_collaboration.py', 'native_stress.py', 'concurrent_rust.py', 'native_runner.py')}, 'scripts': {p.name: hashlib.sha256(p.read_bytes()).hexdigest() for p in scripts.iterdir()}}, indent=2)) + + def ssh(text): + result = linux_vm.run_ssh(server, text, timeout=90) + with (output / 'server.jsonl').open('a') as log: + log.write(json.dumps({'command': text, 'exit': result.returncode, 'stdout': result.stdout, 'stderr': result.stderr}) + '\n') + result.check_returncode() + return result.stdout + + try: + if not linux_vm.instance_path(server).exists(): + linux_vm.create_instance(server) + linux_vm.launch(server) + linux_vm.wait_instance(server, 600) + config = linux_vm.load_instance(server) + (output / 'linux.json').write_text(json.dumps(config, indent=2)) + def reconnect_mount(): + nonlocal mounted + if os.path.ismount(mount): + subprocess.run(['/sbin/umount', str(mount)], check=True) + mounted = False + subprocess.run(['/sbin/mount_smbfs', '-N', f'//guest@127.0.0.1:{config["samba_port"]}/agent', mount], check=True, stdin=subprocess.DEVNULL) + mounted = True + ssh('mkdir /srv/agent/m6-collaboration') + source = ROOT / 'corpus/native-ink/cold-ui-ink/notebook' + if stress_clients or conflict_clients or abrupt: + source = output / 'input' + subprocess.run([ROOT / 'target/debug/examples/create_notebook', source, 'Concurrent edits:', 'Concurrency test'], check=True) + with tarfile.open(output / 'input.tar', 'w', dereference=True) as archive: + for name in ('synthetic.one', 'Open Notebook.onetoc2'): + archive.add(source / name, arcname=name) + with (output / 'input.tar').open('rb') as stream: + subprocess.run(linux_vm.ssh_argv(server, 'tar xf - -C /srv/agent/m6-collaboration'), stdin=stream, check=True) + ssh('chmod u+w /srv/agent/m6-collaboration/*') + reconnect_mount() + shared = mount / 'm6-collaboration' + assert (shared / 'synthetic.one').read_bytes() == (source / 'synthetic.one').read_bytes() + for probe in ('sudo smbd --version', 'uname -a', 'testparm -s 2>&1'): + ssh(probe) + with ExitStack() as stack: + def start_controller(client, resume=False): + name, folder = client['name'], client['folder'] + command(name, 'if exist C:\\one-tests\\runs\\capture\\ready del C:\\one-tests\\runs\\capture\\ready', folder) + options = f' -ResumeCache -StartSequence {client["sequence"] + 1}' if resume else '' + result = windows.do_spawn('cmd /c powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\collaborate.ps1 -Root C:\\one-tests\\runs\\capture -SharedPath \\\\192.168.77.1\\agent\\m6-collaboration -CloneHost ONE-' + name.upper() + options + f' > C:\\one-tests\\runs\\capture\\controller-{client["sequence"]}.log 2>&1', name) + (folder / f'spawn-{client["sequence"]}.json').write_text(json.dumps(result, indent=2)) + if result.get('error'): raise RuntimeError(result['error']) + deadline = time.monotonic() + 120 + while time.monotonic() < deadline: + result = windows.do_cmd('if exist C:\\one-tests\\runs\\capture\\ready (echo ready)', target=name) + if result.get('exit') == 0 and 'ready' in result.get('stdout', ''): return + time.sleep(1) + raise RuntimeError('The native collaboration client did not open the shared notebook') + + labels = [f'n{i}' for i in range(stress_clients or conflict_clients)] if stress_clients or conflict_clients else ['a', 'b'] + for label in labels: + (output / label).mkdir() + ownership = Lock() + def start_clone(label): + manager = clone(output / label) + name = manager.__enter__() + with ownership: + stack.push(manager) + return name + # Joining workers before stack exit retains ownership even if another boot fails. + with ThreadPoolExecutor(max_workers=len(labels)) as pool: + names = dict(zip(labels, pool.map(start_clone, labels))) + clients = [] + for label in labels: + folder = output / label + name = names[label] + for local in scripts.iterdir(): + remote = 'cold-current.ps1' if local.name == 'cold.ps1' else local.name + result = windows.do_put(local, 'C:\\one-tests\\' + remote, name) + if result.get('error'): raise RuntimeError(result['error']) + command(name, 'mkdir C:\\one-tests\\runs\\capture', folder) + command(name, 'powershell -NoProfile -ExecutionPolicy Bypass -File C:\\one-tests\\network.ps1 -LabMac ' + vm.lab_mac(name), folder) + command(name, 'ipconfig', folder) + command(name, 'dir \\\\192.168.77.1\\agent\\m6-collaboration', folder) + clients.append({'name': name, 'folder': folder, 'sequence': 0}) + start_controller(clients[-1]) + command(name, 'ipconfig', folder) + print('Collaboration ready:', label, name, flush=True) + + def action(client, action, wait=True, **parameters): + client['sequence'] += 1 + sequence = client['sequence'] + local = client['folder'] / f'command-{sequence:04}.json' + local.write_text(json.dumps({'action': action, **parameters}, ensure_ascii=False)) + inbox = f'C:\\one-tests\\runs\\capture\\inbox\\{sequence:04}' + result = windows.do_put(local, inbox + '.tmp', client['name']) + if result.get('error'): raise RuntimeError(result['error']) + command(client['name'], f'move {inbox}.tmp {inbox}.json', client['folder']) + if not wait: return sequence + return wait_action(client, sequence, action) + + def wait_action(client, sequence, action): + deadline = time.monotonic() + 600 + remote = f'C:\\one-tests\\runs\\capture\\outbox\\{sequence}' + while time.monotonic() < deadline: + result = windows.do_cmd(f'if exist {remote}\\error (type {remote}\\error & exit /b 1) else (if exist {remote}\\done (echo complete))', target=client['name']) + if result.get('exit') != 0: raise RuntimeError(str(result)) + if 'complete' in result.get('stdout', ''): break + time.sleep(.5) + else: raise TimeoutError(f'Native command {sequence} did not complete') + if action == 'snapshot': + destination = client['folder'] / f'snapshot-{sequence:04}.xml' + result = windows.do_get(remote + '\\page-0.xml', destination, client['name']) + if result.get('error'): raise RuntimeError(result['error']) + return texts(ET.parse(destination).getroot()) + + def wait_text(client, expected): + deadline = time.monotonic() + 120 + while time.monotonic() < deadline: + action(client, 'sync') + observed = action(client, 'snapshot') + if all(text in observed for text in expected): return observed + time.sleep(1) + raise AssertionError(('Native synchronization did not converge', expected, observed)) + + @contextmanager + def locked_file(name): + deadline = time.monotonic() + 120 + while True: + try: + descriptor = os.open(shared / name, os.O_RDONLY | os.O_EXLOCK | os.O_NONBLOCK) + break + except OSError as error: + with (output / 'read-retries.jsonl').open('a') as log: + log.write(json.dumps({'file': name, 'errno': error.errno, 'error': str(error)}) + '\n') + if error.errno not in (errno.ENOENT, errno.EACCES, errno.EAGAIN): raise + if time.monotonic() >= deadline: raise + time.sleep(.1) + with os.fdopen(descriptor, 'rb') as stream: + yield stream + + def snapshot_file(name): + with locked_file(name) as stream: + return stream.read() + + def checkpoint(label): + deadline, previous, incomplete = time.monotonic() + 120, None, 0 + while time.monotonic() < deadline: + snapshot = {name: snapshot_file(name) for name in ('synthetic.one', 'Open Notebook.onetoc2')} + if snapshot == previous: + time.sleep(.1) + continue + previous = snapshot + target = output / label / 'notebook' + target.mkdir(parents=True) + for name, data in snapshot.items(): (target / name).write_bytes(data) + result = subprocess.run([ROOT / 'target/debug/examples/document', target / 'synthetic.one', target.parent / 'model'], capture_output=True, text=True) + if result.returncode == 0: + (target.parent / 'locks.txt').write_text(ssh('sudo smbstatus --locks')) + print('Captured collaboration state:', label, flush=True) + return + (target.parent / 'parse-error.txt').write_text(result.stderr) + if result.stderr.strip() != 'Error: Error { offset: 0, message: "Document context has no revision" }': + result.check_returncode() + incomplete += 1 + saved = output / f'{label}-incomplete-{incomplete}' + target.parent.rename(saved) + print('Preserved incomplete native document:', saved.name, flush=True) + time.sleep(.1) + raise TimeoutError(f'Native document references did not settle: {label}') + + if abrupt and not conflict_clients: + from concurrent_rust import running_clients + from crash_recovery import verify_text + import crash + + action(clients[0], 'prepare-stress', clients=len(clients)) + native_text = [f'Native {i}:' for i in range(len(clients))] + for client in clients: wait_text(client, ['Concurrent edits:', *native_text]) + checkpoint('crash-initial') + folder = output / 'rust-interrupted' + folder.mkdir() + try: + with running_clients(folder, shared / 'synthetic.one', rust_writers, rust_readers, 500, seed) as processes: + (folder / 'start').touch() + for i, client in enumerate(clients): + changed = native_text[i] + ' Before server stop.' + action(client, 'edit', expected=native_text[i], text=changed) + native_text[i] = changed + deadline = time.monotonic() + 60 + while True: + commits = sum(line.count('"event":"commit"') for path in folder.glob('w*.jsonl') for line in path.read_text().splitlines()) + if commits >= 10: break + if any(p.poll() is not None for p in processes.values()) or time.monotonic() >= deadline: + raise AssertionError('Writers did not overlap the server interruption') + time.sleep(.02) + assert all(p.poll() is None for p in processes.values()), 'A client stopped before the planned interruption' + (output / 'server-crash.json').write_text(json.dumps(crash.stop('linux', server), indent=2)) + for client in clients: vm.qmp(client['name'], 'set_link', {'name': 'lab', 'up': False}) + raise InterruptedError('Recorded server interruption') + except InterruptedError: + pass + logs = {actor: [json.loads(line) for line in (folder / f'{actor}.jsonl').read_text().splitlines()] for actor in processes} + assert not list(folder.glob('invalid-*.one')), 'A client captured malformed storage' + linux_vm.launch(server) + linux_vm.wait_instance(server, 600) + recovered = output / 'server-before-native-reconnect' + recovered.mkdir() + with (recovered / 'synthetic.one').open('wb') as stream: + subprocess.run(linux_vm.ssh_argv(server, 'cat /srv/agent/m6-collaboration/synthetic.one'), stdout=stream, check=True, timeout=60) + subprocess.run([ROOT / 'target/debug/examples/document', recovered / 'synthetic.one', recovered / 'model'], check=True) + model = json.loads((recovered / 'model/document.json').read_text()) + text, = [text for values in reachable_page_text(model).values() for text in values if text.startswith('Concurrent edits:')] + retained = verify_text('Concurrent edits:', text, logs) + (output / 'server-retention.json').write_text(json.dumps(retained, indent=2)) + reconnect_mount() + for client in clients: vm.qmp(client['name'], 'set_link', {'name': 'lab', 'up': True}) + for client in clients: wait_text(client, [text, *native_text]) + checkpoint('server-recovered') + + client = clients[0] + pending_text = native_text[0] + ' Offline cache edit.' + with locked_file('synthetic.one'): + vm.qmp(client['name'], 'set_link', {'name': 'lab', 'up': False}) + action(client, 'edit', expected=native_text[0], text=pending_text) + assert pending_text in action(client, 'snapshot') + (output / 'client-crash.json').write_text(json.dumps(crash.stop('windows', client['name']), indent=2)) + checkpoint('client-stopped') + stopped = json.loads((output / 'client-stopped/model/document.json').read_text()) + assert pending_text not in [value for values in reachable_page_text(stopped).values() for value in values], 'The pending cache edit already reached the server' + vm.start_instance(client['name']) + vm.wait_instance(client['name'], 300) + command(client['name'], 'powershell -NoProfile -ExecutionPolicy Bypass -File C:\\one-tests\\network.ps1 -LabMac ' + vm.lab_mac(client['name']), client['folder']) + start_controller(client, resume=True) + deadline = time.monotonic() + 120 + while True: + action(client, 'sync') + observed = action(client, 'snapshot') + if pending_text in observed or native_text[0] in observed: break + if time.monotonic() >= deadline: + raise AssertionError('Recovered cache has neither acknowledged version') + time.sleep(1) + survived = pending_text in observed + native_text[0] = pending_text if survived else native_text[0] + (output / 'native-cache-result.json').write_text(json.dumps({'cache_acknowledged': pending_text, 'retained_after_abrupt_stop': survived, 'server_durability_acknowledged': False}, indent=2)) + for client in clients: wait_text(client, [text, *native_text]) + checkpoint('client-recovered') + + continued = output / 'rust-continued' + continued.mkdir() + with running_clients(continued, shared / 'synthetic.one', rust_writers, rust_readers, stress_operations, seed + 1) as processes: + (continued / 'start').touch() + continuation = {actor: [json.loads(line) for line in (continued / f'{actor}.jsonl').read_text().splitlines()] for actor in processes} + checkpoint('continued') + model = json.loads((output / 'continued/model/document.json').read_text()) + final_text, = [value for values in reachable_page_text(model).values() for value in values if value.startswith('Concurrent edits:')] + result = verify_text(text, final_text, continuation) + for client in clients: wait_text(client, [final_text, *native_text]) + (output / 'result.json').write_text(json.dumps({'server': retained, 'continuation': result, 'native_cache_retained': survived, 'expected_text': sorted([final_text, *native_text])}, indent=2)) + elif conflict_clients: + from concurrent_rust import running_clients + from native_stress import edit_history + + original = 'Concurrent edits:' + native = [f'Native conflict {i}: café 🦀' for i in range(conflict_clients)] + for client in clients: wait_text(client, [original]) + checkpoint('initial') + try: + with locked_file('synthetic.one'): + for client in clients: vm.qmp(client['name'], 'set_link', {'name': 'lab', 'up': False}) + for client, text in zip(clients, native): + action(client, 'edit', expected=original, text=text) + assert text in action(client, 'snapshot'), 'Native cache did not retain its intended edit' + folder = output / 'rust' + folder.mkdir() + with running_clients(folder, shared / 'synthetic.one', rust_writers, rust_readers, stress_operations, seed, edit=edit) as processes: + (folder / 'start').touch() + logs = {actor: [json.loads(line) for line in (folder / f'{actor}.jsonl').read_text().splitlines()] for actor in processes} + commits, rust_text = edit_history(logs, stress_operations, edit) + checkpoint('rust-before-reconnect') + finally: + for client in clients: vm.qmp(client['name'], 'set_link', {'name': 'lab', 'up': True}) + expected = {rust_text, *native} + deadline = time.monotonic() + 120 + while True: + for client in clients: action(client, 'sync') + checkpoint_label = f'convergence-{clients[0]["sequence"]}' + checkpoint(checkpoint_label) + model = json.loads((output / checkpoint_label / 'model/document.json').read_text()) + retained = reachable_page_text(model) + if sorted(expected) == sorted(text for texts in retained.values() for text in texts): break + if time.monotonic() >= deadline: + (output / 'lost-edit.json').write_text(json.dumps({'expected': sorted(expected), + 'reachable_page_text': retained, 'checkpoint': checkpoint_label}, indent=2)) + raise AssertionError(('Competing Rust/native edits differ from recorded results', sorted(expected), retained)) + time.sleep(1) + checkpoint('conflict-final') + (output / 'live-retention.json').write_text(json.dumps(retained, indent=2)) + if abrupt: + import crash + with locked_file('synthetic.one') as stream: + os.fsync(stream.fileno()) + (output / 'conflict-server-crash.json').write_text(json.dumps(crash.stop('linux', server), indent=2)) + for client in clients: vm.qmp(client['name'], 'set_link', {'name': 'lab', 'up': False}) + linux_vm.launch(server) + linux_vm.wait_instance(server, 600) + reconnect_mount() + checkpoint('conflict-server-recovered') + model = json.loads((output / 'conflict-server-recovered/model/document.json').read_text()) + observed = [text for texts in reachable_page_text(model).values() for text in texts] + assert sorted(observed) == sorted(expected), 'Server interruption lost a flushed competing result' + for client in clients: vm.qmp(client['name'], 'set_link', {'name': 'lab', 'up': True}) + for client in clients: action(client, 'sync') + elif stress_clients: + from native_stress import exercise + exercise(output, shared, clients, action, wait_action, wait_text, checkpoint, stress_operations, sync_every, rust_writers, rust_readers, edit, seed) + else: + a, b = clients + original = 'Fictitious: café, 東京, مرحبا' + rust_text = 'Rust disjoint edit.'.ljust(len(original.encode('utf-16-le')) // 2, '.') + other = 'Fictitious positioned outline.' + for client in clients: wait_text(client, [original, other]) + checkpoint('initial') + subprocess.run([ROOT / 'target/debug/examples/edit_property', shared / 'synthetic.one', '--in-place', '6000e', '1c001c22', (original + '\0').encode('utf-16-le').hex(), (rust_text + '\0').encode('utf-16-le').hex()], check=True) + action(a, 'edit', expected=other, text='Native disjoint edit.') + for client in clients: wait_text(client, [rust_text, 'Native disjoint edit.']) + checkpoint('disjoint') + ssh('sudo systemctl stop smbd && ! systemctl is-active --quiet smbd') + try: + action(a, 'edit', expected=rust_text, text='Client A concurrent edit.') + action(b, 'edit', expected=rust_text, text='Client B concurrent edit.') + finally: + ssh('sudo systemctl start smbd && systemctl is-active smbd') + reconnect_mount() + for client in clients: action(client, 'sync') + deadline = time.monotonic() + 120 + while time.monotonic() < deadline: + for client in clients: action(client, 'sync') + temporary = output / 'conflict-model' + if temporary.exists(): shutil.rmtree(temporary) + snapshot = output / 'conflict.one' + snapshot.write_bytes(snapshot_file('synthetic.one')) + subprocess.run([ROOT / 'target/debug/examples/document', snapshot, temporary], check=True) + model = json.loads((temporary / 'document.json').read_text()) + values = [node['kind'].get('text') for space in model['spaces'].values() for revision in space['revisions'].values() for node in revision['nodes'].values()] + if 'Client A concurrent edit.' in values and 'Client B concurrent edit.' in values: break + time.sleep(1) + else: raise AssertionError('Both concurrent edits were not retained') + checkpoint('conflict') + ssh('sudo systemctl restart smbd && systemctl is-active smbd') + reconnect_mount() + for client in clients: wait_text(client, ['Native disjoint edit.']) + checkpoint('server-restart') + vm.qmp(a['name'], 'set_link', {'name': 'lab', 'up': False}) + try: + action(a, 'edit', expected='Native disjoint edit.', text='Client A offline edit.') + assert 'Client A offline edit.' in action(a, 'snapshot') + action(b, 'edit', expected='Left cell', text='Client B online cell.') + wait_text(b, ['Client B online cell.', 'Native disjoint edit.']) + checkpoint('transport-disconnected') + finally: + vm.qmp(a['name'], 'set_link', {'name': 'lab', 'up': True}) + for client in clients: wait_text(client, ['Client A offline edit.', 'Client B online cell.']) + checkpoint('transport-reconnected') + with os.fdopen(os.open(shared / 'synthetic.one', os.O_RDONLY | os.O_EXLOCK | os.O_NONBLOCK), 'rb') as locked: + before = locked.read() + action(a, 'edit', expected='Client A offline edit.', text='Native lock recovery.') + action(a, 'sync') + assert 'Native lock recovery.' in action(a, 'snapshot') + locked.seek(0) + assert locked.read() == before, 'The shared file changed while exclusively locked' + (output / 'contention.json').write_text(json.dumps({'unchanged_sha256': hashlib.sha256(before).hexdigest(), 'locks': ssh('sudo smbstatus --locks')}, indent=2)) + for client in clients: wait_text(client, ['Native lock recovery.', 'Client B online cell.']) + checkpoint('lock-released') + action(a, 'kill-process') + for client in clients: wait_text(client, ['Native lock recovery.', 'Client B online cell.']) + checkpoint('process-restarted') + vm.qmp(a['name'], 'quit') + deadline = time.monotonic() + 10 + while vm.running(a['name']) and time.monotonic() < deadline: time.sleep(.1) + assert not vm.running(a['name']), 'The owned clone did not terminate' + vm.start_instance(a['name']) + vm.wait_instance(a['name'], 300) + command(a['name'], 'powershell -NoProfile -ExecutionPolicy Bypass -File C:\\one-tests\\network.ps1 -LabMac ' + vm.lab_mac(a['name']), a['folder']) + start_controller(a, resume=True) + for client in clients: wait_text(client, ['Native lock recovery.', 'Client B online cell.']) + checkpoint('vm-restarted') + final = json.loads((output / 'vm-restarted/model/document.json').read_text()) + (output / 'retention.json').write_text(json.dumps(verify_final_state(final), indent=2)) + for client in clients: + action(client, 'close') + collect_artifacts(client['name'], client['folder'], '*') + if abrupt and not conflict_clients: + checkpoint('crash-closed') + model = json.loads((output / 'crash-closed/model/document.json').read_text()) + actual = sorted(value for values in reachable_page_text(model).values() for value in values) + assert actual == sorted([final_text, *native_text]), 'Application closure changed recovered edits' + elif stress_clients: + checkpoint('stress-closed') + elif conflict_clients: + checkpoint('conflict-closed') + model = json.loads((output / 'conflict-closed/model/document.json').read_text()) + retained = reachable_page_text(model) + assert sorted(expected) == sorted(text for texts in retained.values() for text in texts), 'Closing native clients changed the competing results' + (output / 'result.json').write_text(json.dumps({'native_writers': conflict_clients, + 'rust_writers': rust_writers, 'rust_readers': rust_readers, 'rust_commits': len(commits), + 'competing_results': sorted(expected), 'reachable_page_text': retained}, indent=2)) + if not (stress_clients or conflict_clients or abrupt): (output / 'result.json').write_text(json.dumps({'disjoint': True, 'conflict_retained': True, 'server_restart': True, 'transport_reconnect': True, 'lock_contention': True, 'process_restart': True, 'vm_restart': True}, indent=2)) + except BaseException: + if linux_vm.instance_path(server).exists() and linux_vm.running(server): + failure = output / 'failure-after-client-shutdown' + failure.mkdir(exist_ok=True) + try: + for name in ('synthetic.one', 'Open Notebook.onetoc2'): + with (failure / name).open('wb') as stream: + subprocess.run(linux_vm.ssh_argv(server, f'cat /srv/agent/m6-collaboration/"{name}"'), + stdout=stream, stderr=subprocess.PIPE, check=True, timeout=30) + except Exception as error: + (failure / 'capture-error.txt').write_text(str(error)) + raise + finally: + if mounted: + result = subprocess.run(['/sbin/umount', str(mount)], capture_output=True, text=True) + (output / 'unmount.json').write_text(json.dumps({'exit': result.returncode, 'stderr': result.stderr})) + if linux_vm.instance_path(server).exists(): + try: + if linux_vm.running(server): linux_vm.shutdown(server, 60) + finally: + if linux_vm.running(server): linux_vm.qmp(server, 'quit') + deadline = time.monotonic() + 10 + while linux_vm.running(server) and time.monotonic() < deadline: time.sleep(.1) + linux_vm.delete_instance(server) + (output / 'teardown.json').write_text(json.dumps({'linux_absent': not linux_vm.instance_path(server).exists()}, indent=2)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('output', type=Path) + parser.add_argument('--linux', required=True, help='Disposable Linux VM owned by this run; it is deleted on exit.') + parser.add_argument('--stress-clients', type=int, default=0) + parser.add_argument('--conflict-clients', type=int, default=0, help='Native clients editing the same paragraph offline while Rust writes the server copy.') + parser.add_argument('--stress-operations', type=int, default=30) + parser.add_argument('--sync-every', type=int, default=1, help='Native edits between explicit sync requests; zero uses background sync.') + parser.add_argument('--rust-writers', type=int, default=4) + parser.add_argument('--rust-readers', type=int, default=3) + parser.add_argument('--edit', action='store_true', help='Use random text replacements in every writer.') + parser.add_argument('--seed', type=int, default=710) + parser.add_argument('--abrupt', action='store_true', help='Abrupt server and client stops with preserved-disk recovery and intent accounting.') + args = parser.parse_args() + if args.rust_writers < 2 or args.rust_readers < 1: parser.error('Use at least two Rust writers and one reader.') + if args.sync_every < 0 or args.stress_operations <= 0: parser.error('Use a nonnegative sync interval and positive operation count.') + if args.stress_clients and args.stress_clients < 3: parser.error('Stress mode requires at least three native clients.') + if args.conflict_clients < 0 or (args.conflict_clients and args.stress_clients): parser.error('Choose a positive conflict client count without stress mode.') + if args.abrupt and (args.stress_clients or args.edit): parser.error('Abrupt recovery uses append intents or the offline-conflict workload.') + def interrupted(_signal, _frame): raise KeyboardInterrupt + signal.signal(signal.SIGTERM, interrupted) + replay(args.output, args.linux, args.stress_clients, args.stress_operations, args.sync_every, args.rust_writers, args.rust_readers, args.edit, args.seed, args.conflict_clients, args.abrupt) diff --git a/tools/native_format.py b/tools/native_format.py new file mode 100644 index 0000000000000000000000000000000000000000..09d090f1ff7a49946197c829c642e0625c71473e --- /dev/null +++ b/tools/native_format.py @@ -0,0 +1,129 @@ +"""Independent formatting oracle from the application's XML and inline HTML.""" +from html.parser import HTMLParser +from native_xml import ns, project_text +from PIL import ImageColor + + +def css(value): + result = {} + for item in value.split(';'): + key, sep, text = item.partition(':') + if not sep: + continue + key, text = key.strip().lower(), text.strip().strip('"\'') + if key == 'font-family': result['font'] = text + elif key == 'font-size': result['font_size'] = float(text.removesuffix('pt')) + elif key == 'font-weight': result['bold'] = text in ('bold', '700') + elif key == 'font-style': result['italic'] = text == 'italic' + elif key == 'text-decoration': + result['underline'] = 'underline' in text + result['strike'] = 'line-through' in text + elif key == 'vertical-align': + result['superscript'] = text == 'super' + result['subscript'] = text == 'sub' + elif key == 'color': result['color'] = text.lower() + elif key == 'background': result['highlight'] = text.lower() + return result + + +class Runs(HTMLParser): + def __init__(self, html, inherited): + super().__init__() + self.stack = [inherited] + self.characters = [] + self.after_br = False + self.feed(html) + + def handle_starttag(self, tag, attrs): + attrs = dict(attrs) + style = {**self.stack[-1], **css(attrs.get('style', ''))} + if tag in ('b', 'strong'): style['bold'] = True + if tag in ('i', 'em'): style['italic'] = True + if tag == 'u': style['underline'] = True + if tag in ('s', 'strike'): style['strike'] = True + if tag == 'sup': style['superscript'] = True + if tag == 'sub': style['subscript'] = True + if tag == 'a': + style['hyperlink'] = True + style['link'] = attrs.get('href') + if tag == 'br': + self.characters.append(('\n', self.stack[-1])) + self.after_br = True + else: + self.stack.append(style) + + def handle_endtag(self, tag): + if len(self.stack) > 1: + self.stack.pop() + + def handle_data(self, data): + if self.after_br: + data = data.removeprefix('\n') + self.after_br = False + self.characters.extend((char, self.stack[-1]) for char in data) + + +def native_characters(page, roots): + definitions = {} + for node in page.findall('one:QuickStyleDef', ns): + definitions[node.attrib['index']] = { + **{k: node.get(k, 'false') == 'true' for k in ('bold', 'italic', 'underline', 'superscript', 'subscript')}, + 'strike': node.get('strikethrough', 'false') == 'true', + **{k: node.attrib[v] for k, v in [('font', 'font'), ('color', 'fontColor'), ('highlight', 'highlightColor')] if v in node.attrib}, + } + if 'fontSize' in node.attrib: + definitions[node.attrib['index']]['font_size'] = float(node.attrib['fontSize']) + result = [] + for root in roots: + pending = [(root, {})] + while pending: + node, inherited = pending.pop() + style = {**inherited, **definitions.get(node.get('quickStyleIndex'), {}), **css(node.get('style', ''))} + if node.tag == '{' + ns['one'] + '}T': + result.append(Runs(node.text or '', style).characters) + pending.extend((child, style) for child in reversed(node)) + return result + + +def compare_formats(space, nodes, native): + count = 0 + differences = {} + for node_index, (node, expected) in enumerate(zip(nodes, native, strict=True)): + kind = node['kind'] + base = space['nodes'][kind['paragraph_style']]['format'] if kind['paragraph_style'] else {} + base = {**{k: v for k, v in base.items() if v is not None}, **{k: v for k, v in node['format'].items() if v is not None}} + source = kind['text'].encode('utf-16-le') + actual = [] + for run in kind['runs']: + style = {**base, **({k: v for k, v in space['nodes'][run['format']]['format'].items() if v is not None} if run['format'] else {})} + text = source[run['start'] * 2:run['end'] * 2].decode('utf-16-le') + if not style.get('hidden'): + actual.extend((char, style) for char in text) + if actual and actual[-1][0] == '\r': + actual.pop() + actual = [(projected, style) for char, style in actual for projected in project_text(char)] + if kind['text'] == '\u00a0' and not expected: + continue + assert ''.join(c for c, _ in actual) == ''.join(c for c, _ in expected), 'Visible text runs differ' + for position, ((_, observed), (_, wanted)) in enumerate(zip(actual, expected, strict=True)): + for key in ('bold', 'italic', 'underline', 'strike', 'superscript', 'subscript', 'font', 'font_size', 'color', 'highlight'): + if key not in observed: + continue + value = observed[key] + if key in ('color', 'highlight'): + if value == 0xff000000: + continue + value = '#' + ''.join(f'{(value >> (8 * i)) & 255:02x}' for i in range(3)) + if observed.get('hyperlink') and key not in wanted: + continue + expected_value = wanted.get(key, False if isinstance(value, bool) else None) + if key in ("font", "font_size") and expected_value is None: + continue + if key in ("color", "highlight") and expected_value not in (None, "automatic", "none"): + expected_value = "#" + "".join(f"{v:02x}" for v in ImageColor.getrgb(expected_value)) + if value != expected_value: + differences.setdefault((node_index, key, value, expected_value), []).append(position) + count += 1 + return count, [{"paragraph": node, "field": key, "stored": actual, "native": expected, + "characters": len(positions), "positions": positions} + for (node, key, actual, expected), positions in differences.items()] diff --git a/tools/native_probe.py b/tools/native_probe.py new file mode 100644 index 0000000000000000000000000000000000000000..c1d8b354b6641070ac16d02db6f65179e691e581 --- /dev/null +++ b/tools/native_probe.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +"""Cold-open a batch of disposable section candidates in isolated OneNote caches.""" +import argparse +import hashlib +import json +from pathlib import Path +import signal +import zipfile +from native_runner import ROOT, clone, command, windows, collect_artifacts + + +def run(inputs, output): + output.mkdir(parents=True, exist_ok=False) + files = sorted(inputs.glob('*.one')) + assert files, 'No section candidates' + scripts = [ROOT / 'tools/native/cold.ps1', ROOT / 'tools/native/probe.ps1'] + (output / 'run.json').write_text(json.dumps({'inputs': {p.name: hashlib.sha256(p.read_bytes()).hexdigest() for p in files}, + 'scripts': {p.name: hashlib.sha256(p.read_bytes()).hexdigest() for p in scripts}}, indent=2)) + archive = output / 'inputs.zip' + try: + with zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED) as packed: + for path in files: + packed.writestr(path.name, path.read_bytes()) + with clone(output) as name: + for local, remote in [(archive, r'C:\one-tests\inputs.zip'), (scripts[0], r'C:\one-tests\cold-current.ps1'), + (scripts[1], r'C:\one-tests\probe.ps1')]: + result = windows.do_put(local, remote, name) + if result.get('error'): raise RuntimeError(result['error']) + command(name, r'powershell -NoProfile -Command "Expand-Archive C:\one-tests\inputs.zip C:\one-tests\runs\capture\inputs"', output) + command(name, r'powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\one-tests\probe.ps1 -Root C:\one-tests\runs\capture -CloneHost ONE-' + name.upper(), output, (len(files) * 60 + 120) * 1000) + collect_artifacts(name, output, r'results, C:\one-tests\runs\capture\results.json') + finally: + archive.unlink(missing_ok=True) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('inputs', type=Path) + parser.add_argument('output', type=Path) + args = parser.parse_args() + def interrupted(_signum, _frame): + raise KeyboardInterrupt + signal.signal(signal.SIGTERM, interrupted) + run(args.inputs.resolve(), args.output.resolve()) diff --git a/tools/native_runner.py b/tools/native_runner.py new file mode 100644 index 0000000000000000000000000000000000000000..412ac22d8be57414a5c8158eca2c542a2b0dd60c --- /dev/null +++ b/tools/native_runner.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python3 +"""Capture a notebook with real OneNote in a disposable Windows clone.""" +import argparse +import base64 +from contextlib import contextmanager +import hashlib +import json +from pathlib import Path +import signal +import re +import xml.etree.ElementTree as ET +import sys +import time +import uuid +import zipfile + +ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(ROOT / 'tools/w7')) +import mcp_win7 as windows +import vm + + +def command(target, text, output, timeout_ms=120000): + result = windows.do_cmd(text, timeout_ms=timeout_ms, target=target) + with (output / 'commands.jsonl').open('a') as log: + log.write(json.dumps({'command': text, **result}) + '\n') + if result.get('exit') != 0 or result.get('error'): + raise RuntimeError(windows.text_result(result)) + + +def install_agent(name, output): + source = output / 'agent.py' + source.write_bytes((ROOT / 'tools/w7/payload/agent.py').read_bytes()) + expected = hashlib.sha256(source.read_bytes()).hexdigest() + restart = output / 'restart-agent.py' + restart.write_bytes((ROOT / 'tools/w7/restart_agent.py').read_bytes()) + for local, remote in [(source, r'C:\win7-agent\agent.py'), + (restart, r'C:\one-tests\restart-agent.py')]: + result = windows.do_put(local, remote, name) + if result.get('error'): + raise RuntimeError(result['error']) + result = windows.do_spawn(r'C:\win7-agent\vendor\python\python.exe C:\one-tests\restart-agent.py ONE-' + name.upper(), name) + if result.get('error'): + raise RuntimeError(result['error']) + deadline = time.monotonic() + 60 + last_result = None + while time.monotonic() < deadline: + try: + health = windows.do_health(name) + last_result = health + if health.get('agent_sha256') == expected: + return health + except windows.Win7Error as error: + last_result = str(error) + time.sleep(.2) + (output / 'agent-startup-failure.json').write_text(json.dumps({'expected_sha256': expected, 'last_result': last_result}, indent=2)) + raise RuntimeError('The updated clone agent did not become ready.') + + +def collect_artifacts(name, output, content, partial=False): + command(name, 'powershell -NoProfile -Command "Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\%s -DestinationPath C:\\one-tests\\captured.zip"' % content, output) + archive_path = output / 'capture.zip' + result = windows.do_get('C:\\one-tests\\captured.zip', archive_path, name) + if result.get('error') or not archive_path.is_file(): + raise RuntimeError('The native capture was not returned; inspect commands.jsonl.') + with zipfile.ZipFile(archive_path) as archive: + for entry in archive.infolist(): + relative = Path(entry.filename.replace('\\', '/')) + if relative.is_absolute() or '..' in relative.parts: + raise ValueError('The native archive contains a path outside the capture.') + path = (output / 'failure-artifacts' if partial else output) / relative + if entry.is_dir(): + path.mkdir(parents=True, exist_ok=True) + else: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(archive.read(entry)) + archive_path.unlink() + + +@contextmanager +def clone(output): + name = 'm6-' + uuid.uuid4().hex[:8] + if vm.instance_path(name).exists(): + raise RuntimeError('The generated clone name is already in use; rerun the capture.') + try: + vm.create_instance(name) + (output / 'machine.json').write_text(json.dumps({'name': name, 'hostname': 'ONE-' + name.upper()}) + '\n') + vm.start_instance(name) + vm.wait_instance(name, 300) + (output / 'health.json').write_text(json.dumps(install_agent(name, output), indent=2) + '\n') + yield name + except BaseException: + if (output / 'health.json').exists(): + try: + collect_artifacts(name, output, '*', partial=True) + except Exception as failure: + (output / 'artifact-failure.txt').write_text(str(failure)) + try: + shot = windows.do_shot(name) + if shot.get('png_b64'): + (output / 'failure.png').write_bytes(base64.b64decode(shot['png_b64'])) + except Exception: + pass + raise + finally: + if vm.instance_path(name).exists(): + if vm.running(name): + try: + vm.shutdown(name, 60) + except (Exception, SystemExit): + vm.qmp(name, 'quit') + deadline = time.monotonic() + 10 + while vm.running(name) and time.monotonic() < deadline: + time.sleep(0.1) + vm.delete_instance(name) + (output / 'teardown.json').write_text(json.dumps({'absent': not vm.instance_path(name).exists()}) + '\n') + + +def capture(notebook, output, expected_pages=-1, author=None, screenshots=False, pdf=False, author_timeout=600, inspect=False): + notebook = notebook.resolve(strict=True) + if not notebook.is_dir(): + raise ValueError('Choose a notebook directory.') + if output.resolve().is_relative_to(notebook): + raise ValueError('Choose an output directory outside the source notebook.') + output.mkdir(parents=True, exist_ok=False) + scripts = output / 'scripts' + scripts.mkdir() + for name in ('cold.ps1', 'read.ps1'): + (scripts / name).write_bytes((ROOT / 'tools/native' / name).read_bytes()) + if author is not None: + (scripts / 'author.ps1').write_bytes(author.read_bytes()) + (output / 'run.json').write_text(json.dumps({ + 'notebook': str(notebook), 'expected_pages': expected_pages, 'author': str(author) if author else None, + 'author_timeout_seconds': author_timeout, + 'inspect': inspect, + 'base': json.loads(vm.BASE_MANIFEST.read_text()), + 'scripts': {name: hashlib.sha256((scripts / name).read_bytes()).hexdigest() + for name in sorted(p.name for p in scripts.iterdir())}, + }, indent=2) + '\n') + source = [] + transfer = output / 'transfer.zip' + with zipfile.ZipFile(transfer, 'w', zipfile.ZIP_DEFLATED) as archive: + for path in sorted(notebook.rglob('*')): + if not path.is_file(): + continue + relative = path.relative_to(notebook).as_posix() + data = path.read_bytes() + source.append({'path': relative, 'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest(), + 'mtime_ns': path.stat().st_mtime_ns}) + archive.writestr(zipfile.ZipInfo.from_file(path, arcname=relative), data) + (output / 'source.json').write_text(json.dumps(source, indent=2) + '\n') + try: + with clone(output) as name: + for local, remote in [('cold.ps1', 'cold-current.ps1'), ('read.ps1', 'read-current.ps1')]: + result = windows.do_put(scripts / local, 'C:\\one-tests\\' + remote, name) + if result.get('error'): + raise RuntimeError(result['error']) + result = windows.do_put(transfer, 'C:\\one-tests\\transfer.zip', name) + if result.get('error'): + raise RuntimeError(result['error']) + command(name, 'powershell -NoProfile -Command "Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook"', output) + if author is not None: + result = windows.do_put(scripts / 'author.ps1', 'C:\\one-tests\\author.ps1', name) + if result.get('error'): + raise RuntimeError(result['error']) + command(name, 'powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\author.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-%s' % name.upper(), output, author_timeout * 1000) + command(name, 'powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-%s -ExpectedPages %d%s' % (name.upper(), expected_pages, (' -UseCurrentCache' if author else '') + (' -Pdf' if pdf else '') + (' -KeepOpen' if screenshots or inspect else '')), output, 600000) + collect_artifacts(name, output, '*' if author else 'read') + if screenshots: + for page in sorted((output / 'read').glob('page-*.xml')): + page_id = ET.parse(page).getroot().attrib['ID'] + if not re.fullmatch(r'\{[0-9A-Fa-f-]+\}\{[0-9]+\}\{[0-9A-Fa-f]+\}', page_id): + raise ValueError('The native page identity cannot be used for navigation.') + result = windows.do_exec( + 'OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1)))\n' + 'DetectHiddenWindows false\napp := ComObject("OneNote.Application")\n' + f'app.NavigateTo("{page_id}", "", false)\n' + 'hwnd := WinWait("ahk_exe ONENOTE.EXE",, 10)\n' + 'WinMaximize(hwnd)\nWinActivate(hwnd)\nWinWaitActive(hwnd,, 10)\n', + target=name, shot_delay_ms=1500) + page.with_suffix('.navigation.json').write_text(json.dumps({k: v for k, v in result.items() if k != 'png_b64'}, indent=2)) + if result.get('png_b64'): + page.with_suffix('.png').write_bytes(base64.b64decode(result['png_b64'])) + if result.get('error') or result.get('exit') != 0 or not result.get('png_b64'): + raise RuntimeError('The native page screenshot failed; inspect its navigation record.') + if inspect: + print(f'Inspection ready: {name}; create {output / "finish"} to capture and close it.', flush=True) + deadline = time.monotonic() + 1800 + while not (output / 'finish').exists() and time.monotonic() < deadline: + time.sleep(.2) + command(name, 'powershell -NoProfile -Command "Rename-Item C:\\one-tests\\runs\\capture\\read before-read"', output) + (output / 'read').rename(output / 'before-read') + command(name, 'powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-%s -UseCurrentCache -ExpectedPages -1%s' % (name.upper(), ' -Pdf' if pdf else ''), output, 600000) + collect_artifacts(name, output, '*') + for item in source: + path = notebook / item['path'] + if path.stat().st_mtime_ns != item['mtime_ns'] or hashlib.sha256(path.read_bytes()).hexdigest() != item['sha256']: + raise RuntimeError('The source changed during capture; repeat from an isolated copy.') + finally: + transfer.unlink(missing_ok=True) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('notebook', type=Path) + parser.add_argument('output', type=Path) + parser.add_argument('--expected-pages', type=int, default=-1) + parser.add_argument('--pdf', action='store_true') + parser.add_argument('--screenshots', action='store_true') + parser.add_argument('--inspect', action='store_true', help='Keep the clone open for inspection until an output/finish file appears, up to 30 minutes.') + parser.add_argument('--author', type=Path, help='Run a fixture-authoring PowerShell script in the clone before capture.') + parser.add_argument('--author-timeout', type=int, default=600, help='Authoring deadline in seconds.') + args = parser.parse_args() + def interrupted(_signum, _frame): + raise KeyboardInterrupt + signal.signal(signal.SIGTERM, interrupted) + if args.author_timeout <= 0: + parser.error('The authoring deadline must be positive.') + capture(args.notebook, args.output, args.expected_pages, args.author, args.screenshots, args.pdf, args.author_timeout, args.inspect) + print('Captured native evidence in', args.output) diff --git a/tools/native_stress.py b/tools/native_stress.py new file mode 100644 index 0000000000000000000000000000000000000000..d0e217d02347275063fdfcc1204a143805b35eab --- /dev/null +++ b/tools/native_stress.py @@ -0,0 +1,198 @@ +"""Overlapping native and Rust editing histories on one shared section.""" +import json +import time + +from native_runner import windows +from concurrent_rust import running_clients +from document_model import ordered_pages, walk + + +def edit_history(logs, operations, edit=False): + links = {} + for actor, events in logs.items(): + assert events[0]['event'] == 'ready' and events[-1]['event'] == 'done', 'Incomplete client log' + if not actor.startswith('w'): continue + intents = {event['attempt']: event for event in events if event['event'] == 'intent'} + commits = [event for event in events if event['event'] == 'commit'] + assert sorted(event['operation'] for event in commits) == list(range(operations)), 'Missing or duplicate Rust acknowledgements' + for event in commits: + intent = intents[event['attempt']] + token = f' [{actor}:{event["operation"]}]' + offset = len(intent['before'].encode('utf-16-le')) // 2 + assert event['token'] == intent['token'] == token, 'Acknowledgement differs from intended edit' + assert intent['replacement'] == (' café 🦀' if edit else '') + token, 'Unexpected replacement text' + assert intent['operation'] == event['operation'] and intent['source_transaction'] == event['source_transaction'], 'Acknowledgement used another intent' + start, end = intent['range'] + assert len('Concurrent edits:') <= start <= end <= offset, 'Invalid edit range' + if not edit: assert start == end == offset, 'Expected an append intent' + units = intent['before'].encode('utf-16-le') + after = units[:start * 2].decode('utf-16-le') + intent['replacement'] + units[end * 2:].decode('utf-16-le') + assert intent['before'] not in links, 'Acknowledged Rust edits branched from the same content' + links[intent['before']] = event, after + text = 'Concurrent edits:' + versions = {text: 0} + ordered = [] + while text in links: + event, text = links.pop(text) + ordered.append(event) + versions[text] = len(ordered) + assert not links, 'Acknowledged edits do not form one complete content history' + for events in logs.values(): + previous = 0 + for event in events: + if event['event'] != 'read': continue + assert event['text'] in versions, 'A reader observed partial, lost or invented content' + version = versions[event['text']] + assert version >= previous, 'A reader went backwards in content history' + previous = version + for i, commit in enumerate(ordered): + if commit['finished_us'] < event['started_us']: + assert version >= i + 1, 'A read missed an acknowledged edit' + if commit['started_us'] > event['finished_us']: + assert version <= i, 'A read observed a future edit' + return ordered, text + + +def native_history(events, actor, operations, edit): + assert len(events) == operations, 'Missing native acknowledgements' + prefix = f'Native {actor}:' + expected = prefix + for j, event in enumerate(events): + assert event['operation'] == j and event['token'] == f' [n{actor}:{j}]' and event['before'] == expected, 'Native history lost or invented an edit' + if edit: + start, end = event['range'] + units = expected.encode('utf-16-le') + assert len(prefix) <= start <= end <= len(units) // 2, 'Invalid native edit range' + assert event['replacement'] == ' café 🦀' + event['token'], 'Unexpected native replacement' + expected = units[:start * 2].decode('utf-16-le') + event['replacement'] + units[end * 2:].decode('utf-16-le') + else: + expected += event['token'] + return expected + + +def verify_capture(output, capture): + import xml.etree.ElementTree as ET + from native_format import native_characters + from native_xml import ns + + config = json.loads((output / 'run.json').read_text()) + operations, edit = config['stress_operations'], config['edit'] + actors = [f'w{i}' for i in range(config['rust_writers'])] + [f'r{i}' for i in range(config['rust_readers'])] + logs = {actor: [json.loads(line) for line in (output / 'rust' / f'{actor}.jsonl').read_text().splitlines()] for actor in actors} + commits, rust_text = edit_history(logs, operations, edit) + native = [[json.loads(line) for line in (output / f'n{i}' / 'stress-events.jsonl').read_text(encoding='utf-8-sig').splitlines()] + for i in range(config['stress_clients'])] + expected = [rust_text, *(native_history(events, i, operations, edit) for i, events in enumerate(native))] + page_file, = capture.glob('page-*.xml') + page = ET.parse(page_file).getroot() + paragraphs = native_characters(page, page.findall('one:Outline', ns)) + actual = [''.join(char for char, _ in paragraph) for paragraph in paragraphs] + assert sorted(actual) == sorted(expected), 'Fresh native content differs from the complete recorded editing history' + checks = 0 + if edit: + for text, events in zip(expected[1:], native, strict=True): + for _, style in paragraphs[actual.index(text)]: + for field in ('bold', 'italic'): + assert bool(style.get(field)) == events[-1][field], 'Fresh native formatting differs from its last recorded editing intent' + checks += 1 + return {'rust_intents': len(commits), 'native_intents': sum(map(len, native)), + 'exact_paragraphs': len(expected), 'native_intended_format_checks': checks} + + +def exercise(output, shared, clients, action, wait_action, wait_text, checkpoint, operations, sync_every, rust_writers, rust_readers, edit=False, seed=710): + action(clients[0], 'prepare-stress', clients=len(clients)) + prefixes = [f'Native {i}:' for i in range(len(clients))] + for client in clients: + wait_text(client, ['Concurrent edits:', *prefixes]) + checkpoint('stress-initial') + clocks = [] + for client in clients: + before = time.time_ns() // 1000 + result = windows.do_health(client['name']) + after = time.time_ns() // 1000 + native = result['utc_us'] + clocks.append({'native_minus_host_us': [native - after - 15625, native - before + 15625]}) + (output / 'clocks.json').write_text(json.dumps(clocks, indent=2)) + sequences = [action(client, 'stress', wait=False, actor=i, prefix=prefixes[i], operations=operations, seed=seed + 10000 + i, sync_every=sync_every, edit=edit) + for i, client in enumerate(clients)] + for client, sequence in zip(clients, sequences): + deadline = time.monotonic() + 60 + while time.monotonic() < deadline: + result = windows.do_cmd(f'if exist C:\\one-tests\\runs\\capture\\outbox\\{sequence}\\ready echo ready', target=client['name']) + if 'ready' in result.get('stdout', ''): break + time.sleep(.1) + else: raise TimeoutError('Native stress client did not reach the barrier') + folder = output / 'rust' + folder.mkdir() + start = folder / 'start' + with running_clients(folder, shared / 'synthetic.one', rust_writers, rust_readers, operations, seed, edit=edit) as processes: + (shared / 'stress-start').write_text('start') + for client, sequence in zip(clients, sequences): + deadline = time.monotonic() + 60 + while time.monotonic() < deadline: + result = windows.do_cmd(f'if exist C:\\one-tests\\runs\\capture\\outbox\\{sequence}\\editing echo editing', target=client['name']) + if 'editing' in result.get('stdout', ''): break + time.sleep(.1) + else: raise TimeoutError('Native stress client did not acknowledge its first edit') + start.touch() + for client, sequence in zip(clients, sequences): + wait_action(client, sequence, 'stress') + for client, clock in zip(clients, clocks): + before = time.time_ns() // 1000 + native = windows.do_health(client['name'])['utc_us'] + after = time.time_ns() // 1000 + clock['after_native_minus_host_us'] = [native - after - 15625, native - before + 15625] + (output / 'clocks.json').write_text(json.dumps(clocks, indent=2)) + rust = {actor: [json.loads(line) for line in (folder / f'{actor}.jsonl').read_text().splitlines()] for actor in processes} + commits, expected_rust = edit_history(rust, operations, edit) + assert len(commits) == rust_writers * operations, 'Missing Rust acknowledgements' + native_events = [] + for i, (client, sequence) in enumerate(zip(clients, sequences)): + local = client['folder'] / 'stress-events.jsonl' + result = windows.do_get(f'C:\\one-tests\\runs\\capture\\outbox\\{sequence}\\events.jsonl', local, client['name']) + if result.get('error'): raise RuntimeError(str(result)) + events = [json.loads(line) for line in local.read_text(encoding='utf-8-sig').splitlines()] + prefixes[i] = native_history(events, i, operations, edit) + native_events.append(events) + expected = [expected_rust, *prefixes] + for client in clients: wait_text(client, expected) + checkpoint('stress-final') + model = json.loads((output / 'stress-final/model/document.json').read_text()) + paragraphs = [n['kind']['text'] for _, _, revision, page in ordered_pages(model) + for _, n in walk(revision, page) if n['kind']['type'] == 'RichText'] + assert sorted(paragraphs) == sorted(expected), 'Final shared state lost, duplicated or added unrecorded content' + if edit: + resolved = json.loads((output / 'stress-final/model/text.json').read_text()) + for i, events in enumerate(native_events): + runs, = [resolved[sid][rid][oid] for sid, rid, revision, page in ordered_pages(model) + for oid, node in walk(revision, page) + if node['kind']['type'] == 'RichText' and node['kind']['text'] == prefixes[i]] + for run in runs: + for field in ('bold', 'italic'): + assert bool(run['format'][field]) == events[-1][field], 'Final native formatting differs from its last edit' + reads = [e for events in rust.values() for e in events if e['event'] == 'read'] + overlap = 0 + for events, clock in zip(native_events, clocks): + low = min(clock['native_minus_host_us'][0], clock['after_native_minus_host_us'][0]) + high = max(clock['native_minus_host_us'][1], clock['after_native_minus_host_us'][1]) + for native in events: + latest_start = (native['update_started_ticks'] - 621355968000000000) // 10 - low + earliest_end = (native['updated_ticks'] - 621355968000000000) // 10 - high + overlap += sum(max(latest_start, rust['started_us']) < min(earliest_end, rust['finished_us']) for rust in commits) + result = {'native_writers': len(clients), 'rust_writers': rust_writers, 'rust_readers': rust_readers, + 'sync_every': sync_every, 'edit': edit, 'seed': seed, 'native_edits': operations * len(clients), 'rust_commits': len(commits), 'rust_reads': len(reads), + 'clock_bounded_native_rust_call_overlaps': overlap, 'converged_paragraphs': len(expected)} + (output / 'result.json').write_text(json.dumps(result, indent=2)) + assert overlap, 'No native/Rust call overlap established within clock uncertainty' + print(json.dumps(result), flush=True) + + +if __name__ == '__main__': + import argparse + from pathlib import Path + + parser = argparse.ArgumentParser(description='Check a fresh native capture against concurrent editing intents.') + parser.add_argument('run', type=Path) + parser.add_argument('capture', type=Path) + args = parser.parse_args() + print(json.dumps(verify_capture(args.run, args.capture), indent=2)) diff --git a/tools/native_xml.py b/tools/native_xml.py new file mode 100644 index 0000000000000000000000000000000000000000..7904339abb6e96cb3c7d5cf0db7a4643c942354a --- /dev/null +++ b/tools/native_xml.py @@ -0,0 +1,39 @@ +from html.parser import HTMLParser +import xml.etree.ElementTree as ET + +ns = {'one': 'http://schemas.microsoft.com/office/onenote/2010/onenote'} + + +class Text(HTMLParser): + def __init__(self, html): + super().__init__() + self.parts = [] + self.links = [] + self.after_br = False + self.feed(html) + + def handle_data(self, data): + if self.after_br: + data = data.removeprefix('\n') + self.after_br = False + self.parts.append(data) + + def handle_starttag(self, tag, attrs): + if tag == 'br': + self.parts.append('\n') + self.after_br = True + if tag == 'a': + self.links.extend(value for key, value in attrs if key == 'href') + + +def texts(page): + return [''.join(Text(node.text or '').parts) for node in page.findall('.//one:T', ns)] + + +def pages(directory): + return [ET.parse(p).getroot() for p in sorted(directory.glob('page-*.xml'))] + + +def project_text(text): + """Native HTML expands tabs to eight NBSPs and emits stored CR as a line break.""" + return text.replace('\t', '\u00a0' * 8).replace('\r', '\n') diff --git a/tools/notebook_report.py b/tools/notebook_report.py new file mode 100644 index 0000000000000000000000000000000000000000..e76607c5614013c5a413dd041edbd4441c27de02 --- /dev/null +++ b/tools/notebook_report.py @@ -0,0 +1,464 @@ +#!/usr/bin/env python3 +"""Export a copied notebook to an offline, read-only document report.""" +import argparse +from collections import Counter +from datetime import datetime, timedelta, timezone +import hashlib +from html import escape as esc +import json +from io import BytesIO +from pathlib import Path, PureWindowsPath +from PIL import Image +import xml.etree.ElementTree as ET +from native_xml import ns +import subprocess +from urllib.parse import urlsplit +from zoneinfo import ZoneInfo + +from document_model import DEFAULT_CONTEXT, EXPORTER, ordered_pages, version_pages, view, walk + +ROOT = Path(__file__).resolve().parent.parent + + +def hyperlink(fragment, target): + if urlsplit(target).scheme.lower() in ('http', 'https', 'mailto', 'onenote'): + return '' + fragment + '' + return fragment + ' (' + esc(target) + ')' + + +def color(value): + if value is None or value >> 24: + return None + return '#' + ''.join(f'{value >> shift & 255:02x}' for shift in (0, 8, 16)) + + +def css(fmt): + rules = [] + for field, prop, yes, no in [('bold', 'font-weight', 'bold', 'normal'), + ('italic', 'font-style', 'italic', 'normal')]: + if fmt.get(field) is not None: + rules.append(f'{prop}:{yes if fmt[field] else no}') + decorations = [v for k, v in [('underline', 'underline'), ('strike', 'line-through')] if fmt.get(k)] + if decorations: + rules.append('text-decoration:' + ' '.join(decorations)) + for field, prop in [('font', 'font-family'), ('font_size', 'font-size'), + ('color', 'color'), ('highlight', 'background-color')]: + value = fmt.get(field) + if value is not None: + if field == 'font': + fallback = 'monospace' if value in ('Consolas', 'Courier New', 'Lucida Console') else 'serif' if value in ('Times New Roman', 'Cambria', 'Georgia') else 'sans-serif' + value = json.dumps(value) + ',' + fallback + else: + value = f'{value:g}pt' if field == 'font_size' else color(value) + if value: + rules.append(f'{prop}:{value}') + for field, prop in [('space_before', 'margin-top'), ('space_after', 'margin-bottom')]: + if fmt.get(field) is not None: + rules.append(f'{prop}:{fmt[field]:g}pt') + if fmt.get('alignment') is not None: + rules.append('text-align:' + {0: 'left', 1: 'center', 2: 'right'}.get(fmt['alignment'], 'start')) + if fmt.get('line_spacing'): + rules.append(f'line-height:max(1.5em,{fmt["line_spacing"]:g}pt)') + if fmt.get('rtl'): + rules.append('direction:rtl') + return ';'.join(rules) + + +def html_page(title, nav, body): + return ''' + + +''' + esc(title) + '''
' + body + '
' + + +class Page: + def __init__(self, section, sid, rid): + self.section = section + self.space = section['document']['spaces'][sid]['revisions'][rid] + self.text = section['text'][sid][rid] + self.counts = Counter() + self.numbering = {} + self.has_paragraph = False + self.active = set() + + def asset(self, container): + if container is None: + return None + node = self.space['nodes'][container] + if node['kind']['type'] != 'File': + raise ValueError('The asset container is not a file object.') + return self.section['assets'].get(json.dumps(node['kind']['reference'], sort_keys=True)) + + def render(self, oid, depth=0, level=0): + if oid in self.active or depth > 256: + raise ValueError('The content graph is cyclic or exceeds the report depth limit.') + self.active.add(oid) + node = self.space['nodes'][oid] + kind = node['kind']; typ = kind['type'] + self.counts[typ] += 1 + children = lambda refs: ''.join(self.render(x, depth + 1, level) for x in refs) + tags = '' + tag_format = {} + for tag in node['tags']: + definition = self.space['nodes'][tag['definition']]['kind'] if tag['definition'] else {} + label = definition.get('label') or 'Task' + if not tag['status'] & 2: + for field in ('color', 'highlight'): + if color(definition.get(field)): + tag_format.setdefault(field, definition[field]) + if tag['due']: + label += ' · Due ' + datetime.fromtimestamp(tag['due'] + 315532800, timezone.utc).strftime('%Y-%m-%d') + if tag['status'] & 2: + label += ' · Disabled' + tags += '' + (('☑ ' if tag['status'] & 1 else '☐ ') if definition.get('shape') == 3 or tag['status'] & 4 else '') + esc(label) + '' + if typ == 'RichText': + body = '' + structured_math = any(c in kind['text'] for c in '\ufdd0\ufdee\ufdef') + equation = False + for run in self.text[oid]: + if run['format']['hidden']: + continue + if structured_math and run['format'].get('math'): + if not equation: + body += '[Equation · see native reference]' + equation = True + continue + equation = False + style = {**run['format'], **tag_format} + if (style['superscript'] or style['subscript']) and style['font_size'] is not None: + style['font_size'] *= 2 / 3 + fragment = '' + esc(run['text']) + '' + if run['format']['superscript']: + fragment = '' + fragment + '' + if run['format']['subscript']: + fragment = '' + fragment + '' + if run['link']: + fragment = hyperlink(fragment, run['link']) + body += fragment + body = tags + '' + body + '' + elif typ == 'Paragraph': + body = children(node['content']) + marker = '' + for list_id in kind['lists']: + item = self.space['nodes'][list_id]['kind'] + fmt = item['format'] or '' + if '\ufffd' in fmt: + position = fmt.index('\ufffd'); style = ord(fmt[position + 1]) + key = (fmt, level) + value = item['restart'] if item['restart'] is not None else self.numbering.get(key, 0) + 1 + self.numbering[key] = value + number = str(value) + if style in (1, 2): + number = ''; rest = value + for quantity, letters in [(1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'), (100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'), (10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')]: + times, rest = divmod(rest, quantity) + number += letters * times + if style == 2: number = number.lower() + elif style in (3, 4): + number = ''; rest = value + while rest: + rest, digit = divmod(rest - 1, 26) + number = chr(65 + digit) + number + if style == 4: number = number.lower() + elif style != 0: + raise ValueError(f'Number format {style} requires interpretation before report generation.') + marker += fmt[:position] + number + fmt[position + 2:] + else: + marker += {1: '•', 2: '◦', 3: '●', 4: '○', 5: '◉', 6: '◎', 7: '▪', 8: '▫', 9: '■', 10: '□', 11: '▸', 12: '▶', 13: '◇', 14: '♢', 15: '◆', 16: '❖', 17: '★', 18: '☆', 19: '☀', 20: '>', 21: '→', 22: '⇒', 23: '⇨', 24: '*', 25: '-', 26: '–', 27: '—'}.get(item['bullet'], fmt) + if marker: + body = '' + esc(marker) + '' + body + fmt = node['format'] + if kind['paragraph_style']: + parent = self.space['nodes'][kind['paragraph_style']]['format'] + fmt = {k: v if v is not None else parent[k] for k, v in fmt.items()} + for child in node['content']: + if child in self.text and self.text[child]: + resolved = self.text[child][0]['format'] + fmt = {**fmt, **{k: resolved[k] for k in ('alignment', 'rtl', 'space_before', 'space_after', 'line_spacing') if resolved[k] is not None}} + break + if not self.has_paragraph: + fmt = {**fmt, 'space_before': None} + self.has_paragraph = True + body = '
' + tags + body + '
' + if node['children']: + child_level = node['child_level'] or 1 + descendants = '
' + ''.join(self.render(x, depth + 1, level + child_level) for x in node['children']) + '
' + state = kind.get('collapse_state') + if state == 1: + descendants = '
Collapsed paragraphs' + descendants + '
' + elif state not in (None, 0): + descendants = '
Uninterpreted collapse state: ' + str(state) + '
' + descendants + body += descendants + elif typ in ('Page', 'Title', 'Outline'): + if typ == 'Outline': + previous = self.numbering, self.has_paragraph + self.numbering, self.has_paragraph = {}, False + body = children(node['structure'] + node['content'] + node['children']) + if typ == 'Outline': + self.numbering, self.has_paragraph = previous + if typ == 'Outline' and node['layout']['x'] is not None: + values = ', '.join(f'{k} {v:g} pt' for k, v in node['layout'].items() if v is not None) + body = '
' + esc(values) + '
' + body + '
' + elif typ == 'Title': + body = '
' + body + '
' + elif typ == 'OutlineGroup': + child_level = node['child_level'] or 1 + body = '
' + ''.join(self.render(x, depth + 1, level + child_level) for x in node['children']) + '
' + elif typ == 'Table': + cols = ''.join(f'' if kind['locked'] and kind['locked'][i] else '' for i, width in enumerate(kind['widths'])) + body = '' + cols + '' + children(node['children']) + '
' + elif typ == 'Row': + body = '' + children(node['children']) + '' + elif typ == 'Cell': + shade = color(kind['shading']) + body = '' + children(node['children']) + '' + elif typ == 'Image': + asset = self.asset(kind['container']) + if asset: + width = node['layout']['max_width'] if node['layout']['max_width'] is not None else kind['picture_width'] + height = node['layout']['max_height'] if node['layout']['max_height'] is not None else kind['picture_height'] + style = f'width:{width:g}pt' if width is not None else '' + if width and height: + style += f';aspect-ratio:{width:g}/{height:g}' + preview = self.section['previews'].get(asset, asset) + if preview.endswith('.bin'): + content = 'Image format is uninterpreted; the original payload is retained in the asset references.' + else: + content = '' + esc(kind['alt'] or '') + '' + body = '
' + tags + (hyperlink(content, kind['link']) if kind['link'] else content) + labels = [kind['filename']] if kind['filename'] else [] + if kind['background']: labels.append('Background image') + if kind['printout']: labels.append('Printout image') + if labels: + body += '
' + esc(' · '.join(labels)) + '
' + body += '
' + if kind['background'] and not kind['printout']: + body = '
Background image' + (' · ' + esc(kind['filename']) if kind['filename'] else '') + '' + body + '
' + else: + body = '
Image payload is external; its source reference is retained.
' + elif typ == 'Attachment': + asset = self.asset(kind['container']) + label = kind['filename'] or 'Attached file' + body = tags + ('' + esc(label) + '' if asset else esc(label) + ' · External payload') + elif typ == 'Ink': + body = '
Ink drawing · Stroke data is retained in the document structure.
' + else: + body = '
' + ('Encrypted content' if typ == 'Encrypted' else f'Uninterpreted content · JCID {node["jcid"]:#x}') + '
' + esc(oid) + '' + children(node['structure'] + node['content'] + node['children']) + '
' + for recording in node['media_ids']: + matches = [n['kind'] for n in self.space['nodes'].values() + if n['kind']['type'] == 'Attachment' and n['kind']['recording_id'] == recording] + label = 'Recording reference' + asset = None + if len(matches) == 1: + label = matches[0]['filename'] or label + asset = self.asset(matches[0]['container']) + if node['media_time_ms'] is not None: + seconds = node['media_time_ms'] / 1000 + label += f' · {seconds:g} s' + body += '
' + ('' + esc(label) + '' if asset else esc(label)) + '
' + self.active.remove(oid) + return '
' + body + '
' if typ not in ('RichText', 'Row', 'Cell') else body + + +def generate(source, destination, native=None, versions=(), zone=timezone.utc): + source = source.resolve(strict=True) + if destination.resolve().is_relative_to(source): + raise ValueError('Choose an export directory outside the source notebook.') + destination.mkdir(parents=True, exist_ok=False) + (destination / 'model').mkdir(); (destination / 'assets').mkdir() + sections = []; tocs = {}; manifest = [] + for index, path in enumerate(sorted(p for p in source.rglob('*') if p.suffix.lower() in ('.one', '.onetoc2'))): + relative = path.relative_to(source) + before = path.read_bytes() + manifest.append({'path': relative.as_posix(), 'sha256': hashlib.sha256(before).hexdigest(), 'bytes': len(before)}) + exported = destination / 'model' / str(index) + subprocess.run([EXPORTER, path, exported], check=True) + document = json.loads((exported / 'document.json').read_text()) + if path.read_bytes() != before: + raise ValueError('A source file changed during export.') + if path.suffix.lower() == '.onetoc2': + _, root = view(document, document['root']) + tocs[relative.parent] = [root['nodes'][oid]['kind'] for oid in root['nodes'][root['roots']['1']]['kind']['entries']] + assets = {} + previews = {} + image_references = { + json.dumps(revision['nodes'][node['kind']['container']]['kind']['reference'], sort_keys=True) + for space in document['spaces'].values() for revision in space['revisions'].values() + for node in revision['nodes'].values() + if node['kind']['type'] == 'Image' and node['kind']['container'] is not None + } + rows = json.loads((exported / 'assets.json').read_text()) + for asset in rows: + original = exported / asset['path']; data = original.read_bytes() + extension = '.png' if data.startswith(b'\x89PNG') else '.jpg' if data.startswith(b'\xff\xd8') else '.gif' if data.startswith(b'GIF8') else '.bmp' if data.startswith(b'BM') else '.tiff' if data.startswith((b'II*\0', b'MM\0*')) else '.bin' + name = hashlib.sha256(data).hexdigest() + extension + target = destination / 'assets' / name + if target.exists(): + original.unlink() + else: + original.rename(target) + asset['path'] = '../../assets/' + name + reference = json.dumps(asset['reference'], sort_keys=True) + assets[reference] = 'assets/' + name + if extension == '.tiff' and reference in image_references: + preview = name + '.png' + with Image.open(BytesIO(data)) as image: + if image.n_frames != 1: + raise ValueError('Multipage TIFF requires frame interpretation before report generation.') + image.convert('RGBA').save(destination / 'assets' / preview) + previews['assets/' + name] = 'assets/' + preview + (exported / 'assets').rmdir() + (exported / 'assets.json').write_text(json.dumps(rows, indent=2)) + if path.suffix.lower() == '.one': + sections.append({'path': relative, 'export': exported.relative_to(destination), 'document': document, + 'text': json.loads((exported / 'text.json').read_text()), 'assets': assets, 'previews': previews}) + def order(section): + path = section['path']; entries = tocs.get(path.parent, []) + entry = next((entry for entry in entries if entry['identity'] == section['document']['file_id']), None) + result = []; parent = Path('.') + for part in path.parts[:-1]: + group = next((item for item in tocs.get(parent, []) if item['filename'] == part), None) + result.append((group['order'] if group and group['order'] is not None else 0xffffffff, part)) + parent /= part + result.append((entry['order'] if entry and entry['order'] is not None else 0xffffffff, path.name)) + return result + sections.sort(key=order) + pages = []; locked_sections = []; histories = {}; nav = 'Notebook review' + for section in sections: + name = section['path'].stem + nav += '

' + esc(str(section['path'].parent) + ' / ' + name) + '

' + _, root_space = view(section['document'], section['document']['root']) + if root_space['nodes'][root_space['roots']['1']]['kind']['type'] == 'Encrypted': + locked_sections.append(str(section['path'])) + nav += '

Locked section · Page count unavailable

Encrypted structure' + continue + ordinary = list(ordered_pages(section['document'])) + known = {(sid, rid, oid) for sid, rid, _, oid in ordinary} + additional = [(sid, rid, revision, oid) for sid in section['document']['spaces'] + for rid, revision in [view(section['document'], sid)] + for oid, node in revision['nodes'].items() if node['kind']['type'] == 'Page' and (sid, rid, oid) not in known] + historical = [] + for sid, _, current, parent_oid in ordinary + additional: + for context, rid, revision, oid, proxy in version_pages(section['document'], sid, current): + historical.append((sid, context, rid, revision, oid)) + modified = proxy['kind']['modified_filetime'] + histories[(section['path'], sid, context, oid)] = { + 'modified': (datetime(1601, 1, 1, tzinfo=timezone.utc) + timedelta(microseconds=modified // 10)).astimezone(zone).isoformat() if modified is not None else None, + 'source': (section['path'], sid, DEFAULT_CONTEXT, parent_oid), + } + if not ordinary and not additional: + nav += '

Empty section

' + current_pages = [(sid, DEFAULT_CONTEXT, rid, revision, oid) for sid, rid, revision, oid in ordinary + additional] + for ordinal, (sid, context, rid, space, oid) in enumerate(current_pages + historical): + category = 'Historical version' if ordinal >= len(ordinary) + len(additional) else 'Additional stored page' if ordinal >= len(ordinary) else 'Recycle bin' if 'OneNote_RecycleBin' in section['path'].parts else 'Page' + metadata = space['nodes'].get(space['roots'].get('2'), {}).get('kind', {}) + if sid == root_space['nodes'][root_space['roots']['1']]['kind'].get('default_template'): + if metadata.get('type') != 'TemplateMetadata': + raise ValueError('The default page template has unrecognized metadata.') + category = 'Default page template' + titles = [n for root in space['nodes'][oid]['structure'] for _, n in walk(space, root) if n['kind']['type'] == 'RichText' and not n['kind']['boilerplate']] + title = ' '.join(n['kind']['text'] for n in titles) or space['nodes'][oid]['kind']['alternate_title'] or metadata.get('title') or metadata.get('name') or 'Untitled page' + filename = f'page-{len(pages):03}.html' + if metadata.get('type') == 'ConflictMetadata': + category = 'Conflict page' + level = metadata.get('level') or 1 + label = category + ' · ' + title if category in ('Additional stored page', 'Default page template', 'Conflict page', 'Historical version') else title + version = histories.get((section['path'], sid, context, oid)) + if version and version['modified']: + label += ' · ' + version['modified'][:10] + nav += '' + esc(label) + '' + pages.append((section, ordinal, sid, context, rid, oid, title, filename, category)) + references = {} + if native is not None: + native = native.resolve(strict=True) + captured = native.parent / 'notebook' + if captured.exists(): + hashes = {p.relative_to(captured).as_posix(): hashlib.sha256(p.read_bytes()).hexdigest() for p in captured.rglob('*') if p.is_file()} + else: + hashes = {item['path']: item['sha256'] for item in json.loads((native.parent / 'source.json').read_text())} + if any(hashes.get(item['path']) != item['sha256'] for item in manifest): + raise ValueError('The native capture does not describe these source files.') + captures = {ET.parse(p).getroot().get('ID'): p.stem for p in native.glob('page-*.xml')} + hierarchy = ET.parse(native / 'hierarchy.xml').getroot() + for section in sections: + relative = section['path'] + matches = [node for node in hierarchy.findall('.//one:Section', ns) + if PureWindowsPath(node.attrib['path']).parts[-len(relative.parts):] == relative.parts] + if len(matches) != 1: + raise ValueError('The native section association is ambiguous.') + native_pages = matches[0].findall('one:Page', ns) + for (sid, _, _, oid), page in zip(ordered_pages(section['document']), native_pages, strict=True): + references[(relative, sid, DEFAULT_CONTEXT, oid)] = Path('reference') / captures[page.get('ID')] + (destination / 'reference').symlink_to(native, target_is_directory=True) + for index, capture in enumerate(versions): + capture = capture.resolve(strict=True) + config = json.loads((capture / 'version-ui.json').read_text()) + matching = [section for section in sections if section['path'].name == Path(config['section']).name + and hashlib.sha256((source / section['path']).read_bytes()).hexdigest() == config['source_sha256']] + if len(matching) != 1: + raise ValueError('The historical capture source association is ambiguous.') + section, = matching + captures = {ET.parse(p).getroot().get('ID'): p.stem for p in (capture / 'read').glob('page-*.xml')} + directory = Path(f'reference-history-{index}') + (destination / directory).symlink_to(capture / 'read', target_is_directory=True) + for row in json.loads((capture / 'version-associations.json').read_text()): + key = (section['path'], row['space'], row['context'], row['object']) + rid, revision = view(section['document'], row['space'], row['context']) + if key not in histories or rid != row['revision'] or revision['nodes'][row['object']]['kind']['type'] != 'Page': + raise ValueError('The historical capture does not describe this page revision.') + if key in references: + raise ValueError('A page has multiple native reference captures.') + references[key] = directory / captures[row['native_id']] + accounting = [] + source_pages = {(section['path'], conflict): filename + for section, _, sid, _, rid, _, _, filename, category in pages if category != 'Historical version' + for revision in [section['document']['spaces'][sid]['revisions'][rid]] + for conflict in revision['nodes'][revision['roots']['1']]['spaces']} + page_files = {(section['path'], sid, context, oid): filename for section, _, sid, context, _, oid, _, filename, _ in pages} + for section, ordinal, sid, context, rid, oid, title, filename, category in pages: + page = Page(section, sid, rid) + body = '
' + esc(str(section['path'])) + ' · ' + category + ' ' + str(ordinal + 1) + '
' + if not page.space['nodes'][oid]['structure']: + body += '

' + esc(title) + '

' + metadata = page.space['nodes'].get(page.space['roots'].get('2'), {}).get('kind', {}) + if metadata.get('type') == 'ConflictMetadata' and metadata['author']: + body += '

Conflicting author: ' + esc(metadata['author']) + '

' + source_page = source_pages.get((section['path'], sid)) + version = histories.get((section['path'], sid, context, oid)) + if version: + source_page = page_files[version['source']] + if version['modified']: + body += '

Version modified: ' + esc(version['modified']) + '

' + if source_page: + body += '

Source page

' + reference = references.get((section['path'], sid, context, oid)) + if reference: + body += '

' + for suffix, label in [('.pdf', 'Native PDF'), ('.png', 'Native screenshot'), ('.xml', 'Native XML')]: + if (destination / reference.with_suffix(suffix)).exists(): + body += '' + label + '' + body += '

' + body += page.render(oid) + body += '
Document structure and source identities
' + esc(json.dumps(page.space, indent=2, ensure_ascii=False)) + '
' + body += '

Document JSONAsset references

' + (destination / filename).write_text(html_page(title, nav, body)) + accounting.append({'section': str(section['path']), 'ordinal': ordinal, 'space': sid, 'revision': rid, 'object': oid, 'title': title, 'report': filename, 'category': category, 'context': context, 'version_modified': version['modified'] if version else None, 'source_report': source_page, 'native_reference': reference.as_posix() if reference else None, 'rendered': dict(page.counts)}) + (destination / 'source.json').write_text(json.dumps(manifest, indent=2)) + (destination / 'pages.json').write_text(json.dumps(accounting, indent=2, ensure_ascii=False)) + intro = '

Notebook review

' + str(len(sections)) + ' sections · ' + str(len(pages)) + ' stored pages

Readable content follows the stored object order. Outline positions are shown in points. The document structure retains properties and identities that the readable view does not interpret.

Source hashes · Page inventory

' + if locked_sections: + intro += '

Page counts are unavailable for locked sections: ' + esc(', '.join(locked_sections)) + '.

' + (destination / 'index.html').write_text(html_page('Notebook review', nav, intro)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('source', type=Path) + parser.add_argument('destination', type=Path) + parser.add_argument('--native', type=Path, help='Associate a matching native capture directory.') + parser.add_argument('--versions', type=Path, action='append', default=[], help='Associate a verified historical capture; repeat for each section.') + parser.add_argument('--timezone', type=ZoneInfo, default=timezone.utc, help='Display historical timestamps in this time zone; default UTC.') + args = parser.parse_args() + generate(args.source, args.destination, args.native, args.versions, args.timezone) diff --git a/tools/onenote-trace b/tools/onenote-trace new file mode 100755 index 0000000000000000000000000000000000000000..f39d0694dce2c42b2a6ce1e311f3a91b96a69b2f --- /dev/null +++ b/tools/onenote-trace @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 +"""One timeline of what OneNote does to a .one on the share: file IO captured by +Procmon on the Windows client, merged with the byte-range locks zenith reports.""" +import argparse +import calendar +import csv +import datetime +import importlib.machinery +import importlib.util +import json +import ntpath +import os +import re +import subprocess +import sys +import time + +W7 = "/Users/clo/dev/one/tools/w7/mcp_win7.py" +PML = r"C:\trace\out.pml" +CSV = r"C:\trace\out.csv" +LOCAL_CSV = "/tmp/onenote-trace.csv" +TIME = re.compile(r"(\d+):(\d\d):(\d\d)(?:\.(\d+))?\s*([AaPp])?") +TARGET = os.environ.get("WIN7_TARGET") + + +def zenith(): + """The sibling tool, imported for its ssh-agent discovery and BYTERANGE parsing.""" + path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "zenith-locks") + loader = importlib.machinery.SourceFileLoader("zenith_locks", path) + mod = importlib.util.module_from_spec(importlib.util.spec_from_loader(loader.name, loader)) + loader.exec_module(mod) + mod.connect() + return mod + + +def win(*argv): + command = [sys.executable, W7] + if TARGET: + command += ["--target", TARGET] + p = subprocess.run(command + list(argv), capture_output=True, text=True) + if p.returncode != 0: + sys.exit((p.stderr.strip().splitlines() or ["Windows target is unreachable"])[-1]) + return p + + +def cmd(command): + """(exit code, stdout) of `cmd.exe /c command` on the Windows target.""" + p = win("cmd", command) + code = re.search(r"exit=(\d+)", p.stderr) + return (int(code.group(1)) if code else None), p.stdout + + +def procmon_path(): + """Procmon sits in the payload the agent runs from, wherever that was installed.""" + vendor = ntpath.dirname(ntpath.dirname(json.loads(win("health").stdout)["python"])) + return ntpath.join(vendor, "procmon", "Procmon64.exe") + + +def win_clock(): + """(epoch of wayback's local midnight, wayback's clock minus ours, round trip).""" + before = time.time() + _, out = cmd("wmic os get localdatetime /value") + after = time.time() + m = re.search(r"LocalDateTime=(\d{14})\.(\d{6})([+-]\d+)", out) + if not m: + sys.exit("could not read wayback's clock: %r" % out.strip()[:120]) + local = datetime.datetime.strptime(m.group(1), "%Y%m%d%H%M%S") + utc = int(m.group(3)) * 60 + midnight = calendar.timegm(local.replace(hour=0, minute=0, second=0).timetuple()) - utc + there = calendar.timegm(local.timetuple()) + int(m.group(2)) / 1e6 - utc + return midnight, there - (before + after) / 2, after - before + + +def zenith_clock(z): + """(zenith's clock minus ours, round trip).""" + before = time.time() + out = subprocess.run(z.SSH + ["date +%s.%N"], capture_output=True, text=True) + after = time.time() + try: + return float(out.stdout) - (before + after) / 2, after - before + except ValueError: + sys.exit("could not read zenith's clock: %r" % out.stdout.strip()[:120]) + + +def poll_locks(z, seconds, want): + """Lock transitions, stamped with our clock at the poll that first saw them. + + BYTERANGE carries no timestamp of its own, so the sample interval is the + real resolution of these rows -- zenith's clock never enters the merge. + """ + events, samples, prev, first = [], [], set(), True + end = time.time() + seconds + while True: + now = set(z.locks(z.status("BYTERANGE")[0])) + at = time.time() + samples.append(at) + for sign, changed in (("-", prev - now), ("=" if first else "+", now - prev)): + for share, name, _pid, kind, start, size in sorted(changed): + if want and want.lower() not in name.lower(): + continue + events.append((at, "LOCK", sign + kind, + "%s/%s" % (os.path.basename(share), os.path.basename(name)), + start, size)) + prev, first = now, False + if at >= end: + return events, samples + + +def seconds_of_day(text): + m = TIME.match(text.strip()) + if not m: + sys.exit("unparseable procmon timestamp %r" % text) + hour, half = int(m.group(1)), m.group(5) + if half: + hour = hour % 12 + (12 if half in "Pp" else 0) + return (hour * 3600 + int(m.group(2)) * 60 + int(m.group(3)) + + float("0." + (m.group(4) or "0"))) + + +def detail_num(detail, key): + m = re.search(key + r":\s*([\d,]+)", detail) + return int(m.group(1).replace(",", "")) if m else None + + +def io_events(path, midnight, skew, want, start_sod): + """Procmon rows for OneNote's accesses to .one files, on our clock.""" + with open(path, newline="", encoding="utf-8-sig", errors="replace") as f: + rows = list(csv.DictReader(f)) + if not rows: + return [] + missing = {"Time of Day", "Process Name", "Operation", "Path", "Detail"} - set(rows[0]) + if missing: + sys.exit("procmon csv is missing columns: %s" % ", ".join(sorted(missing))) + events = [] + for r in rows: + target = r["Path"] or "" + if "ONENOTE" not in (r["Process Name"] or "").upper(): + continue + if not (target.upper().startswith("A:") or ".one" in target.lower()): + continue + if want and want.lower() not in target.lower(): + continue + detail = r["Detail"] or "" + sod = seconds_of_day(r["Time of Day"]) + if sod + 43200 < start_sod: + sod += 86400 # Procmon logs a time of day with no date; the trace crossed midnight + events.append((midnight + sod - skew, "IO", + r["Operation"], ntpath.basename(target) or target, + detail_num(detail, "Offset"), detail_num(detail, "Length"))) + return events + + +def render(events): + for at, source, what, target, offset, size in sorted(events, key=lambda e: e[0]): + span = hexes = "" + if offset is not None and size is not None: + span, hexes = "%10d +%-8d" % (offset, size), "(0x%x +0x%x)" % (offset, size) + print((" %s %-4s %-26s %-24s %s %s" % + (datetime.datetime.fromtimestamp(at).strftime("%H:%M:%S.%f")[:-3], + source, what, target, span, hexes)).rstrip()) + + +def trace(seconds, want): + z = zenith() + procmon = procmon_path() + midnight, skew, win_slop = win_clock() + zenith_skew, zenith_slop = zenith_clock(z) + start_sod = time.time() + skew - midnight + cmd(r"if not exist C:\trace mkdir C:\trace") + cmd("del /q %s %s" % (PML, CSV)) + win("spawn", '"%s" /AcceptEula /Quiet /Minimized /BackingFile %s' + % (procmon, PML)) + if cmd('"%s" /WaitForIdle' % procmon)[0]: + sys.exit("procmon never started capturing on the Windows target") + events, samples = poll_locks(z, seconds, want) + cmd('"%s" /Terminate' % procmon) + if cmd('"%s" /OpenLog %s /SaveAs %s' % (procmon, PML, CSV))[0]: + sys.exit("procmon could not convert %s to csv" % PML) + if os.path.exists(LOCAL_CSV): + os.remove(LOCAL_CSV) # a stale csv here would merge as this run's trace + win("get", CSV, LOCAL_CSV) + if not os.path.exists(LOCAL_CSV) or not os.path.getsize(LOCAL_CSV): + sys.exit("no csv came back from wayback; the trace is lost") + io = io_events(LOCAL_CSV, midnight, skew, want, start_sod) + + print("onenote-trace %gs %s %d lock transitions, %d procmon rows" % + (seconds, "file~%s" % want if want else "every .one and everything on A:", + len(events), len(io))) + print(" procmon times shifted %+.3fs onto this mac's clock (%s clock %+.3fs, " + "measured to +-%.3fs)" % (-skew, TARGET or "wayback", skew, win_slop / 2)) + print(" lock times are mac-stamped at observation, %.2fs mean sample interval; " + "zenith's clock is %+.3fs (+-%.3fs) and does not enter the merge" % + ((samples[-1] - samples[0]) / max(len(samples) - 1, 1), zenith_skew, zenith_slop / 2)) + render(events + io) + + +def main(): + global TARGET + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("seconds", type=float) + ap.add_argument("--file", help="only rows whose path contains this") + ap.add_argument("--target", help="Windows MCP target name") + args = ap.parse_args() + TARGET = args.target or TARGET + try: + trace(args.seconds, args.file) + except KeyboardInterrupt: + pass + + +if __name__ == "__main__": + main() diff --git a/tools/power_loss_native.py b/tools/power_loss_native.py new file mode 100644 index 0000000000000000000000000000000000000000..83fb45a8e063c0e71272ea82dbcc608446c9cf2a --- /dev/null +++ b/tools/power_loss_native.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Cold-open the retained storage-interruption matrix with disposable OneNote VMs.""" +import argparse +from concurrent.futures import ThreadPoolExecutor +import hashlib +import json +from pathlib import Path +import runpy +import subprocess +import xml.etree.ElementTree as ET + +from native_runner import capture +from document_model import EXPORTER, view + + +def run(matrix, output, workers): + cases = json.loads((matrix / 'native-cases.json').read_text()) + output.mkdir(parents=True, exist_ok=False) + compare = runpy.run_path(str(Path(__file__).with_name('verify-document.py')))['compare'] + + def verify(item): + digest, name = item + source = matrix / name / 'notebook' + before = {p.name: hashlib.sha256(p.read_bytes()).hexdigest() for p in source.iterdir()} + changed, = [p for p in source.iterdir() if hashlib.md5(p.read_bytes()).hexdigest() == digest] + destination = output / name + capture(source, destination, pdf=True) + compare(source, destination / 'read') + if changed.suffix == '.onetoc2': + document = json.loads(subprocess.check_output([EXPORTER, changed])) + _, revision = view(document, document['root']) + color = revision['nodes'][revision['roots']['1']]['kind']['color'] + expected = '#' + int(color).to_bytes(4, 'little')[:3].hex().upper() + assert ET.parse(destination / 'read/hierarchy.xml').getroot().get('color') == expected, 'Native notebook color differs from the persisted TOC' + assert before == {p.name: hashlib.sha256(p.read_bytes()).hexdigest() for p in source.iterdir()} + assert json.loads((destination / 'teardown.json').read_text())['absent'] + (destination / 'verified.json').write_text(json.dumps({'source_sha256': before, 'native_comparison': True, 'vm_deleted': True}, indent=2)) + print('Verified native recovery:', name, flush=True) + return name + + with ThreadPoolExecutor(max_workers=workers) as pool: + verified = list(pool.map(verify, cases.items())) + (output / 'result.json').write_text(json.dumps({'cases': sorted(verified), 'native_comparison': True}, indent=2)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('matrix', type=Path) + parser.add_argument('output', type=Path) + parser.add_argument('--workers', type=int, default=2) + args = parser.parse_args() + if not 1 <= args.workers <= 4: + parser.error('Choose one to four simultaneous captures.') + run(args.matrix, args.output, args.workers) diff --git a/tools/random_edit_campaign.py b/tools/random_edit_campaign.py new file mode 100644 index 0000000000000000000000000000000000000000..1fef1080b28b5bbd34dc224e36a8e2a83dfc845a --- /dev/null +++ b/tools/random_edit_campaign.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +"""Edit disposable notebook copies and check every changed document object.""" +import argparse +import copy +import hashlib +import json +from pathlib import Path +import shutil +import stat +import subprocess +import tempfile + +from document_model import DEFAULT_CONTEXT, EXPORTER, ordered_pages, view, walk + +ROOT = Path(__file__).resolve().parent.parent +EDITOR = ROOT / 'target/debug/examples/random_edit' + + +def export(path): + with tempfile.TemporaryDirectory() as temporary: + output = Path(temporary) / 'model' + subprocess.run([EXPORTER, path, output], check=True) + return (json.loads((output / 'document.json').read_text()), + json.loads((output / 'text.json').read_text()), + sorted(hashlib.sha256(p.read_bytes()).hexdigest() for p in (output / 'assets').iterdir())) + + +def verify(before, after, record): + old, old_text, old_assets = before + new, new_text, new_assets = after + assert old_assets == new_assets, 'An edit changed embedded payload bytes' + sid, oid = record['space'], record['object'] + old_rid, previous = view(old, sid) + new_rid, current = view(new, sid) + expected_runs = copy.deepcopy(old_text[sid][old_rid][oid]) + runs = previous['nodes'][oid]['kind']['runs'] + start, end = record['range'] + selected = max(i for i, run in enumerate(runs) if run['start'] <= start and end <= run['end']) + offset = runs[selected]['start'] + assert record['run_start'] == offset and record['run_before'] == expected_runs[selected]['text'], 'The CLI logged another insertion run' + encoded = expected_runs[selected]['text'].encode('utf-16-le') + prefix, suffix = encoded[:(start - offset) * 2], encoded[(end - offset) * 2:] + expected_runs[selected]['text'] = prefix.decode('utf-16-le') + record['replacement'] + suffix.decode('utf-16-le') + assert new_text[sid][new_rid][oid] == expected_runs, 'Text or inherited run formatting differs from the intended splice' + expected = copy.deepcopy(old) + space = expected['spaces'][sid] + space['contexts'][DEFAULT_CONTEXT] = new_rid + space['revisions'][new_rid] = copy.deepcopy(previous) + if old_rid not in space['contexts'].values(): del space['revisions'][old_rid] + node = space['revisions'][new_rid]['nodes'][oid] + encoded = node['kind']['text'].encode('utf-16-le') + node['kind']['text'] = encoded[:start * 2].decode('utf-16-le') + record['replacement'] + encoded[end * 2:].decode('utf-16-le') + revision = space['revisions'][new_rid] + page = revision['nodes'][record['page']] + titles = [(key, n['kind']['text']) for key, n in walk(revision, record['page']) + if n['kind']['type'] == 'RichText' and not n['kind']['boilerplate'] + and any(field['id'] == 0x88001cb4 for field in n['extra'][0])] + assert len(titles) <= 1 + title = titles[0][1].lstrip().split('\r')[0] if titles else '' + if not title or titles[0][0] == oid: + automatic = not title + if automatic: + body = copy.deepcopy(revision) if page['kind']['rtl'] else revision + if page['kind']['rtl']: + for item in body['nodes'].values(): + if item['kind']['type'] == 'Row': item['children'].reverse() + roots = sorted(page['children'], key=lambda key: (body['nodes'][key]['layout']['y'] or 0, + -(body['nodes'][key]['layout']['x'] or 0) + if page['kind']['rtl'] else body['nodes'][key]['layout']['x'] or 0)) + candidates = [n['kind']['text'].strip().split('\r')[0].rstrip() + for root in roots for _, n in walk(body, root) + if n['kind']['type'] == 'RichText' and not n['kind']['boilerplate']] + title = next((text for text in candidates if text), '') + encoded_title = title.encode('utf-16-le') + end = 510 + if len(encoded_title) > end and 0xd800 <= int.from_bytes(encoded_title[end - 2:end], 'little') <= 0xdbff: end += 2 + title = encoded_title[:end].decode('utf-16-le').rstrip() + revision['nodes'][revision['roots']['2']]['kind']['title'] = title + page['kind']['alternate_title'] = title if automatic else '' + observed = copy.deepcopy(new) + changed = observed['spaces'][sid]['revisions'][new_rid]['nodes'][oid] + assert record['started_ms'] // 1000 - 315532800 <= changed['modified'] <= record['finished_ms'] // 1000 - 315532800, 'Modification time falls outside the edit interval' + pending = [(record['page'], [])] + ancestors = set() + while pending: + key, path = pending.pop() + assert key not in path, 'Page content has a cycle' + if key == oid: + ancestors.update(path) + else: + parent = previous['nodes'][key] + pending.extend((child, path + [key]) for child in parent['children'] + parent['content'] + parent['structure']) + for key in ancestors: + if previous['nodes'][key]['modified'] is not None: + revision['nodes'][key]['modified'] = changed['modified'] + del node['modified'], changed['modified'] + del node['kind']['runs'], changed['kind']['runs'] + assert expected == observed, 'An edit changed unrelated document structure, metadata or properties' + + +def run(source, output, seed, rounds): + source = source.resolve(strict=True) + output = output.resolve() + if output.is_relative_to(source): raise ValueError('Choose an output directory outside the source notebook.') + output.mkdir(parents=True, exist_ok=False) + notebook = output / 'notebook' + shutil.copytree(source, notebook) + for file in notebook.rglob("*"): + if file.is_file(): file.chmod(file.stat().st_mode | stat.S_IWUSR) + hashes = {p.relative_to(source).as_posix(): hashlib.sha256(p.read_bytes()).hexdigest() + for p in source.rglob('*') if p.is_file()} + (output / 'source.json').write_text(json.dumps(hashes, indent=2)) + (output / 'run.json').write_text(json.dumps({'seed': seed, 'rounds': rounds, + 'editor_sha256': hashlib.sha256(EDITOR.read_bytes()).hexdigest(), + 'oracle_sha256': hashlib.sha256(Path(__file__).read_bytes()).hexdigest()}, indent=2)) + count = 0 + with (output / 'operations.jsonl').open('w') as log: + for file in sorted(notebook.rglob('*.one')): + before = export(file) + pages = [(sid, page) for sid, _, _, page in ordered_pages(before[0])] + for _ in range(rounds): + for sid, page in pages: + result = subprocess.run([EDITOR, file, '--in-place', str(seed + count), page], capture_output=True, text=True) + record = json.loads(result.stdout) if result.stdout else {} + record.update(file=file.relative_to(notebook).as_posix(), exit=result.returncode, stderr=result.stderr) + log.write(json.dumps(record, ensure_ascii=False) + '\n'); log.flush() + assert result.returncode == 0 and record.get('state') == 'Committed', f'Page edit failed: {record}' + after = export(file) + verify(before, after, record) + before = after + count += 1 + assert all(hashlib.sha256((source / path).read_bytes()).hexdigest() == digest for path, digest in hashes.items()), 'A source file changed during the campaign' + (output / 'result.json').write_text(json.dumps({'verified_edits': count, 'source_files_unchanged': len(hashes)}, indent=2)) + print(f'Verified {count} edits; {len(hashes)} source files unchanged') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('source', type=Path) + parser.add_argument('output', type=Path) + parser.add_argument('--seed', type=int, default=42) + parser.add_argument('--rounds', type=int, default=1) + args = parser.parse_args() + if args.rounds <= 0 or args.seed < 0: parser.error('Use positive rounds and a nonnegative seed.') + run(args.source, args.output, args.seed, args.rounds) diff --git a/tools/smb-proxy.py b/tools/smb-proxy.py new file mode 100644 index 0000000000000000000000000000000000000000..f2cf7bc630bdeea90fe141683f7af929afb910f4 --- /dev/null +++ b/tools/smb-proxy.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +"""Trace a dedicated test SMB session and cut selected responses before delivery.""" +import argparse +import asyncio +import json +from pathlib import Path +import struct +import time + + +async def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('control', type=Path) + parser.add_argument('--port', type=int, default=11445) + parser.add_argument('--server', default='10.0.0.1') + args = parser.parse_args() + writers = set() + state = {'mode': 'up'} + previous = None + blocked = False + matched = 0 + + def record(**fields): + print(json.dumps({'time': time.time(), **fields}), flush=True) + + async def controls(): + nonlocal state, previous, blocked, matched + while True: + try: + raw = args.control.read_bytes() + if raw != previous: + state = json.loads(raw) + previous, matched = raw, 0 + blocked = state.get('mode') == 'down' + record(control=state) + if blocked: + for writer in list(writers): + writer.transport.abort() + except (FileNotFoundError, json.JSONDecodeError): + pass + await asyncio.sleep(0.05) + + async def connection(client, client_writer): + nonlocal blocked, matched + if blocked: + client_writer.close() + return + server_writer = None + try: + server, server_writer = await asyncio.open_connection(args.server, 445) + writers.update((client_writer, server_writer)) + + async def forward(reader, writer, direction): + nonlocal blocked, matched + while True: + prefix = await reader.readexactly(4) + frame = await reader.readexactly(int.from_bytes(prefix[1:], 'big')) + at = 0 + while frame[at:at+4] == b'\xfeSMB': + command = struct.unpack_from('= 100: + data_offset = struct.unpack_from('Text') + other = ET.fromstring('Text') + self.assertEqual(content(source), content(other)) + other.find('T').text = 'Different' + self.assertNotEqual(content(source), content(other)) + other.find('T').text = 'Text' + other.set('style', 'font-weight:normal') + self.assertNotEqual(content(source), content(other)) + + def test_geometry_and_table_order_remain_significant(self): + source = ET.fromstring('AB
') + other = ET.fromstring('BA
') + self.assertNotEqual(content(source), content(other)) + first = ET.fromstring('') + second = ET.fromstring('') + self.assertNotEqual(content(first), content(second)) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/test_concurrent_rust.py b/tools/test_concurrent_rust.py new file mode 100644 index 0000000000000000000000000000000000000000..ae2133ea731d71c1b30830cd4e0ae539d1ed2731 --- /dev/null +++ b/tools/test_concurrent_rust.py @@ -0,0 +1,58 @@ +import copy +import unittest +from concurrent_rust import verify + + +class OracleTests(unittest.TestCase): + def setUp(self): + self.logs = { + 'w0': [{'event': 'ready'}, {'event': 'commit', 'source_transaction': 1, + 'operation': 0, 'token': ' [w0:0]', 'started_us': 10, 'finished_us': 30}, {'event': 'done'}], + 'w1': [{'event': 'ready'}, {'event': 'commit', 'source_transaction': 2, + 'operation': 0, 'token': ' [w1:0]', 'started_us': 20, 'finished_us': 40}, {'event': 'done'}], + 'r0': [{'event': 'ready'}, {'event': 'read', 'transaction': 3, + 'text': 'Concurrent edits: [w0:0] [w1:0]', 'started_us': 50, 'finished_us': 60}, {'event': 'done'}], + } + + def test_valid_history_and_deliberate_corruption(self): + self.assertEqual(verify(self.logs, 1, 2, 1)['commits'], 2) + for field, value in [('text', 'Concurrent edits: [w1:0]'), ('transaction', 2), ('finished_us', 19)]: + logs = copy.deepcopy(self.logs) + logs['r0'][1][field] = value + with self.assertRaises(AssertionError): + verify(logs, 1, 2, 1) + + def test_duplicate_snapshot_and_missing_acknowledgement(self): + logs = copy.deepcopy(self.logs) + logs['w1'][1]['source_transaction'] = 1 + with self.assertRaises(AssertionError): + verify(logs, 1, 2, 1) + logs['w1'].pop(1) + with self.assertRaises(AssertionError): + verify(logs, 1, 2, 1) + + def test_length_changing_unicode_history_and_wrong_intent(self): + previous = 'Concurrent edits:' + for i in range(2): + events = self.logs[f'w{i}'] + event = events[1] + event['attempt'] = 1 + replacement = ' café 🦀' + event['token'] + events.insert(1, {'event': 'intent', 'attempt': 1, 'operation': 0, + 'source_transaction': i + 1, 'before': previous, 'token': event['token'], + 'range': [17, len(previous.encode('utf-16-le')) // 2], 'replacement': replacement}) + previous = 'Concurrent edits:' + replacement + self.logs['r0'][1]['text'] = previous + self.assertEqual(verify(self.logs, 1, 2, 1, edit=True)['final_text'], previous) + self.logs['w1'][1]['range'][0] = 24 + with self.assertRaises(UnicodeDecodeError): + verify(self.logs, 1, 2, 1, edit=True) + + def test_serial_calls_do_not_count_as_concurrency(self): + self.logs['w1'][1]['started_us'] = 31 + with self.assertRaisesRegex(AssertionError, 'never overlapped'): + verify(self.logs, 1, 2, 1) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/test_crash_recovery.py b/tools/test_crash_recovery.py new file mode 100644 index 0000000000000000000000000000000000000000..c8c91c373baad1df07374c6ee0383cff9ef5d32a --- /dev/null +++ b/tools/test_crash_recovery.py @@ -0,0 +1,36 @@ +import copy +import unittest + +from crash_recovery import verify_text + + +class RecoveryOracleTest(unittest.TestCase): + def test_accounting_and_corruption_controls(self): + logs = {'w0': [ + {'event': 'intent', 'token': ' [w0:0]', 'attempt': 1}, + {'event': 'commit', 'token': ' [w0:0]', 'attempt': 1, 'started_us': 5, 'finished_us': 10}, + {'event': 'intent', 'token': ' [w0:1]', 'attempt': 2}, + {'event': 'commit_error', 'token': ' [w0:1]', 'attempt': 2, 'state': 'Unknown', 'started_us': 18, 'finished_us': 20}, + {'event': 'read', 'text': 'Base [w0:0]', 'started_us': 15, 'finished_us': 17}, + ]} + self.assertEqual(verify_text('Base', 'Base [w0:0] [w0:1]', logs)['unacknowledged_retained'], [' [w0:1]']) + self.assertEqual(verify_text('Base', 'Base [w0:0]', logs)['acknowledged'], 1) + for text in ['Base', 'Other [w0:0]', 'Base [w0:0] [w0:0]', 'Base [w0:0] [w0:2]', 'Base [w0:0] [w0:']: + with self.assertRaises(AssertionError): + verify_text('Base', text, logs) + lost_read = copy.deepcopy(logs) + lost_read['w0'][-1]['text'] = 'Base' + with self.assertRaisesRegex(AssertionError, 'read missed'): + verify_text('Base', 'Base [w0:0]', lost_read) + committed_error = copy.deepcopy(logs) + committed_error['w0'][3]['state'] = 'Committed' + with self.assertRaisesRegex(AssertionError, 'acknowledged edit was lost'): + verify_text('Base', 'Base [w0:0]', committed_error) + rejected = copy.deepcopy(logs) + rejected['w0'][3]['state'] = 'NotCommitted' + with self.assertRaisesRegex(AssertionError, 'definitively uncommitted'): + verify_text('Base', 'Base [w0:0] [w0:1]', rejected) + future = copy.deepcopy(logs) + future['w0'][1]['started_us'] = 18 + with self.assertRaisesRegex(AssertionError, 'future edit'): + verify_text('Base', 'Base [w0:0]', future) diff --git a/tools/test_document_oracle.py b/tools/test_document_oracle.py new file mode 100644 index 0000000000000000000000000000000000000000..8a6badddb447581f5fa691b2485ff98465ba88d6 --- /dev/null +++ b/tools/test_document_oracle.py @@ -0,0 +1,115 @@ +from pathlib import Path +import re +import runpy +import shutil +import subprocess +from tempfile import TemporaryDirectory +import unittest +import xml.etree.ElementTree as ET + +ROOT = Path(__file__).resolve().parent.parent +compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare'] + + +class DocumentOracleTest(unittest.TestCase): + def test_native_2010_does_not_render_the_documented_cell_shading_control(self): + import pdfplumber + fixture = ROOT / 'corpus/m6/cell-shading-control-01/read/page-001' + page = ET.parse(fixture.with_suffix('.xml')).getroot() + cells = [n for n in page.iter() if n.tag.endswith('}Cell')] + self.assertEqual(len(cells), 6) + self.assertTrue(all('shadingColor' not in n.attrib for n in cells)) + with pdfplumber.open(fixture.with_suffix('.pdf')) as pdf: + table_page = pdf.pages[1] + self.assertIn('Cell 0,0', table_page.extract_text()) + self.assertTrue(all(tuple(rect.get('non_stroking_color') or ()) != (1, 1, 0) + for rect in table_page.rects)) + + def test_rust_saved_expansion_is_honored_by_a_fresh_native_cache(self): + import pdfplumber + fixture = ROOT / 'corpus/m6/rust-collapse-control-01' + pages = [(p, ET.parse(p).getroot()) for p in (fixture / 'read').glob('page-*.xml')] + path, page = next((p, r) for p, r in pages if r.get('name') == 'Paragraph controls') + parent, = [n for n in page.iter() if n.tag.endswith('}OE') + and any(c.tag.endswith('}T') and c.text == 'Collapsed parent' for c in n)] + self.assertIsNone(parent.get('collapsed')) + with pdfplumber.open(path.with_suffix('.pdf')) as pdf: + text = ''.join(p.extract_text() or '' for p in pdf.pages) + self.assertIn('Hidden child remains stored', text) + self.assertIn('Grandchild', text) + + def test_native_expansion_changes_the_view_without_changing_notebook_bytes(self): + import pdfplumber + original = ROOT / 'corpus/m6/native-features-01/notebook/Features.one' + capture = ROOT / 'corpus/m6/native-expanded-control-ui-01' + self.assertEqual(original.read_bytes(), (capture / 'notebook/Features.one').read_bytes()) + for directory, collapsed in [('before-read', '1'), ('read', None)]: + candidates = [(p, ET.parse(p).getroot()) for p in (capture / directory).glob('page-*.xml')] + path, page = next((p, r) for p, r in candidates if r.get('name') == 'Paragraph controls') + parent, = [n for n in page.iter() if n.tag.endswith('}OE') + and any(c.tag.endswith('}T') and c.text == 'Collapsed parent' for c in n)] + self.assertEqual(parent.get('collapsed'), collapsed) + self.assertIn('Grandchild', ''.join(parent.itertext())) + with pdfplumber.open(path.with_suffix('.pdf')) as pdf: + text = ''.join(p.extract_text() or '' for p in pdf.pages) + self.assertNotIn('Grandchild', text) + + def test_missing_or_empty_source_cannot_pass(self): + fixture = ROOT / 'corpus/m6/native-math-01/read' + with TemporaryDirectory() as temporary: + source = Path(temporary) + with self.assertRaises(FileNotFoundError): + compare(source / 'missing', fixture) + with self.assertRaisesRegex(AssertionError, 'No notebook sections'): + compare(source, fixture) + + def test_equations_survive_a_fresh_native_cache(self): + captures = [] + for fixture in ('native-math-01', 'native-math-cold-01'): + pages = [ET.parse(p).getroot() for p in (ROOT / 'corpus/m6' / fixture / 'read').glob('page-*.xml')] + page, = [p for p in pages if p.get('name') == 'Equation controls'] + equations = [ET.fromstring(expression) for node in page.iter() if node.tag.endswith('}T') + for expression in re.findall(r'', node.text or '', re.S)] + self.assertEqual(len(equations), 3) + ns = '{http://www.w3.org/1998/Math/MathML}' + self.assertEqual([n.tag for n in equations[0]], [ns + n for n in ('msup', 'mo', 'msup', 'mo', 'msup')]) + self.assertEqual(''.join(equations[0].itertext()), 'x2+y2=z2') + self.assertEqual([n.tag for n in equations[1]], [ns + 'mfrac']) + self.assertEqual([''.join(n.itertext()) for n in equations[1][0]], ['a+b', 'c+d']) + self.assertEqual(''.join(equations[2].itertext()), '𝛼+𝛽') + self.assertNotIn('display', equations[2].attrib) + captures.append([ET.tostring(n) for n in equations]) + self.assertEqual(*captures) + + def test_rtl_xml_order_matches_native_visual_column_order(self): + import pdfplumber + fixture = ROOT / 'corpus/m6/native-page-direction-03' + with pdfplumber.open(fixture / 'read/page-000.pdf') as pdf: + words = pdf.pages[0].extract_words() + right = [word for word in words if word['text'] == 'Right'] + left = [word for word in words if word['text'] == 'Left'] + self.assertEqual((len(right), len(left)), (1, 1)) + self.assertLess(right[0]['x0'], left[0]['x0']) + with TemporaryDirectory() as temporary: + native = Path(temporary) / 'read' + shutil.copytree(fixture / 'read', native) + compare(fixture / 'notebook', native) + + def test_changed_origin_requires_matching_native_coordinates(self): + fixture = ROOT / 'corpus/m6/native-origin-controls-01' + with TemporaryDirectory() as temporary: + output = Path(temporary) + notebook = output / 'notebook' + shutil.copytree(fixture / 'input/notebook', notebook) + shutil.copytree(fixture / 'read', output / 'read') + compare(notebook, output / 'read') + subprocess.run([ROOT / 'target/debug/examples/edit_property', + notebook / 'synthetic.one', output / 'changed.one', + '6000b', '14001d0f', '00004040', '00008040'], check=True) + (output / 'changed.one').replace(notebook / 'synthetic.one') + with self.assertRaisesRegex(AssertionError, 'coordinate differences'): + compare(notebook, output / 'read') + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/test_native_format.py b/tools/test_native_format.py new file mode 100644 index 0000000000000000000000000000000000000000..4cc5ac04f69ba2363f3723194fec607d5cc433e8 --- /dev/null +++ b/tools/test_native_format.py @@ -0,0 +1,61 @@ +import unittest +import xml.etree.ElementTree as ET +from native_format import compare_formats, native_characters, Runs +from native_xml import ns, Text, project_text + + +class FormatOracleTest(unittest.TestCase): + def test_native_omits_exactly_one_final_paragraph_break(self): + for stored, exported in [('A\r\r', 'A\n'), ('\rA\r', '\nA'), ('\r', ''), ('\r\r', '\n'), ('A\n', 'A\n')]: + with self.subTest(stored=stored): + node = {'format': {'bold': True}, 'kind': {'text': stored, 'paragraph_style': None, + 'runs': [{'start': 0, 'end': len(stored), 'format': None}]}} + native = [[(c, {'bold': True}) for c in exported]] + self.assertEqual(compare_formats({'nodes': {}}, [node], native), (len(exported), [])) + with self.assertRaisesRegex(AssertionError, 'Visible text runs differ'): + compare_formats({'nodes': {}}, [node], [[(c, {'bold': True}) for c in exported + '\n']]) + + def test_native_break_formatting_and_tabs_preserve_distinct_source_text(self): + html = 'A

\nB

\nC        D' + expected = 'A\n\nB\nC' + '\u00a0' * 8 + 'D' + self.assertEqual(''.join(Text(html).parts), expected) + runs = Runs(html, {}) + self.assertEqual(''.join(c for c, _ in runs.characters), expected) + self.assertTrue(runs.characters[2][1]['bold']) + self.assertNotIn('bold', runs.characters[4][1]) + self.assertEqual(project_text('A\r\rB\rC\tD'), expected) + self.assertEqual(project_text('\u00a0' * 8), '\u00a0' * 8) + + def test_utf16_run_boundaries_and_inherited_native_style(self): + page = ET.fromstring(''' + + A<span style="font-style:italic">😀</span>B + ''') + node = {'format': {}, 'kind': {'text': 'A😀B', 'paragraph_style': 'base', 'runs': [ + {'start': 0, 'end': 1, 'format': None}, {'start': 1, 'end': 3, 'format': 'italic'}, + {'start': 3, 'end': 4, 'format': None}, + ]}} + space = {'nodes': {'base': {'format': {'bold': True, 'font': 'Calibri', 'font_size': 14.0}}, + 'italic': {'format': {'italic': True}}}} + expected = native_characters(page, page.findall('one:Outline', ns)) + self.assertTrue(expected[0][0][1]['strike']) + count, differences = compare_formats(space, [node], expected) + self.assertEqual((count, differences), (10, [])) + space['nodes']['italic']['format']['italic'] = False + _, differences = compare_formats(space, [node], expected) + self.assertEqual(differences, [{'paragraph': 0, 'field': 'italic', 'stored': False, + 'native': True, 'characters': 1, 'positions': [1]}]) + + def test_partial_black_omission_is_reported_not_normalized_away(self): + node = {'format': {}, 'kind': {'text': 'ABA', 'paragraph_style': None, 'runs': [ + {'start': 0, 'end': 1, 'format': None}, {'start': 1, 'end': 2, 'format': 'black'}, + {'start': 2, 'end': 3, 'format': None}, + ]}} + space = {'nodes': {'black': {'format': {'highlight': 0}}}} + _, differences = compare_formats(space, [node], [[(c, {'highlight': 'automatic'}) for c in 'ABA']]) + self.assertEqual(differences, [{'paragraph': 0, 'field': 'highlight', 'stored': '#000000', + 'native': 'automatic', 'characters': 1, 'positions': [1]}]) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/test_native_runner.py b/tools/test_native_runner.py new file mode 100644 index 0000000000000000000000000000000000000000..3efb3d890b84b6c8b394283699feb11580937164 --- /dev/null +++ b/tools/test_native_runner.py @@ -0,0 +1,68 @@ +import json +from pathlib import Path +import tempfile +import unittest +from unittest.mock import patch + +import native_runner as runner + + +class NativeRunnerTest(unittest.TestCase): + def test_shutdown_timeout_still_removes_the_owned_clone(self): + with tempfile.TemporaryDirectory() as temporary: + output = Path(temporary) + manifest = output / 'instance.json' + with patch.object(runner, 'vm') as vm, patch.object(runner, 'install_agent', return_value={}): + vm.instance_path.return_value = manifest + vm.create_instance.side_effect = lambda _: manifest.touch() + vm.delete_instance.side_effect = lambda _: manifest.unlink() + vm.running.side_effect = [True, False] + vm.shutdown.side_effect = SystemExit('Windows did not stop') + with runner.clone(output) as name: + vm.create_instance.assert_called_once_with(name) + vm.qmp.assert_called_once_with(name, 'quit') + vm.delete_instance.assert_called_once_with(name) + self.assertEqual(json.loads((output / 'teardown.json').read_text()), {'absent': True}) + + def test_command_timeout_is_a_failure_even_with_stdout(self): + with tempfile.TemporaryDirectory() as temporary: + output = Path(temporary) + with patch.object(runner.windows, 'do_cmd', return_value={ + 'exit': None, 'stdout': 'Read 1 pages.', 'error': 'timed out', + }): + with self.assertRaisesRegex(RuntimeError, 'timed out'): + runner.command('fixture', 'read', output) + result = json.loads((output / 'commands.jsonl').read_text()) + self.assertIsNone(result['exit']) + + def test_failure_still_tears_down_the_owned_clone(self): + with tempfile.TemporaryDirectory() as temporary: + output = Path(temporary) + manifest = output / 'instance.json' + with patch.object(runner.vm, 'instance_path', return_value=manifest), \ + patch.object(runner.vm, 'create_instance', side_effect=lambda _: manifest.touch()), \ + patch.object(runner.vm, 'start_instance'), \ + patch.object(runner.vm, 'wait_instance'), \ + patch.object(runner.vm, 'running', return_value=True), \ + patch.object(runner.vm, 'shutdown') as shutdown, \ + patch.object(runner.vm, 'delete_instance', side_effect=lambda _: manifest.unlink()), \ + patch.object(runner, 'install_agent', return_value={}), \ + patch.object(runner.windows, 'do_health', return_value={}), \ + patch.object(runner.windows, 'do_shot', side_effect=RuntimeError('unreachable')): + with self.assertRaisesRegex(RuntimeError, 'capture failed'): + with runner.clone(output): + raise RuntimeError('capture failed') + shutdown.assert_called_once() + self.assertEqual(json.loads((output / 'teardown.json').read_text()), {'absent': True}) + + def test_output_inside_notebook_does_not_modify_source(self): + with tempfile.TemporaryDirectory() as temporary: + notebook = Path(temporary) + output = notebook / 'new-export' + with self.assertRaisesRegex(ValueError, 'outside'): + runner.capture(notebook, output) + self.assertFalse(output.exists()) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/test_native_stress.py b/tools/test_native_stress.py new file mode 100644 index 0000000000000000000000000000000000000000..d1e6bc663fffbccd739e1e88b7d603265713c4b7 --- /dev/null +++ b/tools/test_native_stress.py @@ -0,0 +1,138 @@ +import copy +import json +from pathlib import Path +import subprocess +import tempfile +import unittest +from native_stress import edit_history, native_history, verify_capture +from native_collaboration import reachable_page_text +from document_model import DEFAULT_CONTEXT + + +class NativeHistoryTests(unittest.TestCase): + def test_conflict_oracle_excludes_unreferenced_history_and_spaces(self): + root = Path(__file__).resolve().parent.parent + with tempfile.TemporaryDirectory() as folder: + output = Path(folder) / 'model' + subprocess.run([root / 'target/debug/examples/document', + root / 'corpus/collaboration/round-01/offline/notebook/synthetic.one', output], check=True) + model = json.loads((output / 'document.json').read_text()) + retained = reachable_page_text(model) + self.assertEqual(list(retained.values()), [['Rust edited during the native outage.'], + ['Native edited while disconnected.']]) + main, conflict = retained + current = model['spaces'][main] + revision = current['revisions'][current['contexts'][DEFAULT_CONTEXT]] + current['revisions']['unreferenced'] = copy.deepcopy(revision) + for node in current['revisions']['unreferenced']['nodes'].values(): + if node['kind']['type'] == 'RichText': node['kind']['text'] = 'History is not recovery' + self.assertEqual(reachable_page_text(model), retained) + revision['nodes'][revision['roots']['1']]['spaces'] = [] + self.assertIn(conflict, model['spaces']) + self.assertEqual(reachable_page_text(model), {main: retained[main]}) + page, = revision['nodes'][revision['roots']['1']]['content'] + revision['nodes'][page]['children'] *= 2 + self.assertEqual(reachable_page_text(model), {main: retained[main] * 2}) + + def setUp(self): + self.logs = {} + text = 'Concurrent edits:' + for i in range(2): + token = f' [w{i}:0]' + at = len(text.encode('utf-16-le')) // 2 + self.logs[f'w{i}'] = [{'event': 'ready'}, + {'event': 'intent', 'attempt': 1, 'operation': 0, 'token': token, + 'replacement': token, 'before': text, 'range': [at, at], 'source_transaction': 1}, + {'event': 'commit', 'attempt': 1, 'operation': 0, 'token': token, + 'source_transaction': 1, 'started_us': i * 20, 'finished_us': i * 20 + 10}, + {'event': 'done'}] + text += token + self.logs['r0'] = [{'event': 'ready'}, {'event': 'read', 'text': text, + 'started_us': 40, 'finished_us': 50}, {'event': 'done'}] + + def test_counter_renumbering_preserves_one_content_history(self): + commits, text = edit_history(self.logs, 1) + self.assertEqual(len(commits), 2) + self.assertEqual(text, self.logs['r0'][1]['text']) + + def test_branches_unexplained_edits_and_incorrect_observations_fail(self): + for field, value in [('before', 'Concurrent edits:'), ('before', 'unknown'), + ('range', [0, 0]), ('replacement', 'wrong')]: + logs = copy.deepcopy(self.logs) + logs['w1'][1][field] = value + with self.assertRaises(AssertionError): edit_history(logs, 1) + for field, value in [('text', 'Concurrent edits:'), ('text', 'unknown'), ('finished_us', 1)]: + logs = copy.deepcopy(self.logs) + logs['r0'][1][field] = value + with self.assertRaises(AssertionError): edit_history(logs, 1) + + def test_content_branch_and_disconnected_history_are_detected(self): + for before, message in [('Concurrent edits:', 'branched'), ('Concurrent edits: unexplained', 'complete content history')]: + logs = copy.deepcopy(self.logs) + logs['w1'][1]['before'] = before + offset = len(before.encode('utf-16-le')) // 2 + logs['w1'][1]['range'] = [offset, offset] + with self.assertRaisesRegex(AssertionError, message): edit_history(logs, 1) + + def test_replacements_chain_by_content_after_native_counter_renumbering(self): + expected = 'Concurrent edits:' + for i in range(2): + events = self.logs[f'w{i}'] + intent = events[1] + intent['before'] = expected + intent['range'] = [len('Concurrent edits:'), len(expected.encode('utf-16-le')) // 2] + intent['replacement'] = ' café 🦀' + intent['token'] + expected = 'Concurrent edits:' + intent['replacement'] + self.logs['r0'][1]['text'] = expected + commits, text = edit_history(self.logs, 1, edit=True) + self.assertEqual((len(commits), text), (2, expected)) + self.logs['w1'][1]['range'][0] = len('Concurrent edits: café ') + 1 + with self.assertRaises(UnicodeDecodeError): edit_history(self.logs, 1, edit=True) + + def test_missing_acknowledgement_is_not_silently_dropped(self): + self.logs['w1'].pop(2) + with self.assertRaises(AssertionError): edit_history(self.logs, 1) + + def test_native_replacement_history_rejects_lost_edits_and_split_surrogates(self): + events = [{'operation': 0, 'token': ' [n0:0]', 'before': 'Native 0:', + 'range': [9, 9], 'replacement': ' café 🦀 [n0:0]'}, + {'operation': 1, 'token': ' [n0:1]', 'before': 'Native 0: café 🦀 [n0:0]', + 'range': [10, 17], 'replacement': ' café 🦀 [n0:1]'}] + self.assertEqual(native_history(events, 0, 2, True), 'Native 0: café 🦀 [n0:1] [n0:0]') + for field, value in [('before', 'Native 0:'), ('range', [15, 16]), + ('operation', 0), ('replacement', 'unrecorded')]: + changed = copy.deepcopy(events) + changed[1][field] = value + with self.assertRaises((AssertionError, UnicodeDecodeError)): + native_history(changed, 0, 2, True) + with self.assertRaises(AssertionError): native_history(events[:-1], 0, 2, True) + + def test_cold_capture_rejects_extra_missing_and_misformatted_content(self): + with tempfile.TemporaryDirectory() as folder: + root = Path(folder) + (root / 'rust').mkdir() + (root / 'n0').mkdir() + (root / 'run.json').write_text(json.dumps({'stress_operations': 1, 'edit': True, + 'rust_writers': 2, 'rust_readers': 1, 'stress_clients': 1})) + text = 'Concurrent edits:' + for i in range(2): + events = self.logs[f'w{i}'] + events[1].update(before=text, range=[17, len(text.encode('utf-16-le')) // 2], + replacement=' café 🦀' + events[1]['token']) + text = 'Concurrent edits:' + events[1]['replacement'] + self.logs['r0'][1]['text'] = text + for actor, events in self.logs.items(): + (root / 'rust' / f'{actor}.jsonl').write_text('\n'.join(map(json.dumps, events))) + event = {'operation': 0, 'token': ' [n0:0]', 'before': 'Native 0:', + 'range': [9, 9], 'replacement': ' café 🦀 [n0:0]', 'bold': True, 'italic': False} + (root / 'n0/stress-events.jsonl').write_text(json.dumps(event), encoding='utf-8-sig') + native = 'Native 0: café 🦀 [n0:0]' + body = f'{text}{native}' + page = root / 'page-000.xml' + page.write_text(f'{body}') + result = verify_capture(root, root) + self.assertEqual((result['rust_intents'], result['native_intents'], result['exact_paragraphs']), (2, 1, 2)) + self.assertGreater(result['native_intended_format_checks'], 0) + for changed in (body + native, body.replace(native, ''), body.replace('bold', 'normal')): + page.write_text(f'{changed}') + with self.assertRaises(AssertionError): verify_capture(root, root) diff --git a/tools/test_notebook_report.py b/tools/test_notebook_report.py new file mode 100644 index 0000000000000000000000000000000000000000..9841f16e30a06d40c73b8e97f230f46e05693c8a --- /dev/null +++ b/tools/test_notebook_report.py @@ -0,0 +1,37 @@ +import base64 +from io import BytesIO +import json +from pathlib import Path +import re +from tempfile import TemporaryDirectory +import unittest +import xml.etree.ElementTree as ET + +from PIL import Image +from notebook_report import generate + + +class NotebookReportTest(unittest.TestCase): + def test_tiff_preview_matches_native_pixels_and_retains_original_bytes(self): + fixture = Path(__file__).resolve().parent.parent / 'corpus/m6/native-features-01' + with TemporaryDirectory() as temporary: + output = Path(temporary) / 'report' + generate(fixture / 'notebook', output) + page, = [p for p in json.loads((output / 'pages.json').read_text()) if p['title'] == 'Image tiff'] + source, = re.findall(r']*src="([^"]+)"', (output / page['report']).read_text()) + preview = output / source + self.assertEqual(preview.suffix, '.png') + original, = (output / 'assets').glob('*.tiff') + self.assertEqual(original.read_bytes(), (fixture / 'notebook/fixture-data/pattern.tiff').read_bytes()) + native, = [root for p in (fixture / 'read').glob('page-*.xml') + if (root := ET.parse(p).getroot()).get('name') == 'Image tiff'] + data, = [n.text for n in native.iter() if n.tag.endswith('}Data')] + with Image.open(BytesIO(base64.b64decode(data))) as expected, Image.open(preview) as actual: + self.assertEqual(actual.size, expected.size) + self.assertEqual(actual.convert('RGBA').tobytes(), expected.convert('RGBA').tobytes()) + references = [a['path'] for p in (output / 'model').glob('*/assets.json') for a in json.loads(p.read_text())] + self.assertIn('../../assets/' + original.name, references) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/test_pdf_format.py b/tools/test_pdf_format.py new file mode 100644 index 0000000000000000000000000000000000000000..a96592a357cb79e59413c01df293c2a5eeca39b8 --- /dev/null +++ b/tools/test_pdf_format.py @@ -0,0 +1,53 @@ +from pathlib import Path +import runpy +import unittest +from types import SimpleNamespace +from unittest.mock import patch + +verify = runpy.run_path(str(Path(__file__).with_name('verify-document.py')))['verify_pdf_black'] + + +class PdfFormatOracleTest(unittest.TestCase): + def test_unmapped_text_cannot_hide_missing_text_or_incorrect_highlighting(self): + chars = [{'text': c, 'x0': i * 2, 'x1': i * 2 + 1, 'top': 0, 'bottom': 1} + for i, c in enumerate('BeforeSilk after tail') if not c.isspace()] + rect = {'fill': True, 'non_stroking_color': 0, 'x0': 12, 'x1': 19, 'top': 0, 'bottom': 1} + page = SimpleNamespace(page_number=1, chars=chars, rects=[rect]) + runs = [{'text': text, 'format': {'hidden': False, 'highlight': highlight}} + for text, highlight in [('Before', None), ('Silk', 0), (' after e\u0301 tail', None)]] + with patch('pdfplumber.open') as opened: + opened.return_value.__enter__.return_value.pages = [page] + self.assertEqual(verify('unused', [runs]), 1) + page.rects.append({**rect, 'x0': 32, 'x1': 35}) + with self.assertRaisesRegex(AssertionError, 'unhighlighted unmapped text'): + verify('unused', [runs]) + page.rects.pop() + runs[2]['text'] = ' after ordinary tail' + with self.assertRaisesRegex(AssertionError, 'ambiguous'): + verify('unused', [runs]) + runs[2].update(text=' after e\u0301 tail', format={'hidden': False, 'highlight': 0}) + with self.assertRaisesRegex(AssertionError, 'visual verification'): + verify('unused', [runs]) + runs[2]['format']['highlight'] = None + page.chars += chars + with self.assertRaisesRegex(AssertionError, 'ambiguous'): + verify('unused', [runs]) + page.chars = [{**chars[0], 'text': 'a', 'x0': i * 2, 'x1': i * 2 + 1} for i in range(3)] + page.rects = [{**rect, 'x0': 0, 'x1': 5}] + with self.assertRaisesRegex(AssertionError, 'ambiguous'): + verify('unused', [[{'text': 'aa', 'format': {'hidden': False, 'highlight': 0}}]]) + + def test_native_pdf_locates_partial_black_by_paragraph_and_character(self): + pdf = Path(__file__).resolve().parent.parent / 'corpus/m6/native-structure-01/read/page-001.pdf' + runs = [{'text': text, 'format': {'hidden': False, 'highlight': highlight}} + for text, highlight in [('Before ', None), ('middle', 0), (' after', None)]] + self.assertEqual(verify(pdf, [runs]), 1) + runs[0]['text'] = 'Before m' + runs[1]['text'] = 'iddle ' + runs[2]['text'] = 'after' + with self.assertRaisesRegex(AssertionError, 'character positions'): + verify(pdf, [runs]) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/test_random_edit_campaign.py b/tools/test_random_edit_campaign.py new file mode 100644 index 0000000000000000000000000000000000000000..a2190fabbac427fe9515aa77d5b6b625ef53f600 --- /dev/null +++ b/tools/test_random_edit_campaign.py @@ -0,0 +1,81 @@ +import copy +from pathlib import Path +import json +import subprocess +import tempfile +import unittest +from random_edit_campaign import EDITOR, ROOT, export, verify +from document_model import ordered_pages + + +class RandomEditOracleTests(unittest.TestCase): + def test_a_random_replacement_cannot_be_a_no_op(self): + with tempfile.TemporaryDirectory() as temporary: + source = Path(temporary) / 'source.one' + subprocess.run([ROOT / 'target/debug/examples/create_section', source, ' café ', 'No-op regression'], check=True) + before = export(source) + for mode in ['create', 'in-place']: + destination = Path(temporary) / (mode + '.one') + if mode == 'create': + args = [EDITOR, source, destination, '301'] + else: + destination.write_bytes(source.read_bytes()) + args = [EDITOR, destination, '--in-place', '301'] + record = json.loads(subprocess.check_output(args)) + self.assertEqual(record['range'], [0, 0]) + self.assertNotEqual(source.read_bytes(), destination.read_bytes()) + verify(before, export(destination), record) + + def test_native_fixture_splice_and_unrelated_damage(self): + source = ROOT / 'corpus/native/20260905-05/snapshots/06-attachment/notebook/synthetic.one' + with tempfile.TemporaryDirectory() as temporary: + destination = Path(temporary) / 'edited.one' + record = json.loads(subprocess.check_output([EDITOR, source, destination, '42'])) + before, after = export(source), export(destination) + verify(before, after, record) + sid, oid = record['space'], record['object'] + rid = after[0]['spaces'][sid]['contexts']['{00000000-0000-0000-0000-000000000000},0'] + for kind in ['format', 'metadata', 'payload', 'structure', 'ancestor-time', 'unrelated-time']: + damaged = copy.deepcopy(after) + if kind == 'format': damaged[1][sid][rid][oid][0]['format']['bold'] = not damaged[1][sid][rid][oid][0]['format']['bold'] + if kind == 'metadata': damaged[0]['spaces'][sid]['revisions'][rid]['nodes'][oid]['created'] = 0 + if kind == 'payload': damaged[2].append('another payload') + if kind == 'structure': damaged[0]['spaces'][sid]['revisions'][rid]['nodes'][oid]['children'].append('another object') + if kind == 'ancestor-time': damaged[0]['spaces'][sid]['revisions'][rid]['nodes'][record['page']]['modified'] = 0 + if kind == 'unrelated-time': + old_rid = before[0]['spaces'][sid]['contexts']['{00000000-0000-0000-0000-000000000000},0'] + old = before[0]['spaces'][sid]['revisions'][old_rid]['nodes'] + nodes = damaged[0]['spaces'][sid]['revisions'][rid]['nodes'] + key = next(key for key, node in nodes.items() if node['modified'] is not None and node['modified'] == old[key]['modified']) + nodes[key]['modified'] = 0 + with self.assertRaises(AssertionError, msg=kind): verify(before, damaged, record) + + def test_seeded_edits_work_on_native_legacy_text(self): + source = ROOT / 'corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one' + with tempfile.TemporaryDirectory() as temporary: + for seed in range(42, 74): + destination = Path(temporary) / f'{seed}.one' + result = subprocess.run([EDITOR, source, destination, str(seed)], capture_output=True, text=True) + self.assertEqual(result.returncode, 0, (seed, result.stderr)) + self.assertTrue(destination.is_file()) + + def test_title_cache_changes_are_required_and_bounded(self): + source = ROOT / 'corpus/m6/native-structure-01/notebook/synthetic.one' + before = export(source) + sid, _, revision, page = next(p for p in ordered_pages(before[0]) if any( + n['kind']['type'] == 'RichText' and any(f['id'] == 0x88001cb4 for f in n['extra'][0]) + for n in p[2]['nodes'].values())) + with tempfile.TemporaryDirectory() as temporary: + destination = Path(temporary) / 'edited.one' + record = json.loads(subprocess.check_output([EDITOR, source, destination, '98', page])) + self.assertTrue(any(f['id'] == 0x88001cb4 for f in revision['nodes'][record['object']]['extra'][0])) + after = export(destination) + verify(before, after, record) + rid = after[0]['spaces'][sid]['contexts']['{00000000-0000-0000-0000-000000000000},0'] + damaged = copy.deepcopy(after) + damaged[0]['spaces'][sid]['revisions'][rid]['nodes'][revision['roots']['2']]['kind']['title'] = revision['nodes'][revision['roots']['2']]['kind']['title'] + with self.assertRaises(AssertionError): verify(before, damaged, record) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/toc_boundary.py b/tools/toc_boundary.py new file mode 100644 index 0000000000000000000000000000000000000000..e5b638b838ec451d6d94e8f0c215e3e4ed1cc556 --- /dev/null +++ b/tools/toc_boundary.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +"""Generate a reproducible TOC edit history that crosses log and counter boundaries.""" +import argparse +from document_model import EXPORTER, view +import hashlib +import json +from pathlib import Path +import shutil +import subprocess +import tempfile + +ROOT = Path(__file__).resolve().parent.parent + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('source', type=Path) + parser.add_argument('destination', type=Path) + args = parser.parse_args() + if args.destination.resolve().is_relative_to(args.source.resolve()): + raise ValueError('Choose a destination outside the source notebook.') + args.destination.mkdir(parents=True, exist_ok=False) + notebook = args.destination / 'notebook' + shutil.copytree(args.source, notebook) + toc = notebook / 'Open Notebook.onetoc2' + original = toc.read_bytes() + doc = json.loads(subprocess.check_output([EXPORTER, toc])) + _, space = view(doc, doc['root']); oid = space['roots']['1'] + color = space['nodes'][oid]['kind']['color'] + history = [] + with tempfile.TemporaryDirectory() as temporary: + source = Path(temporary) / 'current' + source.write_bytes(original) + for value in range(260): + destination = Path(temporary) / 'next' + subprocess.run([ROOT / 'target/debug/examples/edit_property', source, destination, + '20001', '14001cbe', color.to_bytes(4, 'little').hex(), + value.to_bytes(4, 'little').hex(), doc['root'], oid], check=True) + destination.replace(source) + history.append({'before': color, 'after': value}) + color = value + toc.write_bytes(source.read_bytes()) + (args.destination / 'history.json').write_text(json.dumps({ + 'source_sha256': hashlib.sha256(original).hexdigest(), 'space': doc['root'], 'object': oid, + 'property': '14001cbe', 'operations': history, 'result_sha256': hashlib.sha256(toc.read_bytes()).hexdigest(), + }, indent=2)) diff --git a/tools/verify-collaboration.py b/tools/verify-collaboration.py new file mode 100644 index 0000000000000000000000000000000000000000..cac2db27f90b783e2b115739f165a5cde26832b1 --- /dev/null +++ b/tools/verify-collaboration.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +"""Verify captured SMB collaboration and recovery against native cold reads.""" +from collections import defaultdict +import hashlib +import json +from pathlib import Path +import subprocess +import xml.etree.ElementTree as ET +from native_xml import ns, pages, texts + +root = Path(__file__).resolve().parent.parent +corpus = root / 'corpus/collaboration/round-01' +for item in json.loads((corpus / 'manifest.json').read_text())['files']: + data = (corpus / item['path']).read_bytes() + assert len(data) == item['bytes'] + assert hashlib.sha256(data).hexdigest() == item['sha256'], item['path'] + +expected = { + 'fault-01': ['A notebook created in Rust.'], + 'fault-02': ['Publication survived a lost reply.'], + 'fault-03': ['Cleanup survived a lost reply.'], + 'live-01': ['Live Rust: café, 東京, مرحبا', 'Rust same paragraph.', 'Left cell', 'Right cell'], + 'offline-02': ['Rust edited during the native outage.'], + 'contention-01': ['Native edit waited for the lock.'], +} +for name, text in expected.items(): + captured = pages(corpus / 'native' / f'stage5-cold-{name}' / 'read') + assert len(captured) == 1 and texts(captured[0]) == text, name + +subprocess.run(['cargo', 'build', '--quiet', '--example', 'inventory'], cwd=root, check=True) +for case, main, conflict in [ + ('live', 'Rust same paragraph.', 'Native same paragraph.'), + ('offline', 'Rust edited during the native outage.', 'Native edited while disconnected.'), +]: + output = subprocess.check_output([root / 'target/debug/examples/inventory', corpus / case / 'notebook/synthetic.one'], text=True) + by_space = defaultdict(list) + metadata = {} + for row in output.splitlines(): + kind, space, value = row.split('\t') + if kind == 'page': + metadata[space] = int(value, 16) + elif kind in ('ascii', 'unicode'): + by_space[space].append(bytes.fromhex(value).decode('ascii' if kind == 'ascii' else 'utf-16-le').rstrip('\0')) + assert sum(metadata.get(space) == 0x20030 and main in text for space, text in by_space.items()) == 1 + assert any(metadata.get(space) == 0x20038 and conflict in text for space, text in by_space.items()) + +before = ET.parse(corpus / 'live/before-native-edit.xml').getroot() +merged = ET.parse(corpus / 'live/merged.xml').getroot() +assert 'Fictitious: café, 東京, مرحبا' in texts(before) +assert texts(merged) == ['Live Rust: café, 東京, مرحبا', 'Native edited the other outline.', 'Left cell', 'Right cell'] + +# Cache identities and edit timestamps change across native COM saves. +def content(node): + attrs = {key: value for key, value in node.attrib.items() + if key not in ('objectID', 'pathCache', 'creationTime', 'lastModifiedTime')} + return node.tag, sorted(attrs.items()), (node.text or '').strip(), [content(child) for child in node] + +original = pages(root / 'corpus/native-ink/cold-ui-ink/read')[0] +final = pages(corpus / 'native/stage5-cold-live-01/read')[0] +# These exact geometry changes appeared in the first native COM merge capture. +ink_position = original.findall('one:InkDrawing/one:Position', ns)[1] +assert ink_position.get('z') == '7' +assert merged.findall('one:InkDrawing/one:Position', ns)[1].get('z') == '6' +ink_position.set('z', '6') +column = original.find('.//one:Table/one:Columns/one:Column', ns) +assert column.get('width') == '39.14614105224609' +assert merged.find('.//one:Table/one:Columns/one:Column', ns).get('width') == '38.61000061035156' +column.set('width', '38.61000061035156') +for tag in ('Image', 'InkDrawing', 'Table', 'InsertedFile'): + old = [content(node) for node in original.findall(f'.//one:{tag}', ns)] + new = [content(node) for node in final.findall(f'.//one:{tag}', ns)] + assert old and old == new, tag +assert [content(node) for node in original.findall('one:QuickStyleDef', ns)] == [content(node) for node in final.findall('one:QuickStyleDef', ns)] +assert [node.attrib for node in original.findall('one:Outline/one:Position', ns)] == [node.attrib for node in final.findall('one:Outline/one:Position', ns)] +assert next((root / 'corpus/native-ink/cold-ui-ink/read').glob('*.attachment')).read_bytes() == next((corpus / 'native/stage5-cold-live-01/read').glob('*.attachment')).read_bytes() + +lock = json.loads((corpus / 'contention/lock-result.json').read_text()) +assert lock['changed_while_locked'] is False +assert lock['before_sha256'] == lock['after_sha256'] +assert hashlib.sha256((corpus / 'contention/notebook/synthetic.one').read_bytes()).hexdigest() != lock['after_sha256'] +assert 'write' in (corpus / 'contention/locks.txt').read_text() +assert json.loads((corpus / 'contention/controller/inbox/0002.json').read_text())['text'] == expected['contention-01'][0] +for action in (2, 3): + assert (corpus / f'contention/controller/outbox/{action}/done').read_text() == 'ok' + +trace = [json.loads(line) for line in (corpus / 'smb-faults.jsonl').read_text().splitlines()] +cuts = [i for i, row in enumerate(trace) if 'cut' in row] +assert len(cuts) == 3 +start = 0 +for end, counter, state, case in zip(cuts, (1, 2, 256), ('NotCommitted', 'Unknown', 'Committed'), ('fault-01', 'fault-02', 'fault-03')): + cut = trace[end]['cut'] + assert cut['command'] == 7 and cut['direction'] == 'response' and cut['status'] == '0x0' + segment = trace[start:end] + assert [row['transactions'] for row in segment if 'transactions' in row][-1] == counter + assert any([0, 2**64 - 1, 18] in row.get('locks', []) for row in segment) + result = json.loads((corpus / case / 'result.json').read_text()) + assert result['exit'] != 0 + assert result.get('state') == state or f'state: {state},' in result.get('stderr', '') + if counter == 256: + publication = next(i for i, row in enumerate(segment) if row.get('transactions') == 511) + cleanup = next(i for i, row in enumerate(segment) if row.get('transactions') == 256) + assert any(row.get('direction') == 'response' and row.get('command') == 7 and row.get('status') == '0x0' for row in segment[publication + 1:cleanup]) + start = end + 1 +print('Passed: native lock contention, disjoint merge, retained conflict edits, offline convergence, three lost-FLUSH outcomes, and cold native content preservation') diff --git a/tools/verify-corpus.py b/tools/verify-corpus.py new file mode 100644 index 0000000000000000000000000000000000000000..49490266c703af724d0bbe49870e3ae9e56c5772 --- /dev/null +++ b/tools/verify-corpus.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +"""Check native fixture content independently of a revision-store parser.""" +import base64 +from collections import Counter +import hashlib +import json +from pathlib import Path +import xml.etree.ElementTree as ET +from native_xml import ns, texts, pages + +root = Path(__file__).resolve().parent.parent +native = root / 'corpus/native/20260905-05' + + +manifest = json.loads((native / 'manifest.json').read_text(encoding='utf-8-sig')) +assert manifest['status'] == 'completed' +assert manifest['office']['file_version'] == '14.0.7015.1000' +assert len(manifest['fixtures']) == 9 +for fixture in manifest['fixtures']: + name = fixture['name'] + assert fixture['status'] == 'captured', name + snapshot = native / 'snapshots' / name + recorded = json.loads((snapshot / 'snapshot.json').read_text(encoding='utf-8-sig')) + for item in recorded['files']: + data = (snapshot / 'notebook' / item['path'].replace('\\', '/')).read_bytes() + assert len(data) == item['bytes'], name + assert hashlib.sha256(data).hexdigest() == item['sha256'], name + warm = pages(native / 'evidence' / name / 'pages') + cold = pages(root / 'corpus/native' / ('cold-05-' + name) / 'read') + number = int(name[:2]) + assert len(warm) == len(cold) == (0 if number == 0 else 1), name + if not cold: + continue + page = cold[0] + assert texts(page) == texts(warm[0]), name + expected = [] + if number == 2: + expected = ['Fictitious plain text.'] + elif number >= 3: + expected = ['Fictitious: café, 東京, مرحبا'] + if number >= 4: + expected += ['Fictitious positioned outline.'] + if number >= 7: + expected += ['Left cell', 'Right cell'] + assert texts(page) == expected, name + if number >= 3: + assert 'font-weight:bold' in ''.join(n.text or '' for n in page.findall('.//one:T', ns)), name + assert any('color:#1F4E79' in n.get('style', '') for n in page.findall('.//one:OE', ns)), name + if number >= 4: + positioned = [o for o in page.findall('one:Outline', ns) if texts(o) == ['Fictitious positioned outline.']] + assert len(positioned) == 1, name + position = positioned[0].find('one:Position', ns) + assert float(position.get('x')) == 144 and float(position.get('y')) == 96, name + images = page.findall('.//one:Image/one:Data', ns) + assert len(images) == int(number >= 5), name + for data in images: + assert base64.b64decode(data.text) == (native / 'assets/fictitious-image.png').read_bytes(), name + attachments = page.findall('.//one:InsertedFile', ns) + assert len(attachments) == int(number >= 6), name + if attachments: + assert attachments[0].get('preferredName') == 'fictitious-attachment.txt', name + tables = page.findall('.//one:Table', ns) + assert len(tables) == int(number >= 7), name + if tables: + assert [texts(cell) for cell in tables[0].findall('one:Row/one:Cell', ns)] == [['Left cell'], ['Right cell']], name + +ink = root / 'corpus/native-ink/cold-ui-ink/read' +ink_pages = pages(ink) +assert len(ink_pages) == 1 +drawings = ink_pages[0].findall('one:InkDrawing', ns) +assert len(drawings) == 2 +for drawing in drawings: + assert len(base64.b64decode(drawing.find('one:Data', ns).text)) > 20 +attachment = list(ink.glob('*.attachment')) +assert len(attachment) == 1 +assert attachment[0].read_bytes() == (native / 'assets/fictitious-attachment.txt').read_bytes() + +encrypted = root / 'corpus/native-encrypted' +provenance = json.loads((encrypted / 'manifest.json').read_text()) +for item in provenance['files']: + data = (encrypted / item['path']).read_bytes() + assert len(data) == item['bytes'] + assert hashlib.sha256(data).hexdigest() == item['sha256'] +unlocked = pages(encrypted / 'cold-encrypted-02/read') +assert len(unlocked) == 1 +assert texts(unlocked[0]) == [''] + texts(pages(root / 'corpus/native/cold-05-07-table/read')[0]) +assert next((encrypted / 'cold-encrypted-02/read').glob('*.attachment')).read_bytes() == attachment[0].read_bytes() + +deleted = root / 'corpus/native-delete/cold-deletion-05/read' +deleted_pages = pages(deleted) +assert len(deleted_pages) == 2 +marker = [page for page in deleted_pages if texts(page) == ['Recoverable deletion marker.']] +assert len(marker) == 1 +hierarchy = ET.parse(deleted / 'hierarchy.xml') +trash = [p.get('ID') for section in hierarchy.findall('.//one:Section', ns) + if section.get('isInRecycleBin') == 'true' for p in section.findall('one:Page', ns)] +assert marker[0].get('ID') in trash + +private = root / 'corpus/private' +source = json.loads((private / 'source-manifest.json').read_text()) +for item in source['files']: + assert hashlib.sha256((private / 'original' / item['path']).read_bytes()).hexdigest() == item['sha256'] +private_pages = pages(private / 'exact-native/read') +private_ids = {p.get('ID') for p in private_pages} +tree = ET.parse(private / 'exact-native/read/hierarchy.xml') +assert private_ids == {p.get('ID') for p in tree.findall('.//one:Page', ns)} +assert len(private_ids) == 26 +features = Counter(e.tag.rsplit('}', 1)[-1] for page in private_pages for e in page.iter()) +assert features['InkDrawing'] and features['MediaFile'] and features['Image'] and features['Tag'] +print('Passed: 9 generated snapshots, cold ink, deletion and encryption fixtures, attachment bytes, 26 private pages') diff --git a/tools/verify-document.py b/tools/verify-document.py new file mode 100644 index 0000000000000000000000000000000000000000..5454f732aa32d96803e0f3f28915ec2e09bc5fc9 --- /dev/null +++ b/tools/verify-document.py @@ -0,0 +1,362 @@ +#!/usr/bin/env python3 +"""Compare document order and text with independently captured OneNote XML.""" +import argparse +import base64 +import hashlib +from io import BytesIO +from tempfile import TemporaryDirectory +from PIL import Image +from datetime import datetime, timezone +import json +from pathlib import Path, PureWindowsPath +from zoneinfo import ZoneInfo +import subprocess +import xml.etree.ElementTree as ET +import uuid +import unicodedata +from native_xml import ns, pages, texts, project_text +from document_model import EXPORTER, ordered_pages, version_pages, walk +from native_format import native_characters, compare_formats + +ROOT = Path(__file__).resolve().parent.parent + + +def verify_pdf_black(path, paragraphs): + import pdfplumber + characters = [] + with pdfplumber.open(path) as pdf: + for page in pdf.pages: + black = [r for r in page.rects if r.get('fill') and r.get('non_stroking_color') in (0, (0, 0, 0))] + for char in page.chars: + if char['text'].isspace(): + continue + x, y = (char['x0'] + char['x1']) / 2, (char['top'] + char['bottom']) / 2 + covered = any(r['x0'] - .2 <= x <= r['x1'] + .2 and r['top'] - .2 <= y <= r['bottom'] + .2 for r in black) + characters.extend((c, covered, (page.page_number, char, black)) for c in char['text']) + text = ''.join(c for c, _, _ in characters) + checked = 0 + for runs in paragraphs: + source = [(c, run['format']['highlight'] == 0) for run in runs if not run['format']['hidden'] + for c in run['text'] if not c.isspace()] + if not any(black for _, black in source): + continue + value = ''.join(c for c, _ in source) + omitted = [] + if value not in text: + # OneNote can map rendered combining clusters to spaces in PDF text. + projected = [] + index = 0 + while index < len(source): + end = index + 1 + while end < len(source) and unicodedata.combining(source[end][0]): + end += 1 + if end > index + 1: + assert not any(black for _, black in source[index:end]), 'Black-highlighted unmapped text requires visual verification' + omitted.append(len(projected)) + else: + projected.append(source[index]) + index = end + source = projected + value = ''.join(c for c, _ in source) + start = text.find(value) + assert start >= 0 and text.find(value, start + 1) < 0, 'Native PDF paragraph text is missing or ambiguous' + assert [(c, covered) for c, covered, _ in characters[start:start + len(source)]] == source, 'Native PDF black rectangles disagree with the stored character positions' + for index in omitted: + assert 0 < index < len(source), 'Unmapped text has no surrounding PDF characters' + left_page, left, black = characters[start + index - 1][2] + right_page, right, _ = characters[start + index][2] + assert left_page == right_page and abs(left['top'] - right['top']) < .2 and left['x1'] < right['x0'], 'Unmapped text has no unambiguous inline PDF position' + assert not any(r['x0'] < right['x0'] - .2 and r['x1'] > left['x1'] + .2 + and r['top'] < min(left['bottom'], right['bottom']) - .2 + and r['bottom'] > max(left['top'], right['top']) + .2 for r in black), 'Native PDF black rectangles cover unhighlighted unmapped text' + checked += 1 + assert checked, 'No stored black-highlight paragraph was checked' + return checked + + +def visible_text(node, space): + kind = node['kind'] + data = kind['text'].encode('utf-16-le') + text = ''.join(data[run['start'] * 2:run['end'] * 2].decode('utf-16-le') for run in kind['runs'] + if not run['format'] or not space['nodes'][run['format']]['format']['hidden']) + return "" if text == "\u00a0" else project_text(text.removesuffix('\r')) + + +def compare_objects(space, roots, page, native_roots, assets, native_payloads): + types = {'T': 'RichText', 'Image': 'Image', 'InsertedFile': 'Attachment', 'MediaFile': 'Attachment', 'Table': 'Table'} + actual = [n for root in roots for _, n in walk(space, root) + if n['kind']['type'] in types.values() and not n['kind'].get('boilerplate')] + wanted = [n for root in native_roots for n in root.iter() if n.tag.rsplit('}', 1)[-1] in types] + assert [n['kind']['type'] for n in actual] == [types[n.tag.rsplit('}', 1)[-1]] for n in wanted], 'Content object order differs' + parents = {child: parent for parent in page.iter() for child in parent} + definitions = {n.attrib['index']: n for n in page.findall('one:TagDef', ns)} + count = 0 + for node, native in zip(actual, wanted, strict=True): + kind = node['kind'] + if kind['type'] in ('Image', 'Attachment'): + container = space['nodes'][kind['container']]['kind'] + data = assets[json.dumps(container['reference'], sort_keys=True)] + if kind['type'] == 'Image': + expected = base64.b64decode(native.find('one:Data', ns).text) + if data != expected: + actual_image = Image.open(BytesIO(data)).convert('RGBA') + expected_image = Image.open(BytesIO(expected)).convert('RGBA') + assert actual_image.size == expected_image.size and actual_image.tobytes() == expected_image.tobytes(), 'Image pixels differ' + assert bool(kind['background']) == (native.get('backgroundImage') == 'true'), 'Image background state differs' + assert bool(kind['printout']) == (native.get('isPrintOut') == 'true'), 'Image printout state differs' + assert kind['alt'] == native.get('alt'), 'Image alternative text differs' + assert kind['link'] == native.get('hyperlink'), 'Image hyperlink differs' + size = native.find('one:Size', ns) + if size is None: + assert native.get('format') == 'png' and Image.open(BytesIO(expected)).size == (1, 1), 'Native image size is unavailable' + assert node['layout']['max_width'] is None and node['layout']['max_height'] is None, 'Native image omitted an explicit size' + for axis in ('width', 'height'): + native_size = .75 if size is None else float(size.get(axis)) + stored_size = node['layout']['max_' + axis] + if stored_size is None: + stored_size = kind['picture_' + axis] + if stored_size is not None: + # Native printout XML includes the 0.72-point border on each side. + frame_size = stored_size + (1.44 if kind['printout'] else 0) + assert abs(frame_size - native_size) < .002, ('Image display dimension differs', axis, frame_size, native_size) + else: + expected = [p for p in native_payloads if p['page'] == page.get('ID') and p['object'] == parents[native].get('objectID')] + assert len(expected) == 1, 'Native attachment association is ambiguous' + assert hashlib.sha256(data).hexdigest() == expected[0]['sha256'], 'Associated attachment bytes differ' + assert kind['filename'] == expected[0]['name'], 'Attachment filename differs' + media = native.find('one:MediaReference', ns) + assert (kind['recording_id'] is None) == (media is None), 'Recording identity presence differs' + if media is not None: + assert uuid.UUID(bytes_le=bytes(kind['recording_id'])) == uuid.UUID(media.get('mediaID')), 'Recording identity differs' + elif kind['type'] == 'Table': + rows = native.findall('one:Row', ns) + columns = native.findall('one:Columns/one:Column', ns) + assert len(rows) == kind['rows'] and len(columns) == kind['columns'], 'Table dimensions differ' + for column, width in zip(columns, kind['widths'], strict=True): + assert abs(float(column.get('width')) - width) < .002, 'Table column width differs' + assert (kind['locked'] or [False] * len(columns)) == [c.get('isLocked') == 'true' for c in columns], 'Table column lock state differs' + assert len(node['children']) == len(rows), 'Table row count differs' + for oid, row in zip(node['children'], rows, strict=True): + assert len(space['nodes'][oid]['children']) == len(row.findall('one:Cell', ns)), 'Table cell count differs' + tags = native.findall('one:Tag', ns) + parents[native].findall('one:Tag', ns) + tasks = native.findall('one:OutlookTask', ns) + parents[native].findall('one:OutlookTask', ns) + assert len(node['tags']) == len(tags) + len(tasks), 'Associated note tag count differs' + by_type = {int(definitions[t.attrib['index']].attrib['type']): t for t in tags} + assert len(by_type) == len(tags), 'Native note tag types are repeated' + for tag in node['tags']: + if tag['status'] & 4: + assert len(tasks) == 1 and tag['definition'] is None, 'Task association differs' + task = tasks[0] + assert uuid.UUID(bytes_le=bytes(tag['task_id'])) == uuid.UUID(task.get('guidTask')), 'Task identity differs' + for mask, name in [(1, 'completed'), (2, 'disabled')]: + assert bool(tag['status'] & mask) == (task.get(name) == 'true'), 'Task state differs' + for field, name in [('created', 'creationDate'), ('completed', 'completionDate'), ('start', 'startDate'), ('due', 'dueDate')]: + if tag[field]: + actual = datetime.fromtimestamp(tag[field] + 315532800, timezone.utc) + assert actual == datetime.fromisoformat(task.get(name).replace('Z', '+00:00')), 'Task date differs' + else: + assert task.get(name) is None, 'Unset task date differs' + count += 1 + continue + definition = space['nodes'][tag['definition']]['kind'] + expected = by_type[definition['action_type']] + native_definition = definitions[expected.attrib['index']] + assert definition['label'] == native_definition.attrib['name'], 'Tag label differs' + assert definition['shape'] == int(native_definition.attrib['symbol']), 'Tag shape differs' + assert definition['action_type'] == int(native_definition.attrib['type']), 'Tag type differs' + assert bool(tag['status'] & 1) == (expected.attrib['completed'] == 'true'), 'Tag completion differs' + assert bool(tag['status'] & 2) == (expected.attrib['disabled'] == 'true'), 'Tag disabled state differs' + for field, key in [('created', 'creationDate'), ('completed', 'completionDate')]: + if field == 'completed' and tag[field] == 0: + assert key not in expected.attrib, 'Unset tag completion date was exported' + continue + if tag[field] is not None: + timestamp = datetime.fromtimestamp(tag[field] + 315532800, timezone.utc) + assert timestamp == datetime.fromisoformat(expected.attrib[key].replace('Z', '+00:00')), 'Tag date differs' + for field, key in [('color', 'fontColor'), ('highlight', 'highlightColor')]: + value = definition[field] + if value is not None: + color = native_definition.attrib[key].lower() + assert (value == 0xff000000 and color in ('automatic', 'none')) or color == '#' + ''.join(f'{(value >> (8 * i)) & 255:02x}' for i in range(3)), 'Tag color differs' + count += 1 + indexes = native.findall('one:MediaIndex', ns) + parents[native].findall('one:MediaIndex', ns) + assert [uuid.UUID(bytes_le=bytes(value)) for value in node['media_ids']] == [uuid.UUID(value.find('one:MediaReference', ns).get('mediaID')) for value in indexes], 'Recording annotation association differs' + for index in indexes: + assert node['media_time_ms'] == int(index.get('timeIndex')), 'Recording annotation time differs' + return count + + +def compare(notebook, native, versions=None): + notebook = notebook.resolve(strict=True) + native = native.resolve(strict=True) + sections = sorted(notebook.rglob('*.one')) + assert sections, 'No notebook sections were supplied for comparison' + captures = {page.attrib['ID']: (page, path.with_suffix('.pdf')) + for path, page in zip(sorted(native.glob('page-*.xml')), pages(native), strict=True)} + native_payloads = json.loads((native / 'payloads.json').read_text(encoding='utf-8-sig')) if (native / 'payloads.json').exists() else [] + hierarchy = ET.parse(native / 'hierarchy.xml').getroot() + compared = formatting = tags = 0 + discrepancies = [] + pdf_checks = [] + geometry = [] + for path in sections: + relative = path.relative_to(notebook) + if versions is not None and relative.as_posix() != versions['section']: + continue + with TemporaryDirectory() as temporary: + exported = Path(temporary) / 'document' + subprocess.run([EXPORTER, path, exported], check=True) + document = json.loads((exported / 'document.json').read_text()) + resolved_text = json.loads((exported / 'text.json').read_text()) + assets = {json.dumps(a['reference'], sort_keys=True): (exported / a['path']).read_bytes() + for a in json.loads((exported / 'assets.json').read_text())} + candidates = [n for n in hierarchy.findall('.//one:Section', ns) + if PureWindowsPath(n.attrib['path']).parts[-len(relative.parts):] == relative.parts] + assert len(candidates) == 1, (relative, 'native section identity') + expected = [captures[n.attrib['ID']][0] for n in candidates[0].findall('one:Page', ns)] + actual = list(ordered_pages(document)) + if versions is not None: + assert hashlib.sha256(path.read_bytes()).hexdigest() == versions['source_sha256'], 'Historical source changed' + section_pages = {n.get('ID') for n in candidates[0].findall('one:Page', ns)} + historical = [] + expected = [] + associations = [] + for row in versions['pages']: + assert row['native_id'] in section_pages, 'Copied version belongs to a different section' + sid, _, revision, _ = actual[row['source_ordinal']] + choices = list(version_pages(document, sid, revision)) + if row.get('selection') == 'sole-version': + assert len(choices) == 1, 'The native sole-version selection has multiple stored candidates' + matches = [(context, rid, page, oid) for context, rid, page, oid, _ in choices] + else: + matches = [(context, rid, page, oid) for context, rid, page, oid, proxy in choices + if proxy['kind']['modified_filetime'] is not None + and datetime.fromtimestamp(proxy['kind']['modified_filetime'] / 10_000_000 - 11644473600, ZoneInfo(versions['timezone'])).date().isoformat() == row['displayed_date']] + assert len(matches) == 1, 'Native version association is ambiguous' + context, rid, page, oid = matches[0] + historical.append((sid, rid, page, oid)) + expected.append(captures[row['native_id']][0]) + associations.append({**row, 'space': sid, 'context': context, 'revision': rid, 'object': oid}) + available = {(sid, context, oid) for sid, _, revision, _ in actual + for context, _, _, oid, _ in version_pages(document, sid, revision)} + assert {(row['space'], row['context'], row['object']) for row in associations} == available, 'Native captures do not cover every historical page' + assert len(historical) == len(available), 'Historical page is captured more than once' + actual = historical + assert len(actual) == len(expected), (relative, 'page count', len(actual), len(expected)) + for ordinal, ((sid, rid, space, oid), page) in enumerate(zip(actual, expected, strict=True)): + title_nodes = [n for _, n in walk(space, oid) if n['kind']['type'] == 'RichText' + and any(field['id'] == 0x88001cb4 for field in n['extra'][0])] + title = title_nodes[0]['kind']['text'].lstrip().split('\r')[0] if len(title_nodes) == 1 else '' + if title: + assert space['nodes'][space['roots']['2']]['kind']['title'] == title, 'Cached page title differs from visible title text' + cached = space['nodes'][space['roots']['2']]['kind']['title'] or '' + assert page.get('name') == (cached.replace('\t', ' ') or 'Untitled page'), 'Cached page title differs from native navigation' + native_z = {int(n.find('one:Position', ns).attrib['z']) for n in page if n.find('one:Position', ns) is not None} + source_page = space['nodes'][oid] + assert bool(source_page['kind']['rtl']) == (page.find('one:PageSettings', ns).get('RTL') == 'true'), 'Page direction differs' + if source_page['kind']['rtl']: + # Storage orders columns visually left to right; native XML follows page direction. + for table in page.findall('.//one:Table', ns): + columns = table.find('one:Columns', ns) + columns[:] = reversed(columns[:]) + for row in table.findall('one:Row', ns): + row[:] = reversed(row[:]) + assert sum(space['nodes'][child]['kind']['type'] == 'Ink' for child in source_page['children']) == len(page.findall('one:InkDrawing', ns)), 'Opaque ink object count differs' + for child in page: + position = child.find('one:Position', ns) + if position is None: + continue + z = int(position.attrib['z']) + source = space['nodes'][source_page['children'][z]] + if source['kind']['type'] == 'Ink': + continue + for axis in ('x', 'y'): + if source['layout'][axis] is not None: + stored_position, native_position = source['layout'][axis], float(position.attrib[axis]) + origin = source_page['kind']['margin_origin_' + axis] + canonical_origin = (-36.0 if source_page['kind']['rtl'] else 36.0) if axis == 'x' else 14.4 + projected = stored_position + (canonical_origin - origin if origin is not None else 0) + if axis == 'x' and source_page['kind']['rtl']: + assert source['kind']['type'] == 'Outline' and source['layout']['max_width'] is not None, 'RTL positioning requires an outline width' + assert not any(p['id'] == 0x14001c84 for group in source['extra'] for p in group), 'Explicit RTL outline alignment requires a native control' + # Default RTL outlines keep their right edge when native layout changes width. + projected += source['layout']['max_width'] - float(child.find('one:Size', ns).get('width')) + if abs(projected - native_position) > 0.002: + geometry.append({'file': str(relative), 'page': ordinal, 'z': z, 'axis': axis, + 'stored': stored_position, 'origin': origin, 'projected': projected, 'native': native_position}) + roots = list(source_page['structure']) + for z, child in enumerate(source_page['children']): + subtree = list(walk(space, child)) + if z not in native_z: + assert all(n['kind']['type'] in ('Outline', 'Paragraph', 'RichText') for _, n in subtree) + # Native XML omits otherwise empty outlines containing only ASCII spaces. + assert not any(n['kind'].get('text', '').strip(' ') or n['kind'].get('lists') or n['tags'] for _, n in subtree) + continue + roots.append(child) + text_nodes = [n for root in roots for _, n in walk(space, root) + if n['kind']['type'] == 'RichText' and not n['kind']['boilerplate']] + observed = [visible_text(n, space) for n in text_nodes] + native_children = list(page) + content = [n for n in native_children if n.find('one:Position', ns) is not None] + content.sort(key=lambda n: int(n.find('one:Position', ns).attrib['z'])) + wanted = [text for n in native_children if n.tag == '{' + ns['one'] + '}Title' for text in texts(n)] + wanted.extend(text for n in content for text in texts(n)) + if observed != wanted: + destination = native.parent / 'text-order-diff.json' + destination.write_text(json.dumps({'file': str(relative), 'page': ordinal, 'space': sid, + 'actual': observed, 'native': wanted}, indent=2)) + raise AssertionError(f'{relative}: page {ordinal}: ordered text differs; inspect {destination}') + native_roots = [n for n in native_children if n.tag == '{' + ns['one'] + '}Title'] + content + try: + tags += compare_objects(space, roots, page, native_roots, assets, native_payloads) + native_runs = native_characters(page, native_roots) + text_ids = [oid for root in roots for oid, n in walk(space, root) + if n['kind']['type'] == 'RichText' and not n['kind']['boilerplate']] + for text_id, expected_runs in zip(text_ids, native_runs, strict=True): + observed_runs = [(char, run['link']) for run in resolved_text[sid][rid][text_id] + if not run['format']['hidden'] for char in run['text']] + if observed_runs and observed_runs[-1][0] == '\r': + observed_runs.pop() + observed_runs = [(projected, link) for char, link in observed_runs for projected in project_text(char)] + expected_links = [(char, style.get('link')) for char, style in expected_runs] + if observed_runs == [('\u00a0', None)] and not expected_links: + observed_runs = [] + assert observed_runs == expected_links, 'Resolved text or associated hyperlink differs' + count, differences = compare_formats(space, text_nodes, native_runs) + formatting += count + pdf = captures[page.attrib['ID']][1] + if differences and pdf.exists() and all(d['field'] == 'highlight' and d['stored'] == '#000000' and d['native'] == 'automatic' for d in differences): + paragraphs = verify_pdf_black(pdf, [resolved_text[sid][rid][i] for i in text_ids]) + pdf_checks.append({'file': str(relative), 'page': ordinal, 'paragraphs': paragraphs, + 'pdf': pdf.name, 'pdf_sha256': hashlib.sha256(pdf.read_bytes()).hexdigest(), + 'source_sha256': hashlib.sha256(path.read_bytes()).hexdigest(), + 'xml_omissions': differences}) + differences = [] + discrepancies.extend({"file": str(relative), "page": ordinal, **d} for d in differences) + except AssertionError as error: + raise AssertionError((str(relative), ordinal, str(error))) from error + compared += 1 + if versions is not None: + assert compared == len(versions['pages']) > 0, 'No historical source section was compared' + (native.parent / 'geometry-differences.json').write_text(json.dumps(geometry, indent=2)) + (native.parent / 'pdf-format-checks.json').write_text(json.dumps(pdf_checks, indent=2)) + destination = native.parent / 'format-differences.json' + destination.write_text(json.dumps(discrepancies, indent=2)) + if geometry: + raise AssertionError(f'{len(geometry)} coordinate differences; inspect {native.parent / "geometry-differences.json"}') + if discrepancies: + raise AssertionError(f'{len(discrepancies)} formatting differences across {compared} pages; inspect {destination}') + if versions is not None: + (native.parent / 'version-associations.json').write_text(json.dumps(associations, indent=2)) + print(f'Passed: {compared} pages with native-normalized paragraph text/order; {tags} associated tags; {formatting} explicit character-format comparisons') + if pdf_checks: + print(f'Native PDF rectangles independently verified black-highlight character positions in {sum(p["paragraphs"] for p in pdf_checks)} paragraphs where XML omitted formatting.') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('notebook', type=Path) + parser.add_argument('native', type=Path) + parser.add_argument('--versions', type=Path, help='Native history UI date and copied-page associations.') + args = parser.parse_args() + compare(args.notebook.resolve(), args.native.resolve(), json.loads(args.versions.read_text()) if args.versions else None) diff --git a/tools/verify-reader.py b/tools/verify-reader.py new file mode 100644 index 0000000000000000000000000000000000000000..284bf355eb63a452a980a9cfce49f3b7c390c708 --- /dev/null +++ b/tools/verify-reader.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +"""Compare current Rust page content against independent native XML; requires Pillow.""" +import base64 +from collections import Counter +import io +from pathlib import Path +import subprocess +from PIL import Image +from native_xml import Text, ns, pages, texts + +root = Path(__file__).resolve().parent.parent +private = root / 'corpus/private' +paths = sorted((private / 'original').rglob('*.one')) +output = subprocess.check_output( + ['cargo', 'run', '--quiet', '--example', 'inventory', '--', *map(str, paths)], + cwd=root, text=True, +) +records = [line.split('\t') for line in output.splitlines()] +regular = {row[1] for row in records if row[0] == 'page' and row[2] == '20030'} +assert len(regular) == 26 +assert Counter(row[2] for row in records if row[0] == 'page') == {'20030': 26, '2003e': 1} +content = {osid: Counter() for osid in regular} +payloads = {osid: [] for osid in regular} +links = [] +for kind, osid, value in records: + if osid not in regular: + continue + if kind == 'file': + payloads[osid].append(bytes.fromhex(value)) + elif kind in ('ascii', 'unicode'): + data = bytes.fromhex(value) + text = data.decode('utf-16-le').removesuffix('\0') if kind == 'unicode' else data.decode('latin1') + if text.startswith('\ufddfHYPERLINK "'): + target, text = text[len('\ufddfHYPERLINK "'):].rsplit('"', 1) + links.append(target) + if text.strip(): + content[osid][text] += 1 + +native = pages(private / 'exact-native/read') +native_content = [Counter(text for text in texts(page) if text.strip()) for page in native] +assert Counter(tuple(sorted(c.items())) for c in content.values()) == Counter(tuple(sorted(c.items())) for c in native_content) +native_links = [target for page in native for node in page.findall('.//one:T', ns) for target in Text(node.text or '').links] +assert len(links) == 3 and all(target in native_links for target in links) + +exact = converted = 0 +for page, expected in zip(native, native_content, strict=True): + candidates = [data for osid, text in content.items() if text == expected for data in payloads[osid]] + for node in page.findall('.//one:Image/one:Data', ns): + data = base64.b64decode(node.text) + if data in candidates: + exact += 1 + continue + image = Image.open(io.BytesIO(data)).convert('RGBA') + matched = False + for candidate in candidates: + if not candidate.startswith((b'GIF87a', b'GIF89a')): + continue + gif = Image.open(io.BytesIO(candidate)).convert('RGBA') + if gif.size == image.size and gif.tobytes() == image.tobytes(): + matched = True + break + assert matched, 'Native image differs from its stored payload' + converted += 1 + +assert exact == 18 and converted == 3 +assert sum(sum(c.values()) for c in content.values()) == 581 +print('Passed: 26 pages, 581 nonempty text objects by page, 3 hyperlink targets, 18 exact images, 3 native GIF conversions') diff --git a/tools/verify-scale.py b/tools/verify-scale.py new file mode 100644 index 0000000000000000000000000000000000000000..d7e9949b3f659db5281dd8f5904d46fdb4ab3fb0 --- /dev/null +++ b/tools/verify-scale.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +"""Compare a Rust scale fixture against its generator and fresh native capture.""" +import argparse +import hashlib +import json +from pathlib import Path, PureWindowsPath +import subprocess +import xml.etree.ElementTree as ET + +from document_model import EXPORTER, ordered_pages, walk +from native_xml import ns, pages, texts, project_text + +ROOT = Path(__file__).resolve().parent.parent + + +def compare(source, capture): + expected = json.loads((source / 'expected.json').read_text()) + manifest = {row['path']: row for row in json.loads((capture / 'source.json').read_text())} + for name, row in manifest.items(): + assert hashlib.sha256((source / 'notebook' / name).read_bytes()).hexdigest() == row['sha256'], 'Source changed since native capture' + hierarchy = ET.parse(capture / 'read/hierarchy.xml').getroot() + sections = hierarchy.findall('.//one:Section', ns) + order = [PureWindowsPath(section.get('path')).name for section in sections] + assert order == [row['section'] for row in reversed(expected)], 'Native section order differs from the generated reverse order' + native = {page.get('ID'): page for page in pages(capture / 'read')} + section_pages = {PureWindowsPath(section.get('path')).name: section.findall('one:Page', ns) for section in sections} + for row in expected: + output = subprocess.check_output([EXPORTER, source / 'notebook' / row['section']]) + document = json.loads(output) + (_, _, space, oid), = ordered_pages(document) + actual = [node['kind']['text'] for _, node in walk(space, oid) if node['kind']['type'] == 'RichText'] + assert actual == [row['text']], (row['section'], 'Rust text differs from generator input') + page, = section_pages[row['section']] + assert texts(native[page.get('ID')]) == [project_text(row['text'])], (row['section'], 'Native text differs from generator input') + print(f'Passed {len(expected)} sections and {sum(len(row["text"]) for row in expected):,} Unicode scalars against the independent generator input; reverse section order survived native import.') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('source', type=Path) + parser.add_argument('capture', type=Path) + args = parser.parse_args() + compare(args.source, args.capture) diff --git a/tools/verify-writer.py b/tools/verify-writer.py new file mode 100644 index 0000000000000000000000000000000000000000..b97d9702b8c5c804448b680a633cd5e9623c8c0d --- /dev/null +++ b/tools/verify-writer.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +"""Verify captured native reads of Rust-written files.""" +import copy +import hashlib +import json +from pathlib import Path +import subprocess +import xml.etree.ElementTree as ET +from native_xml import ns, pages, texts + +root = Path(__file__).resolve().parent.parent +corpus = root / 'corpus/writer' +manifest = json.loads((corpus / 'manifest.json').read_text()) +for item in manifest['files']: + data = (corpus / item['path']).read_bytes() + assert len(data) == item['bytes'] + assert hashlib.sha256(data).hexdigest() == item['sha256'] + +for run in ['cold-edit-01', 'cold-edit-02']: + captured = pages(corpus / run / 'read') + assert len(captured) == 1 and texts(captured[0]) == ['Portable plain text...'] + +for before, after in [ + (root / 'corpus/native/20260905-05/snapshots/02-text/notebook/synthetic.one', corpus / 'edit-01/notebook/synthetic.one'), + (corpus / 'native-edit-02/notebook/synthetic.one', corpus / 'edit-02/notebook/synthetic.one'), + (root / 'corpus/native-ink/20260905-ui/notebook/synthetic.one', corpus / 'complex-01/notebook/synthetic.one'), +]: + source = before.read_bytes() + assert after.read_bytes()[1024:len(source)] == source[1024:] + +native_saved = subprocess.check_output(['cargo', 'run', '--quiet', '--example', 'inventory', '--', str(corpus / 'native-edit-02/notebook/synthetic.one')], cwd=root, text=True) +assert [bytes.fromhex(row.split('\t')[2]).decode('ascii') for row in native_saved.splitlines() if row.startswith('ascii\t')] == ['Fictitious plain text.'] + +before = pages(root / 'corpus/native-ink/cold-ui-ink/read')[0] +after = pages(corpus / 'cold-complex-01/read')[0] +assert texts(after) == ['Compatible: café, 東京, مرحبا', 'Fictitious positioned outline.', 'Left cell', 'Right cell'] + + +def normalized(page): + page = copy.deepcopy(page) + for node in page.iter(): + for name in ['ID', 'objectID', 'pathCache', 'selected']: + node.attrib.pop(name, None) + if node.text: + node.text = node.text.replace('Fictitious: café', 'Compatible: café') + if not node.text.strip(): + node.text = None + node.tail = None + for outline in page.findall('one:Outline', ns): + if texts(outline) == ['Compatible: café, 東京, مرحبا']: + # OneNote recalculates outline height when the replacement text wraps. + outline.find('one:Size', ns).attrib.pop('height') + return page + + +def fingerprint(node): + return node.tag, sorted(node.attrib.items()), node.text, [fingerprint(child) for child in node] + + +assert fingerprint(normalized(before)) == fingerprint(normalized(after)) +assert next((root / 'corpus/native-ink/cold-ui-ink/read').glob('*.attachment')).read_bytes() == next((corpus / 'cold-complex-01/read').glob('*.attachment')).read_bytes() +print('Passed: native edit/save/read cycle; Unicode edit preserves native formatting, positions, table, image, ink, and attachment bytes') + +assert ET.parse(corpus / 'toc-01/hierarchy.xml').getroot().get('color') == '#336699' +created = ET.parse(corpus / 'create-05/page-000.xml').getroot() +assert texts(created) == ['Created in Rust: café 東京 🦀'] +assert created.find('one:Outline', ns).get('author') == 'Fixture Author' +assert texts(ET.parse(corpus / 'create-05/returned-page.xml').getroot()) == ['Rust edited it again, with a longer paragraph.'] +assert texts(ET.parse(corpus / 'create-notebook-01/page-000.xml').getroot()) == ['A notebook created in Rust.'] +assert len(ET.parse(corpus / 'create-notebook-01/hierarchy.xml').getroot().findall('one:Section', ns)) == 1 +print('Passed: native TOC color edit, template-free section and notebook creation, native save, and longer Rust replacement') + +append = root / 'corpus/append/round-01' +for item in json.loads((append / 'manifest.json').read_text())['files']: + data = (append / item['path']).read_bytes() + assert len(data) == item['bytes'] and hashlib.sha256(data).hexdigest() == item['sha256'] + +expected = { + 'tx-17': 'Transaction 17', 'tx-255': 'Transaction 255', + 'tx-256': 'Transaction 256', 'tx-511': 'Transaction 256', + 'prepared-old': 'Transaction 255', 'tx-65535': 'Fictitious plain text.', + 'tx-65536': 'Crossed the second counter byte.', + 'tx-131071': 'Crossed the second counter byte.', + 'tx-130816': 'Crossed the second counter byte.', + 'shared-result': 'Rust committed through the SMB mount.', + **{f'metadata-{i}': 'Transaction 255' for i in range(8)}, +} +for name, text in expected.items(): + captured = pages(append / 'native' / f'append-01-{name}' / 'read') + assert len(captured) == 1 and texts(captured[0]) == [text], name + +after = pages(append / 'native/append-01-complex/read')[0] +assert fingerprint(normalized(before)) == fingerprint(normalized(after)) +assert next((root / 'corpus/native-ink/cold-ui-ink/read').glob('*.attachment')).read_bytes() == next((append / 'native/append-01-complex/read').glob('*.attachment')).read_bytes() +assert ET.parse(append / 'native/append-01-toc/read/hierarchy.xml').getroot().get('color') == '#336699' +saved = subprocess.check_output(['cargo', 'run', '--quiet', '--example', 'inventory', '--', str(append / 'native-after-511.one')], cwd=root, text=True) +assert [bytes.fromhex(row.split('\t')[2]).decode('ascii') for row in saved.splitlines() if row.startswith('ascii\t')] == ['Native after interrupted cleanup.'] +print('Passed: append encoding, native metadata and counter recovery, post-recovery native save, and filesystem-backed SMB commit') diff --git a/tools/w7/README.md b/tools/w7/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4f9a2e887e6c307e0269d91d7f29e46a281ce4c5 --- /dev/null +++ b/tools/w7/README.md @@ -0,0 +1,144 @@ +# w7 — remote computer use on a Windows 7 box + +Drive `wayback` (Windows 7, Tailscale `100.104.74.68`) from a model by writing +AutoHotkey v2 scripts. Each call runs a script on the real desktop and comes +back with its stdout and a screenshot. + +Two halves: + +- `payload/` — copy the folder to the Win7 box and run `run.bat`. It starts an + HTTP listener on port 8777 that executes AHK and screenshots. See + [payload/README.txt](payload/README.txt). +- `mcp_win7.py` — stays on the Mac. An MCP server (stdio) for desktop control, + file transfer, commands, detached processes, and VM lifecycle. System python3, + stdlib only. + +## Wire up Codex + +Paste [codex-config-snippet.toml](codex-config-snippet.toml) into +`~/.codex/config.toml`, then restart Codex. `/mcp` should list `win7` and +`one-linux`. Their editable implementation and guest payload live in +`/Users/clo/dev/one/tools/w7`. + +## Smoke test + +```sh +./mcp_win7.py health # listener version info +./mcp_win7.py shot # -> ./screenshot.png +./mcp_win7.py exec 'Run("notepad.exe") +WinWait("Untitled - Notepad",, 10) +SendText("hello")' # prints stdout/exit, -> ./screenshot.png +./mcp_win7.py cmd 'ipconfig' # plain shell command, no screenshot +./mcp_win7.py spawn '"C:\tools\capture.exe" /output C:\trace.pml' +``` + +## Local QEMU VM + +`vm.py` runs the Windows 7 build VM on Apple silicon. VM state stays in +`/Volumes/Documents/OneNote VMs`; the Windows ISO is opened read-only. Override +the location with `ONE_VM_HOME` and `WIN7_TARGETS_FILE`. + +```sh +./vm.py install # create the disk and boot the Windows installer +./vm.py status win7-build +./vm.py screenshot +./vm.py poweroff # request a clean Windows shutdown +./vm.py run # boot the installed system +./vm.py media # rebuild win7-agent.iso from payload/ +./vm.py seal # validate and publish the stopped build disk +``` + +Normal boots attach `win7-agent.iso` as a read-only CD. Copy its contents to +`C:\win7-agent`, run `install-autostart.cmd` as administrator, restart, then +verify the forwarded listener: + +```sh +./mcp_win7.py --target local health +``` + +Do not put the build disk or licensed installation media in this repository. +Create the immutable base image only after Windows, Office, and the agent pass +their checks and the VM has shut down cleanly. + +## Test VMs + +Each clone is a sparse overlay on the read-only base. Its name derives a unique +Windows hostname (`alpha` becomes `ONE-ALPHA`), MAC address, forwarded control +port, authentication token, and MCP target. Two vCPUs and 4 GiB are the defaults. + +```sh +./vm.py up alpha --wait # creates when absent; waits through hostname restart +./vm.py up alpha --display # visible Cocoa window instead of headless +./mcp_win7.py --target alpha health +./vm.py screenshot alpha +./vm.py status # lists every clone +./vm.py down alpha # clean shutdown, then delete the clone +./vm.py down alpha --preserve-machine # keep a stopped clone for reproduction +``` + +The MCP server exposes `win7_vm_up`, `win7_vm_down`, and `win7_vm_status`. +`up` accepts creation settings and a `wait` flag; `down` deletes by default and +accepts `preserve_machine`. Use `win7_spawn` for a long-lived process such as +Procmon so it cannot inherit and hold the command channel. + +The control agent starts minimized after login. Its taskbar button remains +available for diagnosis without covering OneNote or changing screenshot-based +test coordinates. + +## Abrupt-stop recovery tests + +`python3 tools/w7/crash.py windows NAME` and `python3 tools/w7/crash.py linux NAME` +(from the repository root) stop a registered disposable QEMU process without +requesting guest shutdown. They verify its VM/socket identity and preserve its +disk and configuration. Restart with the corresponding `up NAME --wait`, and +finish with `down NAME` to delete the owned machine. The existing MCP lifecycle +continues to perform clean shutdowns. + +These stops discard guest memory while host storage remains powered. Pair them +with the library's persisted-image tests when evaluating crash recovery; neither +operation certifies a physical disk's behavior during host power loss. + +## Linux Samba VM + +`linux_vm.py` creates an SSH-only Debian 13 arm64 appliance from Debian's +official generic-cloud image. The downloaded base is SHA-512 verified and kept +under `/Volumes/Documents/OneNote VMs/linux`; instances are sparse copy-on-write +overlays. Cloud-init installs Samba, dnsmasq, CIFS tools, smbclient, and fio. + +```sh +./linux_vm.py fetch +./linux_vm.py up samba --wait +./linux_vm.py ssh samba -- 'systemctl is-active smbd dnsmasq' +./linux_vm.py status +./linux_vm.py down samba +``` + +While it runs, Windows VMs obtain an address on their second NIC and reach the +guest-writable share at `\\192.168.77.1\agent`. The Mac controls and inspects +the appliance over its forwarded SSH port. One appliance runs at a time because +that stable share address is the synchronization point for concurrent Windows +clients. A local VDE switch joins up to 63 guests without host privileges. The +`one-linux` MCP exposes fetch, up, SSH, down, and status; its `up` and `down` +follow the same auto-create, wait-flag, and preserve conventions as Windows. + +To restore a base from private object storage, upload the sealed qcow2 beside +its JSON manifest and pass the manifest URL. A presigned URL needs no secret; +otherwise set `ONE_VM_AUTHORIZATION` to the complete HTTP Authorization value. + +```sh +./vm.py fetch 'https://private.example/one/win7-office-base.json' +``` + +`install-autostart.cmd` disables UAC so the isolated test guest can rename +itself, start the control agent, and run Procmon without human prompts. QEMU +publishes each guest agent only on host loopback. Do not run that installer on +a physical or network-reachable Windows machine. + +## Gotchas + +- Keep Windows display scaling at 100%. Anything else and the screenshot + coordinates no longer match where clicks land. +- The listener must run in the interactive logged-in session — as a scheduled + task or service it gets session 0 and sees a black screen. +- The box is only reachable over Tailscale at `100.104.74.68`; power it on + first, `health` failing with "cannot reach" usually just means it is off. diff --git a/tools/w7/codex-config-snippet.toml b/tools/w7/codex-config-snippet.toml new file mode 100644 index 0000000000000000000000000000000000000000..6b76ea0a1ecb1eb26b855f275a276f90c79782f3 --- /dev/null +++ b/tools/w7/codex-config-snippet.toml @@ -0,0 +1,16 @@ +# Paste into ~/.codex/config.toml. +[mcp_servers.win7] +command = "python3" +args = ["/Users/clo/dev/one/tools/w7/mcp_win7.py"] +# Covers a contended multi-VM boot with wait enabled. +tool_timeout_sec = 915 + +[mcp_servers.win7.env] +WIN7 = "http://100.104.74.68:8777" # wayback over Tailscale +# WIN7_TOKEN = "..." # only if the listener was started with a token + +[mcp_servers.one-linux] +command = "python3" +args = ["/Users/clo/dev/one/tools/w7/mcp_linux.py"] +# A first boot downloads packages through cloud-init. +tool_timeout_sec = 915 diff --git a/tools/w7/crash.py b/tools/w7/crash.py new file mode 100644 index 0000000000000000000000000000000000000000..f3598bb87e6bac768cde115b302fa564cf30c850 --- /dev/null +++ b/tools/w7/crash.py @@ -0,0 +1,49 @@ +"""Abruptly stop a disposable lab VM while preserving its disk for recovery.""" +import argparse +import json +import os +import signal +import subprocess +import time + +import linux_vm +import vm + + +def stop(kind, name): + backend = {'windows': vm, 'linux': linux_vm}[kind] + backend.load_instance(name) + if not backend.running(name): + raise ValueError('Choose a running disposable VM.') + _, socket_path, pid_path, *_ = backend.runtime(name) + pid = int(pid_path.read_text()) + expected = ('OneNote Windows 7 ' if kind == 'windows' else 'OneNote Linux Samba ') + name + if backend.qmp(name, 'query-name').get('name') != expected: + raise ValueError('The VM identity differs from its registered name.') + command = subprocess.check_output(['ps', '-p', str(pid), '-o', 'command='], text=True) + if str(socket_path) not in command or 'qemu-system-' not in command: + raise ValueError('The registered process does not own this VM socket.') + started = time.time_ns() + os.kill(pid, signal.SIGKILL) + deadline = time.monotonic() + 15 + while time.monotonic() < deadline: + try: + os.waitpid(pid, os.WNOHANG) + except ChildProcessError: + pass + if not backend.running(name): + break + time.sleep(.1) + if backend.running(name): + raise TimeoutError('The VM process did not stop.') + return {'kind': kind, 'name': name, 'pid': pid, 'signal': 'SIGKILL', + 'started_ns': started, 'stopped_ns': time.time_ns(), + 'machine_preserved': backend.instance_path(name).exists()} + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('kind', choices=['windows', 'linux']) + parser.add_argument('name') + args = parser.parse_args() + print(json.dumps(stop(args.kind, args.name), indent=2)) diff --git a/tools/w7/lab_network.py b/tools/w7/lab_network.py new file mode 100644 index 0000000000000000000000000000000000000000..86abe18237a5611978c9c0917d1e2c7a5d3a2ab6 --- /dev/null +++ b/tools/w7/lab_network.py @@ -0,0 +1,37 @@ +import fcntl +import os +from pathlib import Path +import shutil +import subprocess +import time + + +def ensure_hub(vm_home): + root = vm_home / "run" / "lab" + socket_dir = root / "switch" + pidfile = root / "vde.pid" + root.mkdir(parents=True, exist_ok=True) + with (root / ".lock").open("a") as lock: + fcntl.flock(lock, fcntl.LOCK_EX) + try: + pid = int(pidfile.read_text()) + os.kill(pid, 0) + if (socket_dir / "ctl").exists(): + return socket_dir + except (FileNotFoundError, ProcessLookupError, ValueError): + pass + pidfile.unlink(missing_ok=True) + shutil.rmtree(socket_dir, ignore_errors=True) + executable = shutil.which("vde_switch") or "/opt/homebrew/bin/vde_switch" + if not Path(executable).is_file(): + raise SystemExit("Install the Homebrew vde package for the VM lab network") + subprocess.run([ + executable, "--daemon", "--nostdin", "--numports", "64", + "--sock", str(socket_dir), "--pidfile", str(pidfile), + "--dirmode", "0700", "--mode", "0600", + ], check=True) + for _ in range(50): + if pidfile.exists() and (socket_dir / "ctl").exists(): + return socket_dir + time.sleep(0.1) + raise SystemExit("The VM lab network did not start") diff --git a/tools/w7/linux_vm.py b/tools/w7/linux_vm.py new file mode 100755 index 0000000000000000000000000000000000000000..52a4ce984baa15dc7e248cc71c9178d4556d1cdc --- /dev/null +++ b/tools/w7/linux_vm.py @@ -0,0 +1,540 @@ +#!/usr/bin/env python3 + +import argparse +import base64 +import fcntl +import hashlib +import json +import os +from pathlib import Path +import re +import shlex +import shutil +import socket +import subprocess +import tempfile +import time +import urllib.parse +import urllib.request +import uuid + +from lab_network import ensure_hub + + +VM_HOME = Path(os.environ.get( + "ONE_VM_HOME", "/Volumes/Documents/OneNote VMs" +)).expanduser() +LINUX_HOME = VM_HOME / "linux" +IMAGES = LINUX_HOME / "images" +INSTANCES = LINUX_HOME / "instances" +RUN = LINUX_HOME / "run" +BASE = IMAGES / "debian-13-genericcloud-arm64.qcow2" +BASE_MANIFEST = IMAGES / "debian-13-genericcloud-arm64.json" +IMAGE_URL = os.environ.get( + "LINUX_VM_IMAGE_URL", + "https://cloud.debian.org/images/cloud/trixie/latest/" + "debian-13-genericcloud-arm64.qcow2", +) +FIRMWARE = Path(os.environ.get( + "LINUX_VM_FIRMWARE", "/opt/homebrew/share/qemu/edk2-aarch64-code.fd" +)) +LAB_ADDRESS = "192.168.77.1" +NAME = re.compile(r"[a-z0-9](?:[a-z0-9-]{0,22}[a-z0-9])?") + + +def require_vm_home(): + if len(VM_HOME.parts) > 2 and VM_HOME.parts[1] == "Volumes": + volume = Path("/Volumes") / VM_HOME.parts[2] + if not os.path.ismount(volume): + raise SystemExit("VM volume is not mounted: %s" % volume) + + +def executable(name): + path = shutil.which(name) or "/opt/homebrew/bin/" + name + if not Path(path).is_file(): + raise SystemExit("Missing executable: %s" % name) + return path + + +def atomic_json(path, value): + path.parent.mkdir(parents=True, exist_ok=True) + temporary = path.with_suffix(path.suffix + ".tmp") + temporary.write_text(json.dumps(value, indent=2, sort_keys=True) + "\n") + temporary.replace(path) + + +def runtime(name): + root = RUN / name + return root, root / "qmp.sock", root / "qemu.pid", root / "qemu.log" + + +def running(name): + try: + os.kill(int(runtime(name)[2].read_text()), 0) + return True + except (FileNotFoundError, ProcessLookupError, ValueError): + return False + + +def instance_path(name): + return INSTANCES / (name + ".json") + + +def validate_name(name): + if not NAME.fullmatch(name): + raise SystemExit("VM name must be 1-24 lowercase letters, digits, or hyphens") + + +def load_instance(name): + validate_name(name) + try: + return json.loads(instance_path(name).read_text()) + except FileNotFoundError: + raise SystemExit("Linux VM does not exist: %s" % name) + except (OSError, ValueError) as e: + raise SystemExit("Cannot read Linux VM %s: %s" % (name, e)) + + +def configs(): + if not INSTANCES.exists(): + return [] + return [(path.stem, json.loads(path.read_text())) + for path in sorted(INSTANCES.glob("*.json"))] + + +def available_port(field, start, end, requested=None): + used = {config[field] for _name, config in configs()} + candidates = [requested] if requested else range(start, end + 1) + for port in candidates: + if port is None or port < 1024 or port > 65535 or port in used: + continue + with socket.socket() as probe: + try: + probe.bind(("127.0.0.1", port)) + except OSError: + continue + return port + raise SystemExit("No unused %s is available" % field.replace("_", " ")) + + +def mac(prefix, name): + tail = uuid.uuid5(uuid.NAMESPACE_URL, prefix + name).bytes[-3:] + kind = 4 if prefix == "lab:" else 3 + return "52:54:%02x:%02x:%02x:%02x" % (kind, *tail) + + +def key_path(name): + return INSTANCES / (name + ".key") + + +def seed_path(name): + return INSTANCES / (name + "-seed.iso") + + +def overlay_path(name): + return INSTANCES / (name + ".qcow2") + + +def make_seed(path, hostname, public_key, wan_mac, lab_mac): + samba = """[global] +workgroup = WORKGROUP +server role = standalone server +map to guest = Bad User +server min protocol = SMB2_02 +interfaces = lo wan0 lab0 +bind interfaces only = yes + +[agent] +path = /srv/agent +read only = no +guest ok = yes +force user = agent +create mask = 0666 +directory mask = 0777 +""" + dnsmasq = """port=0 +interface=lab0 +bind-interfaces +dhcp-range=192.168.77.10,192.168.77.250,255.255.255.0,12h +dhcp-option=3 +dhcp-option=6 +""" + user_data = """#cloud-config +hostname: {hostname} +manage_etc_hosts: true +users: + - name: agent + gecos: OneNote test agent + groups: [sudo] + shell: /bin/bash + sudo: ALL=(ALL) NOPASSWD:ALL + lock_passwd: true + ssh_authorized_keys: + - {public_key} +ssh_pwauth: false +disable_root: true +package_update: true +packages: [samba, dnsmasq, cifs-utils, smbclient, fio] +write_files: + - path: /etc/samba/smb.conf + permissions: '0644' + encoding: b64 + content: {samba} + - path: /etc/dnsmasq.d/onenote-lab.conf + permissions: '0644' + encoding: b64 + content: {dnsmasq} +runcmd: + - [mkdir, -p, /srv/agent] + - [chown, agent:agent, /srv/agent] + - [systemctl, enable, --now, dnsmasq] + - [systemctl, enable, --now, smbd] +""".format( + hostname=hostname, + public_key=public_key, + samba=base64.b64encode(samba.encode()).decode(), + dnsmasq=base64.b64encode(dnsmasq.encode()).decode(), + ) + network = """version: 2 +ethernets: + wan0: + match: + macaddress: "{wan_mac}" + set-name: wan0 + dhcp4: true + lab0: + match: + macaddress: "{lab_mac}" + set-name: lab0 + addresses: [{lab_address}/24] +""".format(wan_mac=wan_mac, lab_mac=lab_mac, lab_address=LAB_ADDRESS) + path.parent.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory(prefix="one-linux-seed-") as temporary: + root = Path(temporary) + (root / "meta-data").write_text( + "instance-id: %s\nlocal-hostname: %s\n" % (hostname, hostname) + ) + (root / "user-data").write_text(user_data) + (root / "network-config").write_text(network) + subprocess.run([ + "hdiutil", "makehybrid", "-quiet", "-iso", "-joliet", + "-default-volume-name", "cidata", "-o", str(path), str(root), + ], check=True) + + +def fetch_base(): + require_vm_home() + if BASE.exists() and BASE_MANIFEST.exists(): + subprocess.run([executable("qemu-img"), "check", str(BASE)], check=True) + print(BASE_MANIFEST) + return + headers = {} + if os.environ.get("ONE_VM_AUTHORIZATION"): + headers["Authorization"] = os.environ["ONE_VM_AUTHORIZATION"] + expected = os.environ.get("LINUX_VM_SHA512", "").lower() + if not expected: + sums_url = urllib.parse.urljoin(IMAGE_URL, "SHA512SUMS") + with urllib.request.urlopen(urllib.request.Request(sums_url, headers=headers)) as response: + sums = response.read().decode() + filename = urllib.parse.urlparse(IMAGE_URL).path.rsplit("/", 1)[-1] + match = re.search(r"^([0-9a-f]{128})\s+\*?%s$" % re.escape(filename), + sums, re.MULTILINE) + if not match: + raise SystemExit("Image is absent from %s" % sums_url) + expected = match.group(1) + if not re.fullmatch(r"[0-9a-f]{128}", expected): + raise SystemExit("LINUX_VM_SHA512 must contain 128 hexadecimal characters") + IMAGES.mkdir(parents=True, exist_ok=True) + temporary = BASE.with_suffix(".download.qcow2") + digest = hashlib.sha512() + try: + with urllib.request.urlopen(urllib.request.Request(IMAGE_URL, headers=headers)) as response: + with temporary.open("wb") as output: + while chunk := response.read(8 * 1024 * 1024): + output.write(chunk) + digest.update(chunk) + if digest.hexdigest() != expected: + raise SystemExit("Downloaded Linux image failed SHA-512 verification") + subprocess.run([executable("qemu-img"), "check", str(temporary)], check=True) + temporary.replace(BASE) + BASE.chmod(0o444) + atomic_json(BASE_MANIFEST, {"file": BASE.name, "sha512": expected, + "url": IMAGE_URL}) + except Exception: + temporary.unlink(missing_ok=True) + raise + print(BASE_MANIFEST) + + +def create_instance(name, cpus=2, memory_mb=2048, disk_gb=16, + ssh_port=None, samba_port=None): + require_vm_home() + validate_name(name) + if not BASE.is_file() or not BASE_MANIFEST.is_file(): + raise SystemExit("No Linux base image. Run: ./linux_vm.py fetch") + if not 1 <= cpus <= 16: + raise SystemExit("CPU count must be between 1 and 16") + if not 512 <= memory_mb <= 65536: + raise SystemExit("Memory must be between 512 and 65536 MiB") + if not 8 <= disk_gb <= 1024: + raise SystemExit("Disk size must be between 8 and 1024 GiB") + LINUX_HOME.mkdir(parents=True, exist_ok=True) + with (LINUX_HOME / ".lock").open("a") as lock: + fcntl.flock(lock, fcntl.LOCK_EX) + if instance_path(name).exists(): + raise SystemExit("Linux VM already exists: %s" % name) + ssh_port = available_port("ssh_port", 22000, 22099, ssh_port) + samba_port = available_port("samba_port", 14450, 14549, samba_port) + hostname = "one-" + name + private = key_path(name) + public = private.with_suffix(".key.pub") + overlay = overlay_path(name) + seed = seed_path(name) + INSTANCES.mkdir(parents=True, exist_ok=True) + try: + subprocess.run(["ssh-keygen", "-q", "-t", "ed25519", "-N", "", + "-C", hostname, "-f", str(private)], check=True) + private.chmod(0o600) + subprocess.run([ + executable("qemu-img"), "create", "-f", "qcow2", "-F", "qcow2", + "-b", str(BASE), str(overlay), + ], check=True) + subprocess.run([executable("qemu-img"), "resize", str(overlay), + "%dG" % disk_gb], check=True) + wan = mac("wan:", name) + lab = mac("lab:", name) + make_seed(seed, hostname, public.read_text().strip(), wan, lab) + seed.chmod(0o600) + config = {"cpus": cpus, "disk_gb": disk_gb, "hostname": hostname, + "lab_address": LAB_ADDRESS, "lab_mac": lab, + "memory_mb": memory_mb, "samba_port": samba_port, + "ssh_port": ssh_port, "wan_mac": wan} + atomic_json(instance_path(name), config) + instance_path(name).chmod(0o600) + except Exception: + for path in (private, public, overlay, seed, instance_path(name)): + path.unlink(missing_ok=True) + raise + print(json.dumps(dict(config, name=name), sort_keys=True)) + + +def launch(name): + require_vm_home() + config = load_instance(name) + if running(name): + raise SystemExit("Linux VM is already running: %s" % name) + active = [other for other, _config in configs() if other != name and running(other)] + if active: + raise SystemExit("Only one Samba VM may use %s: %s" % + (LAB_ADDRESS, ", ".join(active))) + if not FIRMWARE.is_file(): + raise SystemExit("AArch64 UEFI firmware not found: %s" % FIRMWARE) + root, qmp_socket, pid, log_path = runtime(name) + root.mkdir(parents=True, exist_ok=True) + qmp_socket.unlink(missing_ok=True) + lab_socket = ensure_hub(VM_HOME) + command = [ + executable("qemu-system-aarch64"), + "-name", "OneNote Linux Samba " + name, + "-machine", "virt,accel=hvf", "-cpu", "host", + "-smp", str(config["cpus"]), "-m", str(config["memory_mb"]), + "-bios", str(FIRMWARE), + "-drive", "if=none,file=%s,format=qcow2,id=root" % overlay_path(name), + "-device", "virtio-blk-pci,drive=root", + "-device", "virtio-scsi-pci,id=scsi", + "-drive", "if=none,file=%s,format=raw,media=cdrom,readonly=on,id=seed" % seed_path(name), + "-device", "scsi-cd,drive=seed", + "-netdev", ("user,id=wan,hostfwd=tcp:127.0.0.1:%d-:22," + "hostfwd=tcp:127.0.0.1:%d-:445" % + (config["ssh_port"], config["samba_port"])), + "-device", "virtio-net-pci,netdev=wan,mac=%s" % config["wan_mac"], + "-netdev", "vde,id=lab,sock=%s" % lab_socket, + "-device", "virtio-net-pci,netdev=lab,mac=%s" % config["lab_mac"], + "-uuid", str(uuid.uuid5(uuid.NAMESPACE_URL, "onenote-linux:" + name)), + "-display", "none", "-serial", "stdio", "-monitor", "none", + "-qmp", "unix:%s,server=on,wait=off" % qmp_socket, + "-pidfile", str(pid), + ] + with log_path.open("ab") as log: + subprocess.Popen(command, stdin=subprocess.DEVNULL, stdout=log, stderr=log, + start_new_session=True) + for _ in range(50): + if running(name): + print("Linux VM opened: %s" % name) + return + time.sleep(0.1) + raise SystemExit("Linux VM did not open. Check: %s" % log_path) + + +def ssh_argv(name, command=None): + config = load_instance(name) + known = INSTANCES / (name + ".known_hosts") + argv = ["ssh", "-p", str(config["ssh_port"]), "-i", str(key_path(name)), + "-o", "BatchMode=yes", "-o", "IdentitiesOnly=yes", + "-o", "StrictHostKeyChecking=accept-new", + "-o", 'UserKnownHostsFile="%s"' % known, + "-o", "ConnectTimeout=5", "agent@127.0.0.1"] + if command is not None: + argv.append(command) + return argv + + +def run_ssh(name, command, timeout=60): + return subprocess.run(ssh_argv(name, command), capture_output=True, text=True, + timeout=timeout) + + +def wait_instance(name, timeout): + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + try: + if run_ssh(name, "true", timeout=8).returncode == 0: + break + except subprocess.TimeoutExpired: + pass + time.sleep(1) + else: + raise SystemExit("SSH did not become ready within %d seconds: %s" % (timeout, name)) + remaining = max(1, int(deadline - time.monotonic())) + try: + result = run_ssh( + name, + "sudo cloud-init status --wait && " + "command -v smbd dnsmasq mount.cifs smbclient fio >/dev/null && " + "systemctl is-active --quiet smbd dnsmasq", + timeout=remaining, + ) + except subprocess.TimeoutExpired: + raise SystemExit("Cloud-init did not finish within %d seconds: %s" % (timeout, name)) + if result.returncode: + raise SystemExit((result.stdout + result.stderr).strip() or + "Linux bootstrap validation failed: %s" % name) + config = load_instance(name) + print("Ready: %s ssh=127.0.0.1:%d smb=127.0.0.1:%d windows=//%s/agent" % + (name, config["ssh_port"], config["samba_port"], LAB_ADDRESS)) + + +def qmp(name, command): + with socket.socket(socket.AF_UNIX) as client: + client.settimeout(5) + client.connect(str(runtime(name)[1])) + stream = client.makefile("rwb", buffering=0) + stream.readline() + stream.write(b'{"execute":"qmp_capabilities"}\n') + while "return" not in json.loads(stream.readline()): + pass + stream.write((json.dumps({"execute": command}) + "\n").encode()) + while True: + response = json.loads(stream.readline()) + if "return" in response: + return response["return"] + if "error" in response: + raise SystemExit(response["error"]["desc"]) + + +def shutdown(name, timeout): + if not running(name): + raise SystemExit("Linux VM is not running: %s" % name) + try: + run_ssh(name, "sudo poweroff", timeout=10) + except (subprocess.TimeoutExpired, OSError): + qmp(name, "system_powerdown") + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + if not running(name): + print("Linux VM stopped: %s" % name) + return + time.sleep(1) + raise SystemExit("Linux VM did not stop within %d seconds: %s" % (timeout, name)) + + +def delete_instance(name): + require_vm_home() + load_instance(name) + if running(name): + raise SystemExit("Shut down Linux before deleting: %s" % name) + for path in (overlay_path(name), seed_path(name), key_path(name), + key_path(name).with_suffix(".key.pub"), + INSTANCES / (name + ".known_hosts"), instance_path(name)): + path.unlink(missing_ok=True) + shutil.rmtree(runtime(name)[0], ignore_errors=True) + print("Deleted Linux VM: %s" % name) + + +def list_instances(name=None): + if name: + load_instance(name) + print("running" if running(name) else "stopped") + return + rows = configs() + if not rows: + print("No Linux VMs.") + return + for vm_name, config in rows: + state = "running" if running(vm_name) else "stopped" + print("%-24s %-24s %-7s ssh:%d smb:%d" % + (vm_name, config["hostname"], state, config["ssh_port"], + config["samba_port"])) + + +def main(): + parser = argparse.ArgumentParser(description="Run SSH-only OneNote Linux Samba VMs") + commands = parser.add_subparsers(dest="command", required=True) + commands.add_parser("fetch") + status = commands.add_parser("status") + status.add_argument("name", nargs="?") + up = commands.add_parser("up") + up.add_argument("name") + up.add_argument("--cpus", type=int, default=2) + up.add_argument("--memory", type=int, default=2048, dest="memory_mb") + up.add_argument("--disk", type=int, default=16, dest="disk_gb") + up.add_argument("--ssh-port", type=int) + up.add_argument("--samba-port", type=int) + up.add_argument("--wait", action="store_true") + up.add_argument("--timeout", type=int, default=600) + ssh = commands.add_parser("ssh") + ssh.add_argument("name") + ssh.add_argument("remote_command", nargs=argparse.REMAINDER) + down = commands.add_parser("down") + down.add_argument("name") + down.add_argument("--timeout", type=int, default=60) + down.add_argument("--preserve-machine", action="store_true") + args = parser.parse_args() + if args.command == "fetch": + fetch_base() + elif args.command == "up": + if not instance_path(args.name).exists(): + create_instance(args.name, args.cpus, args.memory_mb, args.disk_gb, + args.ssh_port, args.samba_port) + if running(args.name): + print("Linux VM already running: %s" % args.name) + else: + launch(args.name) + if args.wait: + wait_instance(args.name, args.timeout) + elif args.command == "ssh": + command = args.remote_command + if command[:1] == ["--"]: + command = command[1:] + remote = command[0] if len(command) == 1 else shlex.join(command) + os.execvp("ssh", ssh_argv(args.name, remote if command else None)) + elif args.command == "down": + if not instance_path(args.name).exists(): + print("Linux VM absent: %s" % args.name) + else: + load_instance(args.name) + if running(args.name): + shutdown(args.name, args.timeout) + if args.preserve_machine: + print("Preserved Linux VM: %s" % args.name) + else: + delete_instance(args.name) + else: + if args.name and not instance_path(args.name).exists(): + print("absent") + else: + list_instances(args.name) + + +if __name__ == "__main__": + main() diff --git a/tools/w7/mcp_linux.py b/tools/w7/mcp_linux.py new file mode 100755 index 0000000000000000000000000000000000000000..3154a9811f3a6a5f3770d68ff8a8038a489715ed --- /dev/null +++ b/tools/w7/mcp_linux.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +"""MCP server for disposable SSH-only Linux Samba VMs.""" + +import json +from pathlib import Path +import subprocess +import sys + + +ROOT = Path(__file__).resolve().parent +VM = ROOT / "linux_vm.py" + + +TOOLS = [ + { + "name": "linux_vm_fetch", + "description": ( + "Download and SHA-512 verify the official Debian 13 arm64 cloud base. " + "The immutable image is stored outside the repository." + ), + "inputSchema": {"type": "object", "properties": {}}, + }, + { + "name": "linux_vm_up", + "description": ( + "Create a Linux clone when absent, then boot it headlessly. Creation settings " + "are ignored for an existing clone. Set wait to return after cloud-init and " + "Samba validation. One VM owns the shared lab address 192.168.77.1." + ), + "inputSchema": { + "type": "object", + "properties": {"name": {"type": "string", + "description": "Unique lowercase VM name."}, + "cpus": {"type": "integer", "default": 2, + "minimum": 1, "maximum": 16}, + "memory_mb": {"type": "integer", "default": 2048, + "minimum": 512, "maximum": 65536}, + "disk_gb": {"type": "integer", "default": 16, + "minimum": 8, "maximum": 1024}, + "ssh_port": {"type": "integer", "minimum": 1024, + "maximum": 65535}, + "samba_port": {"type": "integer", "minimum": 1024, + "maximum": 65535}, + "wait": {"type": "boolean", "default": False}, + "timeout": {"type": "integer", "default": 600, + "minimum": 1, "maximum": 900}}, + "required": ["name"], + }, + }, + { + "name": "linux_ssh", + "description": ( + "Run a shell command over the clone's private SSH key. Use /srv/agent for " + "the Samba share exported to Windows as //192.168.77.1/agent." + ), + "inputSchema": { + "type": "object", + "properties": {"name": {"type": "string"}, + "command": {"type": "string"}, + "timeout": {"type": "integer", "default": 120, + "minimum": 1, "maximum": 900}}, + "required": ["name", "command"], + }, + }, + { + "name": "linux_vm_down", + "description": ( + "Cleanly stop one VM and delete its overlay, key, and metadata. Set " + "preserve_machine to keep the stopped VM for reproduction or reuse." + ), + "inputSchema": { + "type": "object", + "properties": {"name": {"type": "string"}, + "timeout": {"type": "integer", "default": 60, + "minimum": 1, "maximum": 120}, + "preserve_machine": {"type": "boolean", "default": False}}, + "required": ["name"], + }, + }, + { + "name": "linux_vm_status", + "description": "List every Linux VM, or report whether one is absent, stopped, or running.", + "inputSchema": {"type": "object", "properties": {"name": {"type": "string"}}}, + }, +] + + +def run(argv, timeout=120): + process = subprocess.run([sys.executable, str(VM)] + argv, capture_output=True, + text=True, timeout=timeout) + output = (process.stdout + process.stderr).strip() + return [{"type": "text", "text": output or "ok"}], process.returncode != 0 + + +def call_tool(name, args): + if name == "linux_vm_fetch": + return run(["fetch"], 900) + if name == "linux_vm_up": + argv = ["up", args["name"]] + for key, option in (("cpus", "--cpus"), ("memory_mb", "--memory"), + ("disk_gb", "--disk"), ("ssh_port", "--ssh-port"), + ("samba_port", "--samba-port")): + if args.get(key) is not None: + argv += [option, str(args[key])] + timeout = args.get("timeout", 600) + if args.get("wait"): + argv += ["--wait", "--timeout", str(timeout)] + return run(argv, timeout + 15 if args.get("wait") else 120) + if name == "linux_ssh": + timeout = args.get("timeout", 120) + return run(["ssh", args["name"], "--", args["command"]], timeout) + if name == "linux_vm_down": + timeout = args.get("timeout", 60) + argv = ["down", args["name"], "--timeout", str(timeout)] + if args.get("preserve_machine"): + argv.append("--preserve-machine") + return run(argv, timeout + 15) + if name == "linux_vm_status": + return run(["status"] + ([args["name"]] if args.get("name") else [])) + return [{"type": "text", "text": "unknown tool: %s" % name}], True + + +def handle(method, params): + if method == "initialize": + return {"protocolVersion": "2025-06-18", "capabilities": {"tools": {}}, + "serverInfo": {"name": "one-linux", "version": "1.0.0"}} + if method == "ping": + return {} + if method == "tools/list": + return {"tools": TOOLS} + if method == "tools/call": + content, is_error = call_tool(params.get("name"), params.get("arguments") or {}) + result = {"content": content} + if is_error: + result["isError"] = True + return result + return None + + +def serve(): + for line in sys.stdin: + try: + message = json.loads(line) + if message.get("id") is None: + continue + result = handle(message.get("method"), message.get("params") or {}) + if result is None: + reply = {"jsonrpc": "2.0", "id": message["id"], + "error": {"code": -32601, "message": "unknown method"}} + else: + reply = {"jsonrpc": "2.0", "id": message["id"], "result": result} + except Exception as e: + reply = {"jsonrpc": "2.0", "id": None, + "error": {"code": -32603, "message": "%s: %s" % + (type(e).__name__, e)}} + print(json.dumps(reply), flush=True) + + +if __name__ == "__main__": + serve() diff --git a/tools/w7/mcp_win7.py b/tools/w7/mcp_win7.py new file mode 100755 index 0000000000000000000000000000000000000000..445941ad5682f1668763a1b49d5cf3904b39dcc4 --- /dev/null +++ b/tools/w7/mcp_win7.py @@ -0,0 +1,584 @@ +#!/usr/bin/env python3 +"""MCP server (stdio, newline-delimited JSON-RPC) and CLI for driving the +Windows 7 box `wayback` through its AutoHotkey exec listener.""" + +import base64 +import json +import os +from pathlib import Path +import socket +import subprocess +import sys +import urllib.error +import urllib.request + +WAYBACK_BASE = os.environ.get("WIN7", "http://100.104.74.68:8777").rstrip("/") +WAYBACK_TOKEN = os.environ.get("WIN7_TOKEN") +DEFAULT_TARGET = os.environ.get("WIN7_TARGET", "wayback") +TARGETS_PATH = Path(os.environ.get( + "WIN7_TARGETS_FILE", "/Volumes/Documents/OneNote VMs/targets.json" +)).expanduser() +VM = Path(__file__).with_name("vm.py") + + +class Win7Error(Exception): + pass + + +def resolve_target(name): + targets = { + "wayback": {"base": WAYBACK_BASE, "token": WAYBACK_TOKEN}, + "local": {"base": "http://127.0.0.1:18777"}, + } + if TARGETS_PATH.exists(): + try: + configured = json.loads(TARGETS_PATH.read_text()) + except (OSError, ValueError) as e: + raise Win7Error("Cannot read %s: %s" % (TARGETS_PATH, e)) + if not isinstance(configured, dict): + raise Win7Error("Windows targets must be a JSON object: %s" % TARGETS_PATH) + targets.update(configured) + name = name or DEFAULT_TARGET + target = targets.get(name) + if not isinstance(target, dict) or not target.get("base"): + raise Win7Error( + "Unknown Windows target %r. Choose: %s" + % (name, ", ".join(sorted(targets))) + ) + token = target.get("token") + if target.get("token_env"): + token = os.environ.get(target["token_env"]) + return name, target["base"].rstrip("/"), token + + +def request(path, payload, timeout_ms=15000, target=None): + """POST json to the listener (GET when payload is None). Raises Win7Error.""" + name, base, token = resolve_target(target) + headers = {"Content-Type": "application/json"} + if token: + headers["X-Win7-Token"] = token + body = None if payload is None else json.dumps(payload).encode("utf-8") + req = urllib.request.Request(base + path, data=body, headers=headers) + try: + # The box owns the deadline; give the socket slack so its own timeout + # wins and we get a real stdout/stderr back instead of a dead socket. + with urllib.request.urlopen(req, timeout=timeout_ms / 1000.0 + 15) as resp: + raw = resp.read() + except urllib.error.HTTPError as e: + raise Win7Error("%s %s: HTTP %d %s" % (path, base, e.code, e.reason)) + except (urllib.error.URLError, socket.timeout, OSError) as e: + reason = getattr(e, "reason", e) + raise Win7Error( + "Cannot reach %r at %s (%s). Start it and open the desktop agent." + % (name, base, reason) + ) + try: + return json.loads(raw.decode("utf-8")) + except ValueError: + raise Win7Error("%s returned non-JSON: %r" % (path, raw[:200])) + + +def do_health(target=None): + return request("/health", None, target=target) + + +def do_shot(target=None): + return request("/shot", {}, target=target) + + +def do_exec(script, shot_delay_ms=500, timeout_ms=60000, target=None): + return request( + "/exec", + {"script": script, "shot_delay_ms": shot_delay_ms, "timeout_ms": timeout_ms}, + timeout_ms, + target, + ) + + +def do_cmd(command, timeout_ms=60000, target=None): + return request( + "/cmd", {"command": command, "timeout_ms": timeout_ms}, timeout_ms, target + ) + + +def do_spawn(command, target=None): + return request("/spawn", {"command": command}, target=target) + + +def do_ui(target=None): + return request("/ui", {}, target=target) + + +# The base64 stays inside this process on both transfers: a tool that took file +# bytes as an argument would spend the whole file as context tokens. +def do_put(local, remote, target=None): + with open(local, "rb") as f: + blob = f.read() + resp = request("/put", {"path": remote, "b64": base64.b64encode(blob).decode("ascii")}, + 120000, target) + resp.setdefault("bytes", len(blob)) + return resp + + +def do_get(remote, local, target=None): + resp = request("/get", {"path": remote}, 120000, target) + if resp.get("b64"): + with open(local, "wb") as f: + f.write(base64.b64decode(resp["b64"])) + return {"bytes": resp.get("bytes"), "path": os.path.abspath(local), + "error": resp.get("error")} + + +# Raw string: this text is mostly about backslashes, and rendering it correctly +# matters more than keeping the source lines joined. +EXEC_DESCRIPTION = r"""Run an AutoHotkey v2 script on the Windows 7 desktop. +Returns whatever the script printed, plus a screenshot taken shot_delay_ms +after the script exits. + +Coordinates are screen-absolute and match the returned screenshot +pixel-for-pixel (CoordMode Screen is already set; do not change it). The only +way to send text back is FileAppend(text, "*") -- there is no implicit output. +Put a whole sequence of actions in one script; one call per click is slow and +blind. + +BACKSLASHES. AutoHotkey's escape character is the backtick, NOT the backslash, +so a backslash inside an AHK string is already literal. You are emitting this +script as a JSON string, so one literal backslash is written "\\" in the JSON +and arrives in the script as "\". Never write "\\\\" -- that is what makes an +app receive A:\\cute.png instead of A:\cute.png. Escape inside AHK with the +backtick instead: `n newline, `t tab, `" quote. + +LITERAL TEXT. Send() reads ^ + ! # { } as Ctrl/Shift/Alt/Win and key groups. +Use SendText() for anything literal -- paths, passwords, arbitrary content -- +and keep Send() for actual key combinations. + +CLEAN UP. When you finish a task, close the applications you opened (WinClose, +or the app's own quit path). Leaving windows stacked makes later screenshots +harder to read, and a forgotten modal swallows input from the next script. + +Click something, let the UI settle: + Click(512, 384) + Sleep(300) + +Type a literal path into the focused field: + SendText("A:\cute.png") + Send("{Enter}") + +Shortcut, then read the result out of the clipboard: + Send("^a^c") + ClipWait(1) + FileAppend(A_Clipboard, "*") + +Launch an app, wait for its window, and close it when done: + Run("mspaint.exe") + WinWait("Paint", , 10) + WinActivate() + WinClose("Paint") + +Raise timeout_ms when the script itself waits on the UI; raise shot_delay_ms +when an animation or app launch needs longer to settle before the screenshot.""" + +TARGET_PROPERTY = { + "type": "string", + "description": "Target name. Omit to use the configured default.", +} + +TOOLS = [ + { + "name": "win7_exec", + "description": EXEC_DESCRIPTION, + "inputSchema": { + "type": "object", + "properties": { + "target": TARGET_PROPERTY, + "script": {"type": "string", "description": "AutoHotkey v2 source."}, + "shot_delay_ms": { + "type": "integer", + "default": 500, + "description": "Wait this long after the script ends, then screenshot.", + }, + "timeout_ms": { + "type": "integer", + "default": 60000, + "description": "Kill the script after this long.", + }, + }, + "required": ["script"], + }, + }, + { + "name": "win7_cmd", + "description": ( + "Run a command through cmd.exe on the Windows 7 box and return its output. " + "No screenshot -- use it to inspect files, launch programs and check state " + "without spending a screenshot on it." + ), + "inputSchema": { + "type": "object", + "properties": { + "target": TARGET_PROPERTY, + "command": {"type": "string", "description": "Passed to cmd.exe /c."}, + "timeout_ms": {"type": "integer", "default": 60000}, + }, + "required": ["command"], + }, + }, + { + "name": "win7_spawn", + "description": ( + "Start a detached Windows process and return immediately. Its standard " + "handles are closed, so a long-lived GUI or capture process cannot wedge " + "the control channel." + ), + "inputSchema": { + "type": "object", + "properties": { + "target": TARGET_PROPERTY, + "command": {"type": "string", "description": "Windows command line."}, + }, + "required": ["command"], + }, + }, + { + "name": "win7_put", + "description": ( + "Copy a file from this Mac to the Windows 7 box. Give two paths; the bytes " + "never pass through the conversation, so file size costs nothing." + ), + "inputSchema": { + "type": "object", + "properties": { + "target": TARGET_PROPERTY, + "local": {"type": "string", "description": "Path on the Mac."}, + "remote": { + "type": "string", + "description": "Windows path, e.g. C:\\\\work\\\\a.one.", + }, + }, + "required": ["local", "remote"], + }, + }, + { + "name": "win7_get", + "description": "Copy a file from the Windows 7 box back to this Mac.", + "inputSchema": { + "type": "object", + "properties": { + "target": TARGET_PROPERTY, + "remote": {"type": "string", "description": "Windows path."}, + "local": {"type": "string", "description": "Path on the Mac."}, + }, + "required": ["remote", "local"], + }, + }, + { + "name": "win7_shot", + "description": "Screenshot the Windows 7 desktop without running anything.", + "inputSchema": {"type": "object", "properties": {"target": TARGET_PROPERTY}}, + }, + { + "name": "win7_ui", + "description": ( + "Dump the foreground window's control tree as text -- class name, window " + "text and client rect (l,t,w,h) for the window and each child control. " + "It reads real Win32 controls, so it is excellent for dialogs, menus and " + "standard controls, and near-useless for custom-drawn canvases like " + "OneNote's page surface -- reach for a screenshot there instead." + ), + "inputSchema": {"type": "object", "properties": {"target": TARGET_PROPERTY}}, + }, +] + +TOOLS += [ + { + "name": "win7_vm_up", + "description": ( + "Create a named Windows 7 clone when absent, then boot it. Creation settings " + "are ignored for an existing clone. Set wait to return only when its " + "authenticated desktop agent reports the expected hostname." + ), + "inputSchema": { + "type": "object", + "properties": { + "name": {"type": "string", + "description": "Unique 1-11 character lowercase VM name."}, + "hostname": {"type": "string", "description": "Optional Windows hostname."}, + "cpus": {"type": "integer", "default": 2, "minimum": 1, "maximum": 16}, + "memory_mb": {"type": "integer", "default": 4096, + "minimum": 1024, "maximum": 65536}, + "port": {"type": "integer", "minimum": 1024, "maximum": 65535}, + "display": {"type": "boolean", "default": False}, + "wait": {"type": "boolean", "default": False}, + "timeout": {"type": "integer", "default": 300, "minimum": 1, + "maximum": 900}, + }, + "required": ["name"], + }, + }, + { + "name": "win7_vm_down", + "description": ( + "Cleanly stop one clone and delete its overlay and metadata. Set " + "preserve_machine to keep the stopped clone for reproduction or reuse." + ), + "inputSchema": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "timeout": {"type": "integer", "default": 60, "minimum": 1, + "maximum": 110}, + "preserve_machine": {"type": "boolean", "default": False}, + }, + "required": ["name"], + }, + }, + { + "name": "win7_vm_status", + "description": "List every clone, or report whether one named clone is absent, stopped, or running.", + "inputSchema": { + "type": "object", + "properties": {"name": {"type": "string"}}, + }, + }, +] + + +def win_line(resp): + win = resp.get("win") + if not win or not (win.get("title") or win.get("class")): + return "" + tag = win.get("class") or "" + if win.get("dialog"): + tag = (tag + " dialog").strip() + return 'window: "%s" (%s)' % (win.get("title", ""), tag) + + +def shot_blocks(resp, text_prefix=""): + text = text_prefix + "screen: %sx%s" % (resp.get("w"), resp.get("h")) + wl = win_line(resp) + if wl: + text += "\n" + wl + blocks = [{"type": "text", "text": text}] + png = resp.get("png_b64") + if png: + blocks.append({"type": "image", "data": png, "mimeType": "image/png"}) + return blocks + + +def text_result(resp): + lines = ["exit=%s" % resp.get("exit")] + for key in ("stdout", "stderr", "error"): + val = resp.get(key) + if val: + lines.append("%s:\n%s" % (key, val)) + return "\n".join(lines) + + +def vm_tool(name, args): + verb = name.removeprefix("win7_vm_") + if verb == "status": + argv = ["status"] + ([args["name"]] if args.get("name") else []) + elif verb == "up": + argv = ["up", args["name"]] + for key, option in (("hostname", "--hostname"), ("cpus", "--cpus"), + ("memory_mb", "--memory"), ("port", "--port")): + if args.get(key) is not None: + argv += [option, str(args[key])] + if args.get("display"): + argv.append("--display") + if args.get("wait"): + argv += ["--wait", "--timeout", str(args.get("timeout", 300))] + elif verb == "down": + argv = ["down", args["name"], "--timeout", str(args.get("timeout", 60))] + if args.get("preserve_machine"): + argv.append("--preserve-machine") + process = subprocess.run( + [sys.executable, str(VM)] + argv, + capture_output=True, + text=True, + timeout=args.get("timeout", 300) + 15 if verb == "up" and args.get("wait") + else 120, + ) + output = (process.stdout + process.stderr).strip() + return [{"type": "text", "text": output or "ok"}], process.returncode != 0 + + +def call_tool(name, args): + if name.startswith("win7_vm_"): + return vm_tool(name, args) + target = args.get("target") + if name == "win7_shot": + return shot_blocks(do_shot(target)), False + if name == "win7_ui": + resp = do_ui(target) + wl = win_line(resp) + parts = [p for p in (wl, resp.get("controls"), resp.get("error") and + "error: %s" % resp["error"]) if p] + return [{"type": "text", "text": "\n".join(parts)}], False + if name == "win7_put": + resp = do_put(args["local"], args["remote"], target) + text = "wrote %s bytes to %s" % (resp.get("bytes"), resp.get("path")) + return [{"type": "text", "text": text}], False + if name == "win7_get": + resp = do_get(args["remote"], args["local"], target) + text = "read %s bytes to %s" % (resp.get("bytes"), resp.get("path")) + return [{"type": "text", "text": text}], False + if name == "win7_cmd": + command = args.get("command") + if not isinstance(command, str) or not command.strip(): + return [{"type": "text", "text": "command is required"}], True + resp = do_cmd(command, args.get("timeout_ms", 60000), target) + return [{"type": "text", "text": text_result(resp)}], False + if name == "win7_spawn": + command = args.get("command") + if not isinstance(command, str) or not command.strip(): + return [{"type": "text", "text": "command is required"}], True + resp = do_spawn(command, target) + return [{"type": "text", "text": "pid=%s" % resp.get("pid")}], False + if name == "win7_exec": + script = args.get("script") + if not isinstance(script, str) or not script.strip(): + return [{"type": "text", "text": "script is required"}], True + resp = do_exec( + script, + args.get("shot_delay_ms", 500), + args.get("timeout_ms", 60000), + target, + ) + return shot_blocks(resp, text_result(resp) + "\n"), False + raise Win7Error("unknown tool %r" % (name,)) + + +def handle(method, params): + if method == "initialize": + return { + "protocolVersion": "2025-06-18", + "capabilities": {"tools": {}}, + "serverInfo": {"name": "win7", "version": "1.0.0"}, + } + if method == "ping": + return {} + if method == "tools/list": + return {"tools": TOOLS} + if method == "tools/call": + try: + content, is_error = call_tool(params.get("name"), params.get("arguments") or {}) + except Win7Error as e: + content, is_error = [{"type": "text", "text": str(e)}], True + # No structuredContent key, ever: Codex drops content[] outright when it + # is present (openai/codex#10334), which silently discards the screenshot. + result = {"content": content, "_meta": {"codex/imageDetail": "original"}} + if is_error: + result["isError"] = True + return result + return None + + +def serve(): + out = sys.stdout + for line in sys.stdin: + line = line.strip() + if not line: + continue + try: + msg = json.loads(line) + except ValueError: + print("win7: dropping unparseable line: %r" % line[:200], file=sys.stderr) + continue + mid = msg.get("id") + if mid is None: + continue # notification: a reply would itself be a protocol error + try: + result = handle(msg.get("method"), msg.get("params") or {}) + except Exception as e: # a crash here would wedge the client forever + reply = { + "jsonrpc": "2.0", + "id": mid, + "error": {"code": -32603, "message": "%s: %s" % (type(e).__name__, e)}, + } + else: + if result is None: + reply = { + "jsonrpc": "2.0", + "id": mid, + "error": {"code": -32601, "message": "unknown method %r" % msg.get("method")}, + } + else: + reply = {"jsonrpc": "2.0", "id": mid, "result": result} + out.write(json.dumps(reply) + "\n") + out.flush() + + +SHOT_PATH = "screenshot.png" + + +def write_png(resp): + with open(SHOT_PATH, "wb") as f: + f.write(base64.b64decode(resp["png_b64"])) + print("%sx%s -> %s" % (resp.get("w"), resp.get("h"), SHOT_PATH)) + + +def cli(argv): + target = None + if argv[:1] == ["--target"]: + if len(argv) < 3: + raise Win7Error("usage: mcp_win7.py --target ") + target, argv = argv[1], argv[2:] + verb = argv[0] + if verb == "health": + print(json.dumps(do_health(target), indent=2)) + elif verb == "shot": + write_png(do_shot(target)) + elif verb == "ui": + resp = do_ui(target) + wl = win_line(resp) + if wl: + print(wl) + print(resp.get("controls") or "") + if resp.get("error"): + print("error: %s" % resp["error"], file=sys.stderr) + elif verb in ("put", "get"): + if len(argv) < 3: + raise Win7Error("usage: mcp_win7.py put | get ") + resp = (do_put(argv[1], argv[2], target) if verb == "put" + else do_get(argv[1], argv[2], target)) + print("%s bytes -> %s" % (resp.get("bytes"), resp.get("path"))) + elif verb in ("exec", "cmd", "spawn"): + if len(argv) < 2: + raise Win7Error("usage: mcp_win7.py %s ''" % verb) + if verb == "exec": + resp = do_exec(argv[1], target=target) + elif verb == "cmd": + resp = do_cmd(argv[1], target=target) + else: + resp = do_spawn(argv[1], target=target) + print("pid=%s" % resp.get("pid")) + return + for stream, text in ((sys.stdout, resp.get("stdout")), (sys.stderr, resp.get("stderr"))): + if text: + stream.write(text if text.endswith("\n") else text + "\n") + if resp.get("error"): + print("error: %s" % resp["error"], file=sys.stderr) + print("exit=%s" % resp.get("exit"), file=sys.stderr) + if verb == "exec": + write_png(resp) + else: + raise Win7Error( + "usage: mcp_win7.py [--target ] " + "health|shot|ui|exec |cmd |spawn |put " + "|get " + ) + + +if __name__ == "__main__": + if len(sys.argv) > 1: + try: + cli(sys.argv[1:]) + except Win7Error as e: + print("win7: %s" % e, file=sys.stderr) + sys.exit(1) + else: + try: + serve() + except KeyboardInterrupt: + pass diff --git a/tools/w7/payload/README.txt b/tools/w7/payload/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..ccbdaba1fc7b447e1f1fe83689a1408488028324 --- /dev/null +++ b/tools/w7/payload/README.txt @@ -0,0 +1,57 @@ +win7-agent -- remote computer-use listener for Windows 7 x64 +============================================================ + +WHAT IT DOES + Listens on port 8777 and executes AutoHotkey scripts and shell commands sent + by the controller, returning their output plus a screenshot of this desktop. + +SETUP + 1. Copy this whole folder anywhere on the machine, e.g. C:\win7-agent + (keep the vendor\ subfolder next to agent.py -- do not move pieces apart). + 2. Double-click run.bat. A console window opens and prints "listening ...". + 3. When Windows Firewall pops up, click "Allow access" so the controller can + reach port 8777. + +VM AUTOSTART + On the isolated QEMU build VM only, run install-autostart.cmd as administrator + and restart. It disables UAC, reads the clone hostname and token from its + instance CD, renames the guest on first boot, and starts this agent at login. + Do not use it on a physical or network-reachable Windows machine. + +IMPORTANT + - Must run in the interactive, logged-in desktop session (just double-click + it). Do NOT install it as a Windows service -- a service has no desktop and + AutoHotkey cannot move the mouse or type. + - The agent holds the display and the machine awake by itself while it runs, + so you do not need to change the power plan. Two things it CANNOT hold off, + which will silently break every screenshot and keystroke until someone logs + back in -- turn both off once: + * Screen saver: right-click desktop > Personalize > Screen Saver, set + "(None)", and clear "On resume, display logon screen". + * Lock: do not press Win+L, and if the machine is on a domain policy that + locks it, that policy has to go. + A locked session moves the desktop to Winlogon, where nothing this agent + does can reach. The monitor merely powering off is fine -- screenshots + still work with the screen dark. + - Set display scaling to 100%: Control Panel > Display > "Smaller - 100%", + then log out and back in. Any other scaling shifts screenshot pixels away + from click coordinates and every click lands in the wrong place. + - If python.exe fails complaining about api-ms-win-crt-runtime-l1-1-0.dll, + run vendor\vc_redist.x64.exe once, then start run.bat again. + - Leave the console window open; closing it stops the agent. A crash leaves + the window up (pause) so you can read the error. + - Everything is also written to agent.log beside agent.py: one timestamped + line per request, followed by the exact AutoHotkey script or cmd command + that ran, indented with "|". It appends forever and is never rotated, so + delete it yourself if it gets large. + +SHARE (needed for the OneNote work) + Map the NAS share to A: once, from a normal cmd window: + net use A: \\zenith\agent /user:agent agent /persistent:yes + If the hostname does not resolve, use \\10.0.0.1\agent instead. Check it + stuck with: net use + +TOKEN (optional) + To require a shared secret, put it in a file named token.txt beside run.bat + (single line). The controller must then send the same value. No file means + no authentication. diff --git a/tools/w7/payload/agent.py b/tools/w7/payload/agent.py new file mode 100644 index 0000000000000000000000000000000000000000..f829e28013e2ecdf797b9cba02818294921f8265 --- /dev/null +++ b/tools/w7/payload/agent.py @@ -0,0 +1,440 @@ +import base64 +import ctypes +import hashlib +import json +import os +import struct +import subprocess +import sys +import tempfile +import threading +import time +import zlib +from ctypes import wintypes +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler + +BASE = os.path.dirname(os.path.abspath(__file__)) +with open(__file__, 'rb') as source: + AGENT_SHA256 = hashlib.sha256(source.read()).hexdigest() +LOCK = threading.Lock() + +user32 = ctypes.windll.user32 +gdi32 = ctypes.windll.gdi32 + +SRCCOPY = 0x00CC0020 +CAPTUREBLT = 0x40000000 +BI_RGB = 0 +DIB_RGB_COLORS = 0 + +# restype must be set on x64: the default c_int return truncates a 64-bit HANDLE. +user32.GetDC.restype = wintypes.HDC +user32.GetDC.argtypes = [wintypes.HWND] +user32.ReleaseDC.restype = ctypes.c_int +user32.ReleaseDC.argtypes = [wintypes.HWND, wintypes.HDC] +user32.GetSystemMetrics.restype = ctypes.c_int +user32.GetSystemMetrics.argtypes = [ctypes.c_int] +gdi32.CreateCompatibleDC.restype = wintypes.HDC +gdi32.CreateCompatibleDC.argtypes = [wintypes.HDC] +gdi32.CreateCompatibleBitmap.restype = wintypes.HBITMAP +gdi32.CreateCompatibleBitmap.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int] +gdi32.SelectObject.restype = wintypes.HGDIOBJ +gdi32.SelectObject.argtypes = [wintypes.HDC, wintypes.HGDIOBJ] +gdi32.BitBlt.restype = wintypes.BOOL +gdi32.BitBlt.argtypes = [wintypes.HDC, ctypes.c_int, ctypes.c_int, ctypes.c_int, + ctypes.c_int, wintypes.HDC, ctypes.c_int, ctypes.c_int, + wintypes.DWORD] +gdi32.GetDIBits.restype = ctypes.c_int +gdi32.GetDIBits.argtypes = [wintypes.HDC, wintypes.HBITMAP, wintypes.UINT, + wintypes.UINT, ctypes.c_void_p, ctypes.c_void_p, + wintypes.UINT] +gdi32.DeleteObject.restype = wintypes.BOOL +gdi32.DeleteObject.argtypes = [wintypes.HGDIOBJ] +gdi32.DeleteDC.restype = wintypes.BOOL +gdi32.DeleteDC.argtypes = [wintypes.HDC] + +WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM) +user32.GetForegroundWindow.restype = wintypes.HWND +user32.GetForegroundWindow.argtypes = [] +user32.GetWindowTextW.restype = ctypes.c_int +user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClassNameW.restype = ctypes.c_int +user32.GetClassNameW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int] +user32.GetClientRect.restype = wintypes.BOOL +user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.RECT)] +user32.EnumChildWindows.restype = wintypes.BOOL +user32.EnumChildWindows.argtypes = [wintypes.HWND, WNDENUMPROC, wintypes.LPARAM] + + +class BITMAPINFOHEADER(ctypes.Structure): + _fields_ = [("biSize", wintypes.DWORD), + ("biWidth", wintypes.LONG), + ("biHeight", wintypes.LONG), + ("biPlanes", wintypes.WORD), + ("biBitCount", wintypes.WORD), + ("biCompression", wintypes.DWORD), + ("biSizeImage", wintypes.DWORD), + ("biXPelsPerMeter", wintypes.LONG), + ("biYPelsPerMeter", wintypes.LONG), + ("biClrUsed", wintypes.DWORD), + ("biClrImportant", wintypes.DWORD)] + + +PREAMBLE = ( + "#Requires AutoHotkey v2.0\n" + "#SingleInstance Off\n" + "#Warn All, Off\n" + 'FileEncoding "UTF-8-RAW"\n' + 'SendMode "Input"\n' + "SetWorkingDir A_ScriptDir\n" + 'CoordMode "Mouse", "Screen"\n' + 'CoordMode "Pixel", "Screen"\n' + 'CoordMode "ToolTip", "Screen"\n' + "SetTitleMatchMode 2\n" + "DetectHiddenWindows true\n" +) + + +def ahk_path(): + u64 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey64.exe") + u32 = os.path.join(BASE, "vendor", "ahk", "AutoHotkey32.exe") + return u64 if os.path.exists(u64) else u32 + + +def _chunk(tag, data): + return (struct.pack(">I", len(data)) + tag + data + + struct.pack(">I", zlib.crc32(tag + data) & 0xffffffff)) + + +def _to_png(bgra, w, h): + arr = bytearray(bgra) + r = arr[2::4] + arr[2::4] = arr[0::4] + arr[0::4] = r + del arr[3::4] + stride = w * 3 + mv = memoryview(arr) + raw = bytearray() + for y in range(h): + raw.append(0) + raw += mv[y * stride:(y + 1) * stride] + ihdr = struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0) + return (b"\x89PNG\r\n\x1a\n" + _chunk(b"IHDR", ihdr) + + _chunk(b"IDAT", zlib.compress(bytes(raw))) + _chunk(b"IEND", b"")) + + +def capture(): + w = user32.GetSystemMetrics(0) + h = user32.GetSystemMetrics(1) + hdc = user32.GetDC(None) + mem = None + hbm = None + try: + mem = gdi32.CreateCompatibleDC(hdc) + hbm = gdi32.CreateCompatibleBitmap(hdc, w, h) + old = gdi32.SelectObject(mem, hbm) + gdi32.BitBlt(mem, 0, 0, w, h, hdc, 0, 0, SRCCOPY | CAPTUREBLT) + gdi32.SelectObject(mem, old) + bmi = BITMAPINFOHEADER() + bmi.biSize = ctypes.sizeof(BITMAPINFOHEADER) + bmi.biWidth = w + bmi.biHeight = -h # negative => top-down rows, matches screenshot orientation + bmi.biPlanes = 1 + bmi.biBitCount = 32 + bmi.biCompression = BI_RGB + buf = ctypes.create_string_buffer(w * h * 4) + if gdi32.GetDIBits(mem, hbm, 0, h, buf, ctypes.byref(bmi), + DIB_RGB_COLORS) == 0: + raise RuntimeError("GetDIBits failed") + data = buf.raw + finally: + if hbm: + gdi32.DeleteObject(hbm) + if mem: + gdi32.DeleteDC(mem) + user32.ReleaseDC(None, hdc) + return _to_png(data, w, h), w, h + + +def _win_text(fn, hwnd, n=512): + buf = ctypes.create_unicode_buffer(n) + fn(hwnd, buf, n) + return buf.value + + +def active_window(): + hwnd = user32.GetForegroundWindow() + if not hwnd: + return {"title": "", "class": "", "dialog": False} + cls = _win_text(user32.GetClassNameW, hwnd) + return {"title": _win_text(user32.GetWindowTextW, hwnd), + "class": cls, "dialog": cls == "#32770"} + + +def control_tree(): + hwnd = user32.GetForegroundWindow() + rows = [] + + def add(h): + rect = wintypes.RECT() + user32.GetClientRect(h, ctypes.byref(rect)) + rows.append((_win_text(user32.GetClassNameW, h), + _win_text(user32.GetWindowTextW, h), + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top)) + + if hwnd: + add(hwnd) + + def cb(child, _lparam): + add(child) + return True + user32.EnumChildWindows(hwnd, WNDENUMPROC(cb), 0) + lines = ["%-24s %-28s %s" % ("class", "text", "l,t,w,h")] + for cls, text, l, t, w, h in rows: + lines.append("%-24s %-28s %d,%d,%d,%d" % (cls, text, l, t, w, h)) + return "\n".join(lines) + + +def _run(argv, timeout_ms, encoding, on_timeout=None): + def dec(b): + return b.decode(encoding, "replace") if b else "" + + p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out, err = p.communicate(timeout=timeout_ms / 1000.0) + return p.returncode, dec(out), dec(err), None + except subprocess.TimeoutExpired: + if on_timeout: + on_timeout() + subprocess.call(["taskkill", "/F", "/T", "/PID", str(p.pid)]) + try: + # A process the script launched can outlive taskkill still holding the + # inherited stdout pipe; an unbounded wait here wedges the agent's lock. + out, err = p.communicate(timeout=5) + except subprocess.TimeoutExpired: + out = err = b"" + for pipe in (p.stdout, p.stderr): + if pipe: + pipe.close() + msg = "timed out after %d ms, process killed" % timeout_ms + return None, dec(out), dec(err), msg + + +def run_ahk(script, timeout_ms, on_timeout=None): + fd, path = tempfile.mkstemp(suffix=".ahk") + os.close(fd) + # AutoHotkey (Unicode-only) needs a UTF-8 BOM to read the file as UTF-8. + with open(path, "wb") as f: + f.write(b"\xef\xbb\xbf" + (PREAMBLE + script).encode("utf-8")) + try: + # /ErrorStdOut sends syntax errors to stderr instead of a blocking modal. + code, out, err, error = _run([ahk_path(), "/ErrorStdOut", path], timeout_ms, + "utf-8", on_timeout) + finally: + os.remove(path) + if error: + error = "script " + error + return code, out, err, error + + +def _safe_capture(error): + try: + png, w, h = capture() + return base64.b64encode(png).decode("ascii"), w, h, error + except Exception as e: + note = "screenshot failed: " + repr(e) + return "", 0, 0, (error + "; " + note if error else note) + + +LOG_PATH = os.path.join(BASE, "agent.log") +LOG_LOCK = threading.Lock() + + +def log(text, stamp=True): + """Console and agent.log, so a session can be reconstructed after the fact.""" + line = time.strftime("%Y-%m-%d %H:%M:%S ") + text if stamp else text + with LOG_LOCK: + print(line, end="" if line.endswith("\n") else "\n", flush=True) + try: + with open(LOG_PATH, "a", encoding="utf-8") as f: + f.write(line if line.endswith("\n") else line + "\n") + except OSError: + pass # a log that cannot be written must not take the agent down + + +class Handler(BaseHTTPRequestHandler): + def log_message(self, *a): + pass + + def _send(self, code, obj): + body = json.dumps(obj).encode("utf-8") + self.send_response(code) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + def _log(self, start, code, body=None): + log("%s %s %dms exit=%s" % (self.command, self.path, + int((time.time() - start) * 1000), code)) + if body: + log("".join(" | %s\n" % l for l in body.splitlines()), stamp=False) + + def _auth_ok(self): + token = os.environ.get("WIN7_TOKEN") + return not token or self.headers.get("X-Win7-Token") == token + + def _body(self): + n = int(self.headers.get("Content-Length") or 0) + raw = self.rfile.read(n) if n else b"" + return json.loads(raw.decode("utf-8")) if raw else {} + + def do_GET(self): + start = time.time() + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + elif self.path == "/health": + self._send(200, {"ok": True, "w": user32.GetSystemMetrics(0), + "h": user32.GetSystemMetrics(1), + "hostname": os.environ.get("COMPUTERNAME", ""), + "utc_us": int(time.time() * 1000000), + "ahk": ahk_path(), "python": sys.executable, + "agent_sha256": AGENT_SHA256}) + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + + def do_POST(self): + start = time.time() + code = None + if not self._auth_ok(): + self._send(401, {"error": "bad token"}) + self._log(start, None) + return + try: + data = self._body() + except Exception: + self._send(400, {"error": "bad json"}) + self._log(start, None) + return + body = {"/exec": data.get("script"), "/cmd": data.get("command"), + "/spawn": data.get("command"), + "/put": data.get("path"), "/get": data.get("path")}.get(self.path) + try: + if self.path == "/exec": + resp = self._exec(data) + code = resp["exit"] + elif self.path == "/cmd": + resp = self._cmd(data) + code = resp["exit"] + elif self.path == "/spawn": + resp = self._spawn(data) + code = 0 + elif self.path == "/put": + resp = self._put(data) + elif self.path == "/get": + resp = self._get(data) + elif self.path == "/shot": + resp = self._shot() + elif self.path == "/ui": + resp = self._ui() + else: + self._send(404, {"error": "not found"}) + self._log(start, None) + return + self._send(200, resp) + except Exception as e: + self._send(200, {"error": repr(e), "exit": None, "stdout": "", + "stderr": "", "png_b64": "", "w": 0, "h": 0}) + self._log(start, code, body) + + def _exec(self, data): + pre = [] + + def grab(): # capture before taskkill so the blocker is still on screen + pre.append((_safe_capture(None), active_window())) + + with LOCK: + code, out, err, error = run_ahk(data.get("script", ""), + data.get("timeout_ms", 60000), grab) + if pre: + (b64, w, h, note), win = pre[0] + else: + time.sleep(data.get("shot_delay_ms", 500) / 1000.0) + b64, w, h, note = _safe_capture(None) + win = active_window() + if note: + error = error + "; " + note if error else note + return {"exit": code, "stdout": out, "stderr": err, "png_b64": b64, + "w": w, "h": h, "error": error, "win": win} + + def _put(self, data): + path = data.get("path", "") + blob = base64.b64decode(data.get("b64", "")) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + os.makedirs(parent) + with open(path, "wb") as f: + f.write(blob) + return {"bytes": len(blob), "path": os.path.abspath(path), "error": None} + + def _get(self, data): + with open(data.get("path", ""), "rb") as f: + blob = f.read() + return {"b64": base64.b64encode(blob).decode("ascii"), "bytes": len(blob), + "error": None} + + def _cmd(self, data): + with LOCK: + # A raw command-line string, not a list: on Windows list2cmdline would + # backslash-escape the embedded quotes before cmd.exe ever sees them. + code, out, err, error = _run("cmd.exe /c " + data.get("command", ""), + data.get("timeout_ms", 60000), "oem") + return {"exit": code, "stdout": out, "stderr": err, "error": error} + + def _spawn(self, data): + flags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.DETACHED_PROCESS + process = subprocess.Popen(data.get("command", ""), stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + close_fds=True, creationflags=flags) + return {"pid": process.pid, "error": None} + + def _shot(self): + b64, w, h, error = _safe_capture(None) + win = active_window() + return {"png_b64": b64, "w": w, "h": h, "error": error, "win": win} + + def _ui(self): + win = active_window() + controls = control_tree() + return {"win": win, "controls": controls, "error": None} + + +def keep_awake(): + """Hold the display and system awake for as long as this process lives. + + Screen blanking alone is harmless -- BitBlt still captures the composited + desktop -- but sleep kills the agent outright, and a locked session moves + the desktop to Winlogon where neither AutoHotkey nor the capture can reach. + """ + ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED = 0x80000000, 0x1, 0x2 + kernel32 = ctypes.windll.kernel32 + kernel32.SetThreadExecutionState.restype = wintypes.DWORD + kernel32.SetThreadExecutionState.argtypes = [wintypes.DWORD] + return kernel32.SetThreadExecutionState( + ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED) + + +def main(): + user32.SetProcessDPIAware() + awake = keep_awake() + port = int(os.environ.get("WIN7_PORT", "8777")) + srv = ThreadingHTTPServer(("0.0.0.0", port), Handler) + log("win7-agent listening on 0.0.0.0:%d ahk=%s log=%s%s" + % (port, ahk_path(), LOG_PATH, + "" if awake else " (WARNING: could not inhibit sleep)")) + srv.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/tools/w7/payload/bootstrap.cmd b/tools/w7/payload/bootstrap.cmd new file mode 100644 index 0000000000000000000000000000000000000000..987ef8d2f7b8071b767ad482e56f8509ae501ea2 --- /dev/null +++ b/tools/w7/payload/bootstrap.cmd @@ -0,0 +1,16 @@ +@echo off +setlocal EnableExtensions +set "ONEVM_HOSTNAME=" +for %%D in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist "%%D:\onenote-vm.ini" for /f "usebackq tokens=1,* delims==" %%A in ("%%D:\onenote-vm.ini") do ( + if /i "%%A"=="HOSTNAME" set "ONEVM_HOSTNAME=%%B" + if /i "%%A"=="TOKEN" set "WIN7_TOKEN=%%B" +) +if not defined ONEVM_HOSTNAME goto agent +if /i "%COMPUTERNAME%"=="%ONEVM_HOSTNAME%" goto agent +wmic computersystem where name="%COMPUTERNAME%" call rename name="%ONEVM_HOSTNAME%" >"%~dp0bootstrap.log" 2>&1 +find "ReturnValue = 0;" "%~dp0bootstrap.log" >nul || exit /b 1 +shutdown /r /t 0 +exit /b + +:agent +call "%~dp0run.bat" diff --git a/tools/w7/payload/install-autostart.cmd b/tools/w7/payload/install-autostart.cmd new file mode 100644 index 0000000000000000000000000000000000000000..a07e4f5a9c76151e79a465f09901996b1106d60a --- /dev/null +++ b/tools/w7/payload/install-autostart.cmd @@ -0,0 +1,4 @@ +@echo off +reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v EnableLUA /t REG_DWORD /d 0 /f || exit /b 1 +reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v OneNoteWin7Agent /t REG_SZ /d "cmd.exe /c C:\win7-agent\bootstrap.cmd" /f || exit /b 1 +echo Restart Windows to finish. diff --git a/tools/w7/payload/run.bat b/tools/w7/payload/run.bat new file mode 100644 index 0000000000000000000000000000000000000000..375bc458d694c80b26deae1615bbc0464bbb5477 --- /dev/null +++ b/tools/w7/payload/run.bat @@ -0,0 +1,4 @@ +@echo off +cd /d "%~dp0" +if not defined WIN7_TOKEN if exist "token.txt" set /p WIN7_TOKEN= 2 and VM_HOME.parts[1] == "Volumes": + volume = Path("/Volumes") / VM_HOME.parts[2] + if not os.path.ismount(volume): + raise SystemExit("VM volume is not mounted: %s" % volume) + + +def runtime(name): + root = RUN / name + return root, root / "qmp.sock", root / "qemu.pid", root / "qemu.log", root / "screen.png" + + +def running(name=BUILD): + try: + os.kill(int(runtime(name)[2].read_text()), 0) + return True + except (FileNotFoundError, ProcessLookupError, ValueError): + return False + + +def qmp(name, command, arguments=None): + qmp_socket = runtime(name)[1] + with socket.socket(socket.AF_UNIX) as client: + client.settimeout(5) + client.connect(str(qmp_socket)) + stream = client.makefile("rwb", buffering=0) + stream.readline() + stream.write(b'{"execute":"qmp_capabilities"}\n') + while "return" not in json.loads(stream.readline()): + pass + request = {"execute": command} + if arguments: + request["arguments"] = arguments + stream.write((json.dumps(request) + "\n").encode()) + while True: + response = json.loads(stream.readline()) + if "return" in response: + return response["return"] + if "error" in response: + raise SystemExit(response["error"]["desc"]) + + +def launch(name, disk, port, mac, cpus, memory_mb, display, drives): + require_vm_home() + if running(name): + raise SystemExit("Windows is already running: %s" % name) + root, qmp_socket, pid, log_path, _shot = runtime(name) + root.mkdir(parents=True, exist_ok=True) + qmp_socket.unlink(missing_ok=True) + lab_socket = ensure_hub(VM_HOME) + command = [ + qemu("qemu-system-x86_64"), + "-name", "OneNote Windows 7 " + name, + "-machine", "pc", + "-accel", "tcg,thread=multi", + "-cpu", "qemu64", + "-smp", str(cpus), + "-m", str(memory_mb), + "-drive", "file=%s,if=ide,format=qcow2,cache=writeback" % disk, + "-vga", "std", + "-display", display, + "-usb", + "-device", "usb-tablet", + "-netdev", "user,id=control,hostfwd=tcp:127.0.0.1:%d-:8777" % port, + "-device", "e1000,netdev=control,mac=%s" % mac, + "-netdev", "vde,id=lab,sock=%s" % lab_socket, + "-device", "e1000,netdev=lab,mac=%s" % lab_mac(name), + "-uuid", uuid_for(name), + "-rtc", "base=localtime,clock=host,driftfix=slew", + "-qmp", "unix:%s,server=on,wait=off" % qmp_socket, + "-pidfile", str(pid), + ] + for drive in drives: + command += ["-drive", drive] + with log_path.open("ab") as log: + subprocess.Popen( + command, + stdin=subprocess.DEVNULL, + stdout=log, + stderr=log, + start_new_session=True, + ) + for _ in range(50): + if running(name): + print("Windows opened: %s" % name) + return + time.sleep(0.1) + raise SystemExit("Windows did not open. Check: %s" % log_path) + + +def start_build(install): + if install and not ISO.is_file(): + raise SystemExit("Windows ISO not found: %s" % ISO) + if not DISK.exists(): + if not install: + raise SystemExit("No Windows disk found. Run: ./vm.py install") + IMAGES.mkdir(parents=True, exist_ok=True) + subprocess.run( + [qemu("qemu-img"), "create", "-f", "qcow2", str(DISK), "64G"], + check=True, + ) + drives = [] + if install: + drives.append("file=%s,file.locking=off,if=ide,media=cdrom,readonly=on" % ISO) + elif AGENT_ISO.exists(): + drives.append("file=%s,file.locking=off,if=ide,media=cdrom,readonly=on" % AGENT_ISO) + launch(BUILD, DISK, 18777, "52:54:00:10:77:01", 4, 4096, "cocoa", drives) + + +def instance_path(name): + return INSTANCES / (name + ".json") + + +def validate_name(name): + if not NAME.fullmatch(name): + raise SystemExit("VM name must be 1-11 lowercase letters, digits, or hyphens") + + +def load_instance(name): + validate_name(name) + try: + return json.loads(instance_path(name).read_text()) + except FileNotFoundError: + raise SystemExit("VM does not exist: %s" % name) + except (OSError, ValueError) as e: + raise SystemExit("Cannot read VM %s: %s" % (name, e)) + + +def atomic_json(path, value): + path.parent.mkdir(parents=True, exist_ok=True) + temporary = path.with_suffix(path.suffix + ".tmp") + temporary.write_text(json.dumps(value, indent=2, sort_keys=True) + "\n") + temporary.replace(path) + + +def configs(): + if not INSTANCES.exists(): + return [] + rows = [] + for path in sorted(INSTANCES.glob("*.json")): + try: + rows.append((path.stem, json.loads(path.read_text()))) + except (OSError, ValueError) as e: + raise SystemExit("Cannot read VM manifest %s: %s" % (path, e)) + return rows + + +def available_port(requested=None): + used = {18777} + used.update(config["port"] for _name, config in configs()) + candidates = [requested] if requested else range(18778, 18878) + for port in candidates: + if port is None or port < 1024 or port > 65535 or port in used: + continue + with socket.socket() as probe: + try: + probe.bind(("127.0.0.1", port)) + except OSError: + continue + return port + raise SystemExit("No unused control port is available") + + +def mac_for(port): + return "52:54:00:01:%02x:%02x" % (port >> 8, port & 0xff) + + +def uuid_for(name): + return str(uuid.uuid5(uuid.NAMESPACE_URL, "onenote-vm:" + name)) + + +def lab_mac(name): + tail = uuid.UUID(uuid_for(name)).bytes[-3:] + return "52:54:02:%02x:%02x:%02x" % tuple(tail) + + +def make_instance_iso(path, hostname, token): + path.parent.mkdir(parents=True, exist_ok=True) + with tempfile.TemporaryDirectory(prefix="one-vm-") as temporary: + root = Path(temporary) + (root / "onenote-vm.ini").write_text( + "HOSTNAME=%s\r\nTOKEN=%s\r\n" % (hostname, token) + ) + subprocess.run([ + "hdiutil", "makehybrid", "-quiet", "-iso", "-joliet", + "-default-volume-name", "ONEVM", "-o", str(path), str(root), + ], check=True) + + +def build_agent_iso(): + require_vm_home() + MEDIA.mkdir(parents=True, exist_ok=True) + temporary = AGENT_ISO.with_suffix(".tmp.iso") + temporary.unlink(missing_ok=True) + try: + subprocess.run([ + "hdiutil", "makehybrid", "-quiet", "-iso", "-joliet", + "-default-volume-name", "WIN7_AGENT", "-o", str(temporary), + str(Path(__file__).with_name("payload")), + ], check=True) + temporary.replace(AGENT_ISO) + except Exception: + temporary.unlink(missing_ok=True) + raise + print(AGENT_ISO) + + +def update_target(name, port=None, token=None): + try: + targets = json.loads(TARGETS.read_text()) + except FileNotFoundError: + targets = {} + except (OSError, ValueError) as e: + raise SystemExit("Cannot read %s: %s" % (TARGETS, e)) + if port is None: + targets.pop(name, None) + else: + targets[name] = {"base": "http://127.0.0.1:%d" % port, "token": token} + atomic_json(TARGETS, targets) + TARGETS.chmod(0o600) + + +def create_instance(name, hostname=None, cpus=2, memory_mb=4096, port=None): + require_vm_home() + validate_name(name) + if name in ("local", "wayback", BUILD): + raise SystemExit("VM name is reserved: %s" % name) + hostname = (hostname or ("ONE-" + name)).upper() + if not HOSTNAME.fullmatch(hostname): + raise SystemExit("Hostname must be 1-15 letters, digits, or hyphens") + if not 1 <= cpus <= 16: + raise SystemExit("CPU count must be between 1 and 16") + if not 1024 <= memory_mb <= 65536: + raise SystemExit("Memory must be between 1024 and 65536 MiB") + if not BASE_DISK.is_file() or not BASE_MANIFEST.is_file(): + raise SystemExit("No sealed base image. Finish the build, then run: ./vm.py seal") + VM_HOME.mkdir(parents=True, exist_ok=True) + with (VM_HOME / ".lock").open("a") as lock: + fcntl.flock(lock, fcntl.LOCK_EX) + if instance_path(name).exists(): + raise SystemExit("VM already exists: %s" % name) + if any(c.get("hostname", "").upper() == hostname.upper() for _n, c in configs()): + raise SystemExit("Hostname is already in use: %s" % hostname) + port = available_port(port) + token = secrets.token_urlsafe(24) + overlay = IMAGES / "instances" / (name + ".qcow2") + instance_iso = MEDIA / "instances" / (name + ".iso") + if overlay.exists() or instance_iso.exists(): + raise SystemExit("VM artifacts already exist without a manifest: %s" % name) + overlay.parent.mkdir(parents=True, exist_ok=True) + temporary = overlay.with_suffix(".tmp.qcow2") + try: + subprocess.run([ + qemu("qemu-img"), "create", "-f", "qcow2", "-F", "qcow2", + "-b", str(BASE_DISK), str(temporary), + ], check=True) + make_instance_iso(instance_iso, hostname, token) + instance_iso.chmod(0o600) + temporary.replace(overlay) + config = {"cpus": cpus, "hostname": hostname, "memory_mb": memory_mb, + "port": port, "token": token} + atomic_json(instance_path(name), config) + instance_path(name).chmod(0o600) + update_target(name, port, token) + except Exception: + temporary.unlink(missing_ok=True) + instance_iso.unlink(missing_ok=True) + overlay.unlink(missing_ok=True) + instance_path(name).unlink(missing_ok=True) + raise + print(json.dumps({"cpus": cpus, "hostname": hostname, "memory_mb": memory_mb, + "name": name, "port": port}, sort_keys=True)) + + +def start_instance(name, display=False): + config = load_instance(name) + overlay = IMAGES / "instances" / (name + ".qcow2") + instance_iso = MEDIA / "instances" / (name + ".iso") + if not overlay.is_file() or not instance_iso.is_file(): + raise SystemExit("VM artifacts are incomplete: %s" % name) + drives = [] + for drive in (AGENT_ISO, instance_iso): + if drive.is_file(): + drives.append("file=%s,file.locking=off,if=ide,media=cdrom,readonly=on" % drive) + launch(name, overlay, config["port"], mac_for(config["port"]), config["cpus"], + config["memory_mb"], "cocoa" if display else "none", drives) + + +def wait_instance(name, timeout): + config = load_instance(name) + deadline = time.monotonic() + timeout + request = urllib.request.Request( + "http://127.0.0.1:%d/health" % config["port"], + headers={"X-Win7-Token": config["token"]}, + ) + while time.monotonic() < deadline: + try: + with urllib.request.urlopen(request, timeout=2) as response: + health = json.load(response) + if health.get("hostname", "").upper() == config["hostname"]: + print("Ready: %s (%s)" % (name, config["hostname"])) + return + except (urllib.error.URLError, OSError, ValueError): + pass + time.sleep(1) + raise SystemExit("VM did not become ready within %d seconds: %s" % (timeout, name)) + + +def poweroff(name=BUILD): + if not running(name): + raise SystemExit("Windows is not running: %s" % name) + qmp(name, "system_powerdown") + print("Windows is shutting down: %s" % name) + + +def shutdown(name, timeout): + poweroff(name) + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + if not running(name): + print("Windows stopped: %s" % name) + return + time.sleep(1) + raise SystemExit("Windows did not stop within %d seconds: %s" % (timeout, name)) + + +def screenshot(name=BUILD): + if not running(name): + raise SystemExit("Windows is not running: %s" % name) + shot = runtime(name)[4] + qmp(name, "screendump", {"filename": str(shot), "format": "png"}) + print(shot) + + +def delete_instance(name): + require_vm_home() + with (VM_HOME / ".lock").open("a") as lock: + fcntl.flock(lock, fcntl.LOCK_EX) + load_instance(name) + if running(name): + raise SystemExit("Shut down Windows before deleting: %s" % name) + (IMAGES / "instances" / (name + ".qcow2")).unlink(missing_ok=True) + (MEDIA / "instances" / (name + ".iso")).unlink(missing_ok=True) + instance_path(name).unlink() + shutil.rmtree(runtime(name)[0], ignore_errors=True) + update_target(name) + print("Deleted VM: %s" % name) + + +def seal(): + require_vm_home() + if running(BUILD): + raise SystemExit("Shut down Windows before sealing the base image") + if not DISK.exists(): + raise SystemExit("No Windows build disk found") + temporary = BASE_DISK.with_suffix(".tmp.qcow2") + if BASE_DISK.exists() or temporary.exists(): + raise SystemExit("Move the existing base image before sealing another") + subprocess.run([qemu("qemu-img"), "check", str(DISK)], check=True) + subprocess.run([qemu("qemu-img"), "convert", "-p", "-O", "qcow2", + "-o", "lazy_refcounts=off", str(DISK), str(temporary)], check=True) + subprocess.run([qemu("qemu-img"), "check", str(temporary)], check=True) + temporary.replace(BASE_DISK) + digest = hashlib.sha256() + with BASE_DISK.open("rb") as image: + while chunk := image.read(8 * 1024 * 1024): + digest.update(chunk) + info = json.loads(subprocess.check_output([ + qemu("qemu-img"), "info", "--output=json", str(BASE_DISK), + ])) + atomic_json(BASE_MANIFEST, {"file": BASE_DISK.name, "format": info["format"], + "sha256": digest.hexdigest(), + "virtual_size": info["virtual-size"]}) + BASE_DISK.chmod(0o444) + print(BASE_MANIFEST) + + +def fetch_base(manifest_url): + require_vm_home() + if BASE_DISK.exists() or BASE_MANIFEST.exists(): + raise SystemExit("Move the existing base image before fetching another") + headers = {} + if os.environ.get("ONE_VM_AUTHORIZATION"): + headers["Authorization"] = os.environ["ONE_VM_AUTHORIZATION"] + with urllib.request.urlopen(urllib.request.Request(manifest_url, headers=headers)) as response: + manifest = json.load(response) + expected = manifest.get("sha256", "").lower() + if not re.fullmatch(r"[0-9a-f]{64}", expected): + raise SystemExit("Base manifest has no valid SHA-256") + image_url = urllib.parse.urljoin(manifest_url, manifest.get("file", "")) + IMAGES.mkdir(parents=True, exist_ok=True) + temporary = BASE_DISK.with_suffix(".download.qcow2") + digest = hashlib.sha256() + try: + with urllib.request.urlopen(urllib.request.Request(image_url, headers=headers)) as response: + with temporary.open("wb") as output: + while chunk := response.read(8 * 1024 * 1024): + output.write(chunk) + digest.update(chunk) + if digest.hexdigest() != expected: + temporary.unlink(missing_ok=True) + raise SystemExit("Downloaded base image failed SHA-256 verification") + subprocess.run([qemu("qemu-img"), "check", str(temporary)], check=True) + temporary.replace(BASE_DISK) + BASE_DISK.chmod(0o444) + atomic_json(BASE_MANIFEST, dict(manifest, file=BASE_DISK.name)) + except Exception: + temporary.unlink(missing_ok=True) + raise + print(BASE_MANIFEST) + + +def list_instances(): + rows = configs() + if not rows: + print("No Windows VMs.") + return + for name, config in rows: + state = "running" if running(name) else "stopped" + print("%-11s %-15s %-7s http://127.0.0.1:%d" % + (name, config["hostname"], state, config["port"])) + + +def main(): + parser = argparse.ArgumentParser(description="Run OneNote Windows 7 VMs") + commands = parser.add_subparsers(dest="command", required=True) + commands.add_parser("install") + commands.add_parser("run") + status = commands.add_parser("status") + status.add_argument("name", nargs="?") + power = commands.add_parser("poweroff") + power.add_argument("name", nargs="?", default=BUILD) + shot = commands.add_parser("screenshot") + shot.add_argument("name", nargs="?", default=BUILD) + commands.add_parser("seal") + commands.add_parser("media") + up = commands.add_parser("up") + up.add_argument("name") + up.add_argument("--hostname") + up.add_argument("--cpus", type=int, default=2) + up.add_argument("--memory", type=int, default=4096, dest="memory_mb") + up.add_argument("--port", type=int) + up.add_argument("--display", action="store_true") + up.add_argument("--wait", action="store_true") + up.add_argument("--timeout", type=int, default=300) + down = commands.add_parser("down") + down.add_argument("name") + down.add_argument("--timeout", type=int, default=60) + down.add_argument("--preserve-machine", action="store_true") + fetch = commands.add_parser("fetch") + fetch.add_argument("manifest_url") + args = parser.parse_args() + if args.command == "install": + start_build(True) + elif args.command == "run": + start_build(False) + elif args.command == "status": + if args.name: + if args.name == BUILD: + print("running" if running(args.name) else "stopped") + elif not instance_path(args.name).exists(): + print("absent") + else: + load_instance(args.name) + print("running" if running(args.name) else "stopped") + else: + list_instances() + elif args.command == "poweroff": + poweroff(args.name) + elif args.command == "screenshot": + screenshot(args.name) + elif args.command == "seal": + seal() + elif args.command == "media": + build_agent_iso() + elif args.command == "up": + if not instance_path(args.name).exists(): + create_instance(args.name, args.hostname, args.cpus, args.memory_mb, args.port) + if running(args.name): + print("Windows already running: %s" % args.name) + else: + start_instance(args.name, args.display) + if args.wait: + wait_instance(args.name, args.timeout) + elif args.command == "down": + if not instance_path(args.name).exists(): + print("VM absent: %s" % args.name) + else: + load_instance(args.name) + if running(args.name): + shutdown(args.name, args.timeout) + if args.preserve_machine: + print("Preserved VM: %s" % args.name) + else: + delete_instance(args.name) + else: + fetch_base(args.manifest_url) + + +if __name__ == "__main__": + main() diff --git a/tools/zenith-locks b/tools/zenith-locks new file mode 100755 index 0000000000000000000000000000000000000000..095817d79bc5bb93f0b901b9db7720ccc1ce2136 --- /dev/null +++ b/tools/zenith-locks @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +"""Watch SMB byte-range locks on zenith (TrueNAS) as OneNote takes and drops them.""" +import json +import os +import subprocess +import sys +import time + +HOST = "10.0.0.1" +SSH = ["ssh", "-o", "BatchMode=yes", "-o", "ControlMaster=auto", + "-o", "ControlPath=/tmp/zenith-locks-%r@%h:%p", "-o", "ControlPersist=30s", HOST] +SEP = "--%%--" + + +def agent_socket(): + """SSH_AUTH_SOCK is usually absent here; find a live agent that holds an identity.""" + pids = subprocess.run(["pgrep", "ssh-agent"], capture_output=True, text=True).stdout.split() + for pid in pids: + out = subprocess.run(["lsof", "-a", "-U", "-p", pid], capture_output=True, text=True).stdout + for word in out.split(): + if "/agent." not in word: + continue + env = dict(os.environ, SSH_AUTH_SOCK=word) + if subprocess.run(["ssh-add", "-l"], env=env, capture_output=True).returncode == 0: + return word + return None + + +def connect(): + if subprocess.run(SSH + ["true"], capture_output=True).returncode == 0: + return + sock = agent_socket() + if sock is None: + sys.exit("no ssh-agent with a loaded identity; cannot reach %s" % HOST) + os.environ["SSH_AUTH_SOCK"] = sock + if subprocess.run(SSH + ["true"], capture_output=True).returncode != 0: + sys.exit("ssh %s failed even with agent %s" % (HOST, sock)) + + +def status(*views): + cmd = (" ; echo %s ; " % SEP).join("midclt call smb.status " + v for v in views) + out = subprocess.run(SSH + [cmd], capture_output=True, text=True) + if out.returncode != 0: + sys.exit(out.stderr.strip() or "ssh failed") + return [json.loads(chunk) for chunk in out.stdout.split(SEP + "\n")] + + +def locks(byterange): + """(share_path, file, pid, type, start, size) per held range.""" + for entry in byterange: + for lk in entry["locks"]: + yield (entry["share_path"], entry["file_name"], lk["server_id"]["pid"], + lk["type"], lk["start"], lk["size"]) + + +def table(rows, headers): + rows = [[str(c) for c in r] for r in rows] + width = [max(len(h), *(len(r[i]) for r in rows)) for i, h in enumerate(headers)] + for r in [headers] + rows: + print(" ".join(c.ljust(w) for c, w in zip(r, width)).rstrip()) + + +def show_locks(): + byterange, openfiles, shares = status("BYTERANGE", "LOCKS", "SHARES") + held = sorted(locks(byterange)) + if not held: + print("no byte-range locks held") + return + machine = {s["server_id"]["pid"]: s["machine"] for s in shares} + user = {} + for f in openfiles: + for o in f["opens"].values(): + user[(f["service_path"], f["filename"], o["server_id"]["pid"])] = o["username"] + rows = [] + for share, name, pid, typ, start, size in held: + who = user.get((share, name, pid), "?") + rows.append(["%s/%s" % (os.path.basename(share), os.path.basename(name)), pid, who, + machine.get(pid, "?"), start, size, + {"W": "write", "R": "read"}.get(typ, typ)]) + table(rows, ["FILE", "PID", "USER", "CLIENT", "OFFSET", "LENGTH", "TYPE"]) + + +def show_opens(): + openfiles, shares = status("LOCKS", "SHARES") + machine = {s["server_id"]["pid"]: s["machine"] for s in shares} + rows = [] + for f in openfiles: + share = os.path.basename(f["service_path"]) + for o in f["opens"].values(): + pid = o["server_id"]["pid"] + rows.append(["%s/%s" % (share, f["filename"]), pid, o["username"], + machine.get(pid, "?"), o["access_mask"]["text"] or "-", + o["sharemode"]["text"] or "-", o["opened_at"][11:23]]) + if not rows: + print("no open files") + return + table(sorted(rows), ["FILE", "PID", "USER", "CLIENT", "ACCESS", "SHAREMODE", "OPENED"]) + + +def watch(interval): + prev = set() + while True: + now = set(locks(status("BYTERANGE")[0])) + t = time.time() + stamp = time.strftime("%H:%M:%S", time.localtime(t)) + ".%03d" % (t % 1 * 1000) + for sign, changed in (("-", prev - now), ("+", now - prev)): + for share, name, pid, typ, start, size in sorted(changed): + print("%s %s %s/%s pid=%s %s %d+%d" % + (stamp, sign, os.path.basename(share), os.path.basename(name), pid, + {"W": "write", "R": "read"}.get(typ, typ), start, size), flush=True) + prev = now + time.sleep(interval) + + +def main(): + args = sys.argv[1:] + connect() + if args and args[0] == "--watch": + watch(float(args[1]) if len(args) > 1 else 0.5) + elif args == ["--opens"]: + show_opens() + elif not args: + show_locks() + else: + sys.exit("usage: zenith-locks [--watch [SECONDS] | --opens]") + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + pass