diff --git a/README.md b/README.md index 396c0d228..c0a4e4c48 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,16 @@ Only a subset of assets can be read from disk however, depending on the game. Additionally, there are a couple of libraries and tools. A full list of the subcomponents can be found [here](./docs/OatComponents.md). -## Getting started +## Using the tools + +Either download [the latest release from Github](https://github.com/Laupetin/OpenAssetTools/releases/latest) or [build OAT yourself](#building-oat). +You can put OAT anywhere, it does **not** need to be placed in your game folder. +In fact i recommend against it to be able to better distinguish OAT files from game files. + +For more information, check out the ["Getting started" guide in the OAT documentation](https://openassettools.dev/guide/getting-started.html). +You can find other useful guides and reference documentation there as well. + +## Building OAT You need to clone this repository using Git. Do not download as a zip from Github because it will not be a git repository which is required for installing the submodules. @@ -68,10 +77,6 @@ You now run `make` manually or use `./scripts/make_release.sh` or `./scripts/mak The resulting binaries can be found in `build/bin/`. -## Using the tools - -For information about how to use the tools see the ["Getting started" guide](docs/GettingStarted.md) - ## Legal OAT source code is licensed under [GPLv3](./LICENSE). diff --git a/docs/FolderStructure.md b/docs/FolderStructure.md deleted file mode 100644 index d59b53fc0..000000000 --- a/docs/FolderStructure.md +++ /dev/null @@ -1,57 +0,0 @@ -# Folder structure - -This document is supposed to describe how i plan to handle the folder structure of the final modding tools. -The result should be oriented at the original game's modding tools. - -``` -├───bin -├───deffiles -├───raw -├───source_data -├───zone_dump -│ ├───source_data -│ ├───zone_raw -│ └───zone_source -├───zone_out -├───zone_raw -└───zone_source -``` - -## bin - -Folder containing binaries for modding tools like Unlinker.exe, Linker.exe and any other. - -## deffiles - -Folder containing files (gdf) defining interface and properties of an asset managing tool. - -## raw - -Folder containing global raw assets that can be used while building any zone. - -## source_data - -Folder containing gdts containing asset data. -Gdts can be referenced inside a zone definition file to be used inside a zone. - -## zone_dump - -Contains all data dumped using Unlinker which includes raw assets in ``zone_raw``, zone definitions in ``zone_source`` and gdts in ``source_data``. - -Separating the data of dumped files serves the purpose of separating it from manually created zones and prevents accidentally overwriting self created data. - -## zone_out - -The folder that contains the output of the linking process. - -## zone_raw - -Contains raw assets that should only be used for a zone with the same name as its subfolder. -Any contents must be inside appropriately named subfolders. -So assets for a zone called ``my_mod`` must be in ``zone_raw/my_mod``. - -## zone_source - -A folder containing all zone definition files. -Any definition file must have the name of the zone it describes. -So if you want to create a zone with the name ``my_mod`` you need to describe it inside a zone definition with the path ``zone_source/my_mod.zone``. \ No newline at end of file diff --git a/docs/GettingStarted.md b/docs/GettingStarted.md deleted file mode 100644 index 632ba5213..000000000 --- a/docs/GettingStarted.md +++ /dev/null @@ -1,43 +0,0 @@ -# Getting started - -## Unlinking a fastfile - -A good starting point is dumping an existing zone from your game installation to get a glance at how the raw asset data is structured. -The `Unlinker` tool will create a dump of a fastfile that can be linked again in the same form with the `Linker` tool. - -The `Unlinker` tool can be used the following: -```shell -# Load the original zone from the game folder. -# Change this if you have installed your game somewhere else -GAME_FOLDER='C:/Program Files (x86)/Steam/steamapps/common/Call of Duty Modern Warfare 3' - -# Verbose mode logs more details which can be useful to find errors -ARGS='--verbose' - -# Specify the search-path to include the main folder to automatically load its IWD files for image dumping. -# For T6 also specify sounds;zone/all;zone/english to load appropriate IPAKs and sound banks. -# You can skip specifying the search path but it will not dump images then. -ARGS="$ARGS --search-path \"$GAME_FOLDER/main;$GAME_FOLDER/zone/english\"" - -ZONE_TO_UNLINK="$GAME_FOLDER/zone/english/ui.ff" - -Unlinker $ARGS "$ZONE_TO_UNLINK" -``` - -The variables are only to better demonstrate the different parameters. -You can also of course combine them: - -```shell -Unlinker --verbose "C:/Program Files (x86)/Steam/steamapps/common/Call of Duty Modern Warfare 3/zone/english/ui.ff" -``` - -When using Windows you can also drag and drop a fastfile onto `Unlinker` which will run the unlinking tool with just the fastfile path and no additional parameters. - -After `Unlinker` ran successfully, you will have a `zone_dump` folder in your working directory. -It contains another folder `zone_raw` which contains the definitions for the unlinked fastfiles. -You can move the project definitions one level up in the folder structure to be able to use them with the `Linker` tool. -That means `zone_dump/zone_raw/ui` becomes `zone_raw/ui` - -## Extending a vanilla fastfile - -For an example of extending a fastfile, see [the example "ExtendZone"](example/ExtendZone). diff --git a/docs/OatComponents.md b/docs/OatComponents.md deleted file mode 100644 index f0bba907c..000000000 --- a/docs/OatComponents.md +++ /dev/null @@ -1,114 +0,0 @@ -# OAT Components - -The OpenAssetTools project consists of a handful of components. - -## Tools - -### Linker - -The **Linker** tool allows building custom fastfiles (.ff) for the supported games. -It can also load existing zones and reuse their assets from in-memory. -Only a subset of assets can be read from disk however, depending on the game. - -This tool has a CLI. -For a list of all args, run `Linker --help`. - -### Unlinker - -The **Unlinker** tool allows loading any fastfile (.ff) of supported games and works standalone. -While being able to load any asset it can currently only dump a subset of these assets to disk, depending on the game. -The formats of the dumped assets are either as close as possible to the originally used formats for these games or a commonly used format. - -This tool can be used either by drag-and-dropping and fastfile onto it or using its CLI. -For a list of all args, run `Unlinker --help`. - -To be able to extract images from IWDs you need to add their containing folder to the search path. -For example: `./Unlinker.exe -v --search-path "C:/Cod/IW4x/main" "C:/Cod/IW4x/zone/english/common_mp.ff"` - -## Building tools - -These are tools that are part of the building process of OAT. -They are compiled first and then being run in the later stages of compiling the project. - -### RawTemplater - -The RawTemplater allows generating files based on a template with a c precompiler like language. -The template allows the definition of variants in the form of properties that can be either true/false or have a range of values. -For each resulting cartesian product of these properties a file is generated unless skipped. - -This is used for generating raw files for the shader pipeline. -An example of a template files can be found [here (particle_cloud.techset.template)](../raw/iw4/techsets/particle_cloud.techset.template). - -### ZoneCodeGenerator - -The ZoneCodeGenerator generates code for loading and writing asset structs from and to fastfiles. -It is very apparent that the original developers must have used a very similar technique of code generation therefore this aims -to replicate what they might have done. -Since nothing about this code generation is known however this implementation is entirely custom and results in code that fits into -the code base of OAT only. - -The tool takes in a C header file and a commands file. -The c header files is parsed for structs and unions to base the code on. -The commands file describes further information necessary for code generation that is not possible to know just from the structs. - -The parsing of the c header file and the commands file is implemented using the Parser component. -The format of the commands file is entirely custom to OAT. - -An example of a commands file can be found [here (IW4_Commands.txt)](../src/ZoneCode/Game/IW4/IW4_Commands.txt) - -## Shared components - -These components split up code for reuse over the different tools. - -### Common - -This component contains code that is shared between other Obj based and Zone based components. - -### Crypto - -This component contains wrappers around used crypto and hashing third party libraries. - -### ObjCommon - -This component contains code that is used for both loading and writing asset data from and to disk. - -### ObjLoading - -This component contains code that is used for loading asset data from disk. - -### ObjWriting - -This component contains code that is used for writing asset data to disk. - -### Parser - -This component offers a custom Parser and Lexer implementation for parsing text based languages. -It also includes commonly used patterns and preprocessors for Parsers in the project. - -Arguably there shouldn't be a custom parser implementation for this, but instead a more accepted dependency like ANTLR. -However, I wanted to write my own implementations for science so here we are. - -### Utils - -This component contains various utility code that is used in other tools or components. - -### ZoneCode - -This component contains files necessary for generating code used for loading/writing from/to fastfiles. - -### ZoneCodeGeneratorLib - -This component contains most of the code of ZoneCodeGenerator other than the CLI. -Can be used as a static lib. - -### ZoneCommon - -This component bundles code for both loading and writing from/to fastfiles. - -### ZoneLoading - -This component handles loading data from fastfiles. - -### ZoneWriting - -This component handles writing data to fastfiles. \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..090c323c3 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,7 @@ +# Documentation + +You can find the main documentation for OAT here: [https://openassettools.dev](https://openassettools.dev/). +It brings everything you need for getting started as well as other guides and reference. + +In case you want to contribute to documentation you can find its source [here](https://github.com/Laupetin/oat-docs). +All that remains in this project for now are example projects. diff --git a/docs/ZoneFiles.md b/docs/ZoneFiles.md deleted file mode 100644 index b6b9cb293..000000000 --- a/docs/ZoneFiles.md +++ /dev/null @@ -1,326 +0,0 @@ -# Zone Files - -`.zone` files define a "project" to be linked with OAT. -Their format is inspired by the zone files that BO3 mod tools use, their usage is differing a bit however. - -They are text-based and contain a comma-separated key-based notation. -They may include line and block comments and are preprocessed using a C like processor before being parsed. - -Its content can either be an entry or metadata. -Metadata has its line begin with the `>` character followed by the metadata-key, a comma `,` and the metadata-value. -An entry follows the same schema just without the `>` prefix. - -For example: -``` -// This is a line comment -/* - This is a block comment -*/ - -// The following is metadata ->game,IW4 ->name,common_mp ->level.ipak_read,base - -// The following are entries -include,common_mp_menus -ignore,code_post_gfx_mp -material,main_splash - -// These are preprocessor directives -#define ADD_TECHSETS 1 -#ifdef ADD_TECHSETS -techset,custom_techset -#endif -``` - -## Metadata - -### `game` Metadata - -The `game` metadata sets the game the project is for. -This metadata **must** be specified for a project to be linked. - -The following values can be used to specify the game. -| Value | Game | -| ----- | ------------------------------ | -| IW3 | Call Of Duty: Modern Warfare | -| IW4 | Call Of Duty: Modern Warfare 2 | -| IW5 | Call Of Duty: Modern Warfare 3 | -| T5 | Call Of Duty: Black Ops | -| T6 | Call Of Duty: Black Ops 2 | - -### `name` Metadata - -The `name` sets the name of the project linking result. -In case of a fastfile the resulting file will be called `.ff`. -If the fastfile uses encryption, or is signed it will consider the new name. - -If not specified the name will be the same as the project name. - -### `gdt` Metadata - -The `gdt` metadata specifies a GDT file to be loaded by the Linker. - -## Entries - -With a few exceptions, entries are used to define an asset to be added. -The available assets differ per game. - -### The `include` entry - -The `include` entry will not add an asset. -Instead it will make the Linker read another `.zone` file and include all of its added assets, metadata and other includes in the project. - -For example `include,common_mp_menus` will look for a `common_mp_menus.zone` file in all source search paths and will include its content. -Linking will abort if the file could not be found. - -### The `ignore` entry - -The `ignore` entry will not add an asset. -Instead it will try to read an assetlist of the specified value. -All assets in the asset list will be converted to a reference in case they get added to the project. -This makes it possible to not add assets again that were already included in another zone but instead of referenced. - -For example `ignore,code_post_gfx_mp` will make all assets of `code_post_gfx_mp` be converted to references when they are added instead of the assets themselves being added. - -### Other entries - -Other entries are treated as assets to be added. -The available assets differ per game. - -#### IW3: Call Of Duty: Modern Warfare - -- `xmodelpieces` -- `physpreset` -- `xanim` -- `xmodel` -- `material` -- `techniqueset` -- `image` -- `sound` -- `soundcurve` -- `loadedsound` -- `clipmap` -- `comworld` -- `gameworldsp` -- `gameworldmp` -- `mapents` -- `gfxworld` -- `lightdef` -- `uimap` -- `font` -- `menulist` -- `menu` -- `localize` -- `weapon` -- `snddriverglobals` -- `fx` -- `impactfx` -- `aitype` -- `mptype` -- `character` -- `xmodelalias` -- `rawfile` -- `stringtable` - -#### IW4: Call Of Duty: Modern Warfare 2 - -- `physpreset` -- `physcollmap` -- `xanim` -- `xmodelsurfs` -- `xmodel` -- `material` -- `pixelshader` -- `vertexshader` -- `vertexdecl` -- `techniqueset` -- `image` -- `sound` -- `soundcurve` -- `loadedsound` -- `clipmap` -- `comworld` -- `gameworldsp` -- `gameworldmp` -- `mapents` -- `fxworld` -- `gfxworld` -- `lightdef` -- `uimap` -- `font` -- `menulist` -- `menu` -- `localize` -- `weapon` -- `snddriverglobals` -- `fx` -- `impactfx` -- `aitype` -- `mptype` -- `character` -- `xmodelalias` -- `rawfile` -- `stringtable` -- `leaderboard` -- `structureddatadef` -- `tracer` -- `vehicle` -- `addonmapents` - -#### IW5: Call Of Duty: Modern Warfare 3 - -- `physpreset` -- `physcollmap` -- `xanim` -- `xmodelsurfs` -- `xmodel` -- `material` -- `pixelshader` -- `vertexshader` -- `vertexdecl` -- `techniqueset` -- `image` -- `sound` -- `soundcurve` -- `loadedsound` -- `clipmap` -- `comworld` -- `glassworld` -- `pathdata` -- `vehicletrack` -- `mapents` -- `fxworld` -- `gfxworld` -- `lightdef` -- `uimap` -- `font` -- `menulist` -- `menu` -- `localize` -- `attachment` -- `weapon` -- `snddriverglobals` -- `fx` -- `impactfx` -- `surfacefx` -- `aitype` -- `mptype` -- `character` -- `xmodelalias` -- `rawfile` -- `scriptfile` -- `stringtable` -- `leaderboard` -- `structureddatadef` -- `tracer` -- `vehicle` -- `addonmapents` - -#### T5: Call Of Duty: Black Ops - -- `xmodelpieces` -- `physpreset` -- `physconstraints` -- `destructibledef` -- `xanim` -- `xmodel` -- `material` -- `techniqueset` -- `image` -- `soundbank` -- `soundpatch` -- `clipmap` -- `comworld` -- `gameworldsp` -- `gameworldmp` -- `mapents` -- `gfxworld` -- `gfxlightdef` -- `uimap` -- `font` -- `menulist` -- `menu` -- `localize` -- `weapon` -- `weapondef` -- `weaponvariant` -- `snddriverglobals` -- `fx` -- `fximpacttable` -- `aitype` -- `mptype` -- `mpbody` -- `mphead` -- `character` -- `xmodelalias` -- `rawfile` -- `stringtable` -- `packindex` -- `xglobals` -- `ddl` -- `glasses` -- `emblemset` - -#### T6: Call Of Duty: Black Ops 2 - -- `xmodelpieces` -- `physpreset` -- `physconstraints` -- `destructibledef` -- `xanim` -- `xmodel` -- `material` -- `techniqueset` -- `image` -- `soundbank` -- `soundpatch` -- `clipmap` -- `comworld` -- `gameworldsp` -- `gameworldmp` -- `mapents` -- `gfxworld` -- `gfxlightdef` -- `uimap` -- `font` -- `fonticon` -- `menulist` -- `menu` -- `localize` -- `weapon` -- `weapondef` -- `weaponvariant` -- `weaponfull` -- `attachment` -- `attachmentunique` -- `camo` -- `snddriverglobals` -- `fx` -- `fximpacttable` -- `aitype` -- `mptype` -- `mpbody` -- `mphead` -- `character` -- `xmodelalias` -- `rawfile` -- `stringtable` -- `leaderboard` -- `xglobals` -- `ddl` -- `glasses` -- `emblemset` -- `script` -- `keyvaluepairs` -- `vehicle` -- `memoryblock` -- `addonmapents` -- `tracer` -- `skinnedverts` -- `qdb` -- `slug` -- `footsteptable` -- `footstepfxtable` -- `zbarrier` \ No newline at end of file diff --git a/docs/technical/IPaks.md b/docs/technical/IPaks.md deleted file mode 100644 index 8966faf46..000000000 --- a/docs/technical/IPaks.md +++ /dev/null @@ -1,211 +0,0 @@ -# The IPak file format - -## IPak files - -IPaks have the `.ipak` file extension and contain image data and are only used in Black Ops 2 (T6) and replace the usecase for IWD files there. - -The image data contained is streamed just like with IWDs in other titles. -This means that the game keeps all loaded IPak files open and reads data for a corresponding image only on loading the given image. -Therefore not the entire content of the IPak is held in memory. -However on opening an IPak the index section is loaded and held in memory to be able to locate data for an image in an IPak. - -Images in an IPak are not identified via name. -Instead the data for an image is located via a 64bit integer key. -It is built up from two 32bit integer keys. -The first one is a 32bit hash of the image name. -The second one is a CRC hash of the image data. - -This means that image data is only from an IPak if both the name and the data (at least the specified hash) both match what was determined at runtime instead of only taking the image name as the way to locate the image data. -It is however to overwrite the data of an image anyway since the hash in the IPaks index section is trusted instead of calculating the hash at runtime. - -Image data within IPaks can either be uncompressed, compressed or a mix of both. -Whenever data is compressed, the [LZO compression algorithm](https://en.wikipedia.org/wiki/Lempel–Ziv–Oberhumer) is used. -The game and most likely also the devs ipak creation tools use LZO Professional, which is an improved, more efficient version of the LZO compression. -However it is compatible with the LZO versions that are available as open source. - -IPaks were most certainly designed with a focus on loading speed instead of file size. -Not unnoticable parts of the file are just padding data to move certain data to be located at specific size intervals, most likely for optimizing around some caching and IO implementations. -Also for compression LZO was chosen as an alternative to deflate which trades file size for decompression speed. - -## The file structure - -It is important to note that the available information about IPaks is limited, therefore some structures of the file were named by me since their official names are unknown. -So you might encounter code or other documentation that calls parts of the structure differently. -The terms within OAT should be consistent however. - -The following image gives a rough overview over the structure of an IPak file. -Afterwards follows a detailed description over the different parts. - -![](img/IPakFormat.png) - - -### Chunks - -All data including the file header within IPaks are part of a chunk. -Chunks are data blocks of the size `0x8000` (`32768`) bytes, counted from the beginning of the file. -This means the file header is always contained in the first chunk which spans from `0` to excluding `0x8000`. -The second chunk goes from `0x8000` to excluding `0x10000` and so on. - -The IPak file has to only contain full chunks meaning its file size must be a multiple of `0x8000` and the minimum size is `0x8000`. - -Sections in an IPak can only be set on chunk level, meaning they have to start at the beginning of a chunk and end at the ending of a chunk. - -The game's IPak reading code can only buffer up to `8` chunks within memory. -This means that no structure inside IPaks can be larger than `8` chunks (`0x8000 * 8` bytes -> `0x40000` bytes -> `262144` bytes). -This mostly applies for Blocks since they are the most likely to exceed this size. -All of these structures must be terminated before the `8` chunk size border. -If they exceed this size, the IPak is invalid. -If a structure starts inside a chunk and not at its beginning, the `8` chunk limited is counted from the beginning of the chunk it starts within. -Meaning its effective maximum size is lower at that point. - -### IPak header - -The IPak header is `16` bytes big: - -| Name | Size | -| ------------ | ------- | -| magic | 4 bytes | -| version | 4 bytes | -| size | 4 bytes | -| sectionCount | 4 bytes | - -The `magic` must correspond to the char sequence "KAPI" (`0x4950414B`), so the reverse of "IPAK". - -The `version` must always be `0x50000`. - -The `size` field contains the total file size of the IPak. -The game ignores its value however. - -The `sectionCount` field contains the amount of section definitions that now follow afterwards. - -Vanilla IPaks will always have two sections: The data and the index section. -It is however possible to simply add additional sections. -The game's IPak reader ignores them if it does not know their type which is the case for anything other than data or index. - -### Section definition - -A single section definition is `16` bytes big: - -| Name | Size | -| --------- | ------- | -| type | 4 bytes | -| offset | 4 bytes | -| size | 4 bytes | -| itemCount | 4 bytes | - -The `type` field contains the type of the section. -Depending on its value, the section is used for its appropriate purpose. -The game does know two section types, any sections with unknown types are ignored: - -* `1` -> Index section -* `2` -> Data section - -The `offset` field contains the file offset at which the section is located. - -The `size` field contains the size of the section. - -The `itemCount` field contains the amount of items that the section has. -Depending on the section type this can mean different things. -For data sections it states how many images the IPak has data for. -For index sections it states how many index entires the IPak has. -This value of this field is only used for index sections however. - -### Sections - -Sections inside IPak files are dedicated to a specific purpose. -A section must start at the beginning of a chunk. -Otherwise remaining space in between sections is padded with garbage data. - -Since the first chunk is reserved for the file header and section definitions, the earliest (and most common) start for the first section is at the beginning of the second chunk. - -The game only knows the data section and the index section. -Any other chunks are ignored. -Most commonly the first section in an IPak is the data section with the index section following afterwards. - -#### The data section - -The data section contains the data of the images contained within an IPak. -Its content is made up of Blocks. -Blocks do not have to have the same length, therefore the content does not follow a regular pattern in terms of size. -The data for an image must start at the beginning of a Block and must end at the end of the same or a subsequent block. - -#### The index section - -The index section contains metadata indexing the data within the data section. -Its content is an array of Index entries. - -### Blocks - -Blocks are only used within data sections. -They contain the data of the files within IPaks. -Blocks always start an offset that is a multiple of `0x80` (`128`), remaining space is padded with garbage data. - -Any structure inside IPaks, most noticably Blocks, cannot span more than `8` chunks. -This means it is important that a Block terminates before this border is reached. -If it could otherwise exceed this point it must terminate early, meaning having less than its maximum amount of data and let the following Block handle further data. - -A block starts with a header which is `128` bytes big: - -| Name | Size | -| ------------ | ------------ | -| offset | 3 bytes | -| count | 1 byte | -| commands[31] | 31 * 4 bytes | - -The `offset` field contains the offset inside the resulting file of the data that can be read from the block. -Meaning the first block for an image file should be the offset `0`. -If there are following Blocks for the same image file, they should continue at the offset where the data of the last Block ended. - -The `count` field specifies how many commands the current Block makes use of. -This can at max be `31` due to there being `31` slots for commands. - -The `commands` array holds `31` commands. -They dictate how to handle the data following the Block header. -A command is `4` bytes big: - -| Name | Size | -| ---------- | ------- | -| size | 3 bytes | -| compressed | 1 byte | - -The `size` field specifies how much data inside the IPak file should be handled as part of this command. -The data follows either the header when this is the first command of the Block, or the data of the previous command otherwise. - -The `compressed` field specifies how the data of the command is handled. -The game handles the data as uncompressed image file data when this value is `0`. -If the value is `1`, the data is handled as LZO compressed image file data. -If this field has any other value, the command and its assigned data is ignored. - -It is important that ignored commands are still skipped inside the file since the game uses the `compressed` value of `0xCF` to indicate skipped data for padding purposes. - -As a sidenote: -OAT does understand this skipping of padding. -However it does refrain from using it mostly since there is technically no real reason for making use of it since the space otherwise used as padding could still be used for uncompressed data. - -### Index entries - -Index entries only occur in the index section. -They link an image file to its data in the data section. -This is done by specifying the Block in the data section at which the image data starts at. - -Index entries are `16` bytes big: - -| Name | Size | -| -------- | ------- | -| dataHash | 4 bytes | -| nameHash | 4 bytes | -| offset | 4 bytes | -| size | 4 bytes | - -The `dataHash` field is a CRC32 checksum of the image file data. -For some reason the upper 3 bits of the hash are always set to 0 (`hash & 0x1FFFFFFF`). -I am not sure why. - -The `nameHash` field is a hash of the image name, hashed with the game's `R_HashString` function. - -The `offset` field specifies the offset of the first Block containing the image file data. -The offset is specifies relative to data section start, meaning the first Block within the data section would have offset `0`. - -The `size` field specifies the amount of data inside the IPak that corresponds to this image file. -This includes Block headers, padding and everything. -This is **not** the size of the final image file. diff --git a/docs/technical/img/IPakFormat.excalidraw b/docs/technical/img/IPakFormat.excalidraw deleted file mode 100644 index 60a217474..000000000 --- a/docs/technical/img/IPakFormat.excalidraw +++ /dev/null @@ -1,2200 +0,0 @@ -{ - "type": "excalidraw", - "version": 2, - "source": "https://excalidraw.com", - "elements": [ - { - "id": "3RQbnPzEL2iDMwmsB4525", - "type": "rectangle", - "x": 444.4382665706455, - "y": 120, - "width": 289, - "height": 131.97301171628777, - "angle": 0, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 1551807816, - "version": 362, - "versionNonce": 2140964168, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "id": "P-WypK1wdzFpU7fw_xQvR", - "type": "rectangle", - "x": 453.295816633547, - "y": 124.79578479850943, - "width": 271.8309276888378, - "height": 13.049273443279276, - "angle": 0, - "strokeColor": "#099268", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 1281742920, - "version": 256, - "versionNonce": 370662200, - "isDeleted": false, - "boundElements": null, - "updated": 1697887851686, - "link": null, - "locked": false - }, - { - "id": "XyMsfeCwvwWP5nTyQZc_a", - "type": "text", - "x": 386.6089241300245, - "y": 119.00983052908697, - "width": 52.97596740722656, - "height": 20, - "angle": 0, - "strokeColor": "#099268", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 85492024, - "version": 94, - "versionNonce": 574540088, - "isDeleted": false, - "boundElements": null, - "updated": 1697887847803, - "link": null, - "locked": false, - "text": "Header", - "fontSize": 16, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "baseline": 14, - "containerId": null, - "originalText": "Header", - "lineHeight": 1.25 - }, - { - "id": "Qu1cUJGNp1UnB9gf9UAyv", - "type": "rectangle", - "x": 449.2400027224372, - "y": 142.49959783614253, - "width": 278.21832871323437, - "height": 54.961966928035594, - "angle": 0, - "strokeColor": "#2f9e44", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 1522104632, - "version": 160, - "versionNonce": 1550855224, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "id": "NAEdH4ccd3kCJyesKH95O", - "type": "rectangle", - "x": 454.77880559115397, - "y": 148.03840070485927, - "width": 270.1231552897252, - "height": 17.042470365282355, - "angle": 0, - "strokeColor": "#69db7c", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 818426184, - "version": 142, - "versionNonce": 52548424, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 184, - "versionNonce": 386786616, - "isDeleted": false, - "id": "pPs9vcsm8DcS49mH_TXC3", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 454.77880559115397, - "y": 173.17604449365078, - "strokeColor": "#69db7c", - "backgroundColor": "transparent", - "width": 268.844970012329, - "height": 17.042470365282355, - "seed": 960324408, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "id": "NjTnn4GdwHp1x37p9Reh2", - "type": "text", - "x": 373.40100959693075, - "y": 144.62990663180284, - "width": 55.39198303222656, - "height": 40, - "angle": 0, - "strokeColor": "#2f9e44", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 632238136, - "version": 54, - "versionNonce": 126647864, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false, - "text": "Section\nDefs", - "fontSize": 16, - "fontFamily": 1, - "textAlign": "right", - "verticalAlign": "top", - "baseline": 34, - "containerId": null, - "originalText": "Section\nDefs", - "lineHeight": 1.25 - }, - { - "type": "text", - "version": 168, - "versionNonce": 1680580936, - "isDeleted": false, - "id": "69HCaQH5QLTdiwatrgkBq", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 458.63663545988885, - "y": 146.78511810666984, - "strokeColor": "#69db7c", - "backgroundColor": "transparent", - "width": 235.45584106445312, - "height": 20, - "seed": 776326968, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Data section: offset, size, ...", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Data section: offset, size, ...", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "type": "text", - "version": 223, - "versionNonce": 2127558456, - "isDeleted": false, - "id": "lCyjBh0DRvCd0B1KR17_I", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 459.08712287979137, - "y": 170.84515615802786, - "strokeColor": "#69db7c", - "backgroundColor": "transparent", - "width": 235.63182067871094, - "height": 20, - "seed": 136799816, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Index section: offset, size, ...", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Index section: offset, size, ...", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "id": "B7adIXs6O2Bc23BOuKE9l", - "type": "text", - "x": 742.5612517906463, - "y": 127.22895346796943, - "width": 115.37593078613281, - "height": 40, - "angle": 0, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 2051052088, - "version": 66, - "versionNonce": 289165368, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false, - "text": "Chunk #0\n0x8000 bytes", - "fontSize": 16, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "baseline": 34, - "containerId": null, - "originalText": "Chunk #0\n0x8000 bytes", - "lineHeight": 1.25 - }, - { - "type": "text", - "version": 280, - "versionNonce": 10573896, - "isDeleted": false, - "id": "kVtXUiCxUstXaLo2S9A25", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 538.5255716687427, - "y": 213.83535175971755, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 96.13992309570312, - "height": 25, - "seed": 1893287752, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887479552, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "... padding", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "... padding", - "lineHeight": 1.25, - "baseline": 18 - }, - { - "type": "rectangle", - "version": 421, - "versionNonce": 649431352, - "isDeleted": false, - "id": "kmVBJxfei0jVB91KUfIbj", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 445.1212628388938, - "y": 259.46881331084023, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 289, - "height": 131.97301171628777, - "seed": 786719288, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 139, - "versionNonce": 1881982536, - "isDeleted": false, - "id": "V4aVn_su1pKtB1BtwGPoA", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 746.3793989754319, - "y": 250.756440936793, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 115.37593078613281, - "height": 40, - "seed": 2119628600, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Chunk #1\n0x8000 bytes", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Chunk #1\n0x8000 bytes", - "lineHeight": 1.25, - "baseline": 34 - }, - { - "type": "rectangle", - "version": 500, - "versionNonce": 178233912, - "isDeleted": false, - "id": "FxGMIsP1tow5NCWlK3dFF", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 445.1212628388937, - "y": 396.1682845123952, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 289, - "height": 131.97301171628777, - "seed": 918124088, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 160, - "versionNonce": 709672264, - "isDeleted": false, - "id": "-tExYnhh3KffxsPdDHdew", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 747.2344933796558, - "y": 404.71842066388916, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 115.37593078613281, - "height": 40, - "seed": 1853731640, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Chunk #2\n0x8000 bytes", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Chunk #2\n0x8000 bytes", - "lineHeight": 1.25, - "baseline": 34 - }, - { - "id": "KNOGuePRoAM1zXev65fty", - "type": "rectangle", - "x": 451.7873561916828, - "y": 265.330240549213, - "width": 273.96616012593796, - "height": 367.0804883767668, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 1850364216, - "version": 199, - "versionNonce": 180861512, - "isDeleted": false, - "boundElements": null, - "updated": 1697887487376, - "link": null, - "locked": false - }, - { - "id": "tavj5zl7-QMdJt7cW6t_0", - "type": "text", - "x": 304.31074825639524, - "y": 247.74649114154408, - "width": 131.5198974609375, - "height": 25, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 749996872, - "version": 75, - "versionNonce": 727045192, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false, - "text": "Data section", - "fontSize": 20, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "baseline": 18, - "containerId": null, - "originalText": "Data section", - "lineHeight": 1.25 - }, - { - "id": "bXarzKIXjI3-AmeSBwQ-G", - "type": "rectangle", - "x": 456.248277214634, - "y": 270.71376273697456, - "width": 263.12774350460205, - "height": 200.98433669996928, - "angle": 0, - "strokeColor": "#f08c00", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 541211464, - "version": 485, - "versionNonce": 1020687416, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "id": "e3LAz1YuRqCLhdyDftnzK", - "type": "text", - "x": 747.3481592179236, - "y": 299.6341093203633, - "width": 72.2879638671875, - "height": 20, - "angle": 0, - "strokeColor": "#f08c00", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 1984984648, - "version": 17, - "versionNonce": 2032405320, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false, - "text": "Block #0", - "fontSize": 16, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "baseline": 14, - "containerId": null, - "originalText": "Block #0", - "lineHeight": 1.25 - }, - { - "id": "YyxMmwK7gZmnS0frHBvsI", - "type": "rectangle", - "x": 463.8339418922441, - "y": 278.77353145693536, - "width": 248.9046222340831, - "height": 43.143467853907744, - "angle": 0, - "strokeColor": "#ffd43b", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [ - "1IyXjyW_AT1fElJTs1s6R" - ], - "frameId": null, - "roundness": null, - "seed": 1270877240, - "version": 560, - "versionNonce": 2115199560, - "isDeleted": false, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "id": "j7WFzYeIOuusBCZwLTUdB", - "type": "text", - "x": 468.10087827339976, - "y": 278.77353145693536, - "width": 206.4798583984375, - "height": 20, - "angle": 0, - "strokeColor": "#ffd43b", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [ - "1IyXjyW_AT1fElJTs1s6R" - ], - "frameId": null, - "roundness": null, - "seed": 1840757064, - "version": 116, - "versionNonce": 687916600, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false, - "text": "Block Header: offset, size", - "fontSize": 16, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "baseline": 14, - "containerId": null, - "originalText": "Block Header: offset, size", - "lineHeight": 1.25 - }, - { - "id": "b5s4lQqkJ_s412X3BKX7I", - "type": "rectangle", - "x": 468.5749823157505, - "y": 298.685901235662, - "width": 20.38647382107729, - "height": 18.964161694025393, - "angle": 0, - "strokeColor": "#ffd43b", - "backgroundColor": "#ffec99", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [ - "1IyXjyW_AT1fElJTs1s6R" - ], - "frameId": null, - "roundness": null, - "seed": 2072641080, - "version": 91, - "versionNonce": 2030033224, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 106, - "versionNonce": 2054897464, - "isDeleted": false, - "id": "C-KyUkeG1y4m1T7EaQ7U6", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 496.7841728356133, - "y": 300.1082133627139, - "strokeColor": "#ffd43b", - "backgroundColor": "#ffec99", - "width": 20.38647382107729, - "height": 18.964161694025393, - "seed": 836056136, - "groupIds": [ - "1IyXjyW_AT1fElJTs1s6R" - ], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 107, - "versionNonce": 1833267272, - "isDeleted": false, - "id": "zQfkKHJ5EDtE4fRXnPLUg", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 524.2822072919502, - "y": 298.2117971933114, - "strokeColor": "#ffd43b", - "backgroundColor": "#ffec99", - "width": 20.38647382107729, - "height": 18.964161694025393, - "seed": 1254073416, - "groupIds": [ - "1IyXjyW_AT1fElJTs1s6R" - ], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 114, - "versionNonce": 138319928, - "isDeleted": false, - "id": "lNEezJFqu3ZNyZmPoj8Zb", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 549.8838255788842, - "y": 299.16000527801265, - "strokeColor": "#ffd43b", - "backgroundColor": "#ffec99", - "width": 20.38647382107729, - "height": 18.964161694025393, - "seed": 504384328, - "groupIds": [ - "1IyXjyW_AT1fElJTs1s6R" - ], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "id": "OwaIkrMwpsNkHdYp0Iy9w", - "type": "text", - "x": 576.4704292622223, - "y": 297.8494617354172, - "width": 117.47190856933594, - "height": 20, - "angle": 0, - "strokeColor": "#ffd43b", - "backgroundColor": "#ffec99", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [ - "1IyXjyW_AT1fElJTs1s6R" - ], - "frameId": null, - "roundness": null, - "seed": 1609808456, - "version": 112, - "versionNonce": 314582856, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false, - "text": "... 31 commands", - "fontSize": 16, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "baseline": 14, - "containerId": null, - "originalText": "... 31 commands", - "lineHeight": 1.25 - }, - { - "id": "WL4QFGPJNLKX4aDYvPHcY", - "type": "rectangle", - "x": 464.2803341313007, - "y": 323.92121967201444, - "width": 244.98098612488354, - "height": 30, - "angle": 0, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 1736310072, - "version": 96, - "versionNonce": 372166968, - "isDeleted": false, - "boundElements": [ - { - "type": "text", - "id": "BsklfwwJbFVrnZZbegBaK" - } - ], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "id": "BsklfwwJbFVrnZZbegBaK", - "type": "text", - "x": 469.2803341313007, - "y": 328.92121967201444, - "width": 145.919921875, - "height": 20, - "angle": 0, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 626333000, - "version": 23, - "versionNonce": 1170996808, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false, - "text": "Command #0 data", - "fontSize": 16, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "middle", - "baseline": 14, - "containerId": "WL4QFGPJNLKX4aDYvPHcY", - "originalText": "Command #0 data", - "lineHeight": 1.25 - }, - { - "type": "rectangle", - "version": 128, - "versionNonce": 1134945080, - "isDeleted": false, - "id": "h5IByDUIw-Vujn2eSGWNh", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 464.51817974889775, - "y": 358.39310813218515, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 244.98098612488354, - "height": 30, - "seed": 709194808, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "HP_QT46xry41WrJSPQ5fL" - } - ], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 57, - "versionNonce": 478612552, - "isDeleted": false, - "id": "HP_QT46xry41WrJSPQ5fL", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 469.51817974889775, - "y": 363.39310813218515, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 139.2479248046875, - "height": 20, - "seed": 184167736, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Command #1 data", - "textAlign": "left", - "verticalAlign": "middle", - "containerId": "h5IByDUIw-Vujn2eSGWNh", - "originalText": "Command #1 data", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "type": "rectangle", - "version": 168, - "versionNonce": 477412408, - "isDeleted": false, - "id": "7OQsgVVQuNnCYXl5vbsm5", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 463.56679727850974, - "y": 390.74011212537357, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 244.98098612488354, - "height": 30, - "seed": 625393224, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "csxR_75El8clcpk-2oQaP" - } - ], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 99, - "versionNonce": 527319880, - "isDeleted": false, - "id": "csxR_75El8clcpk-2oQaP", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 468.56679727850974, - "y": 395.74011212537357, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 146.30392456054688, - "height": 20, - "seed": 426227016, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Command #2 data", - "textAlign": "left", - "verticalAlign": "middle", - "containerId": "7OQsgVVQuNnCYXl5vbsm5", - "originalText": "Command #2 data", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "id": "uETDccvSGG1xEzUX7IcmH", - "type": "text", - "x": 577.232173174711, - "y": 416.3334001226971, - "width": 13.151962280273438, - "height": 20, - "angle": 0, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 1122083400, - "version": 67, - "versionNonce": 134247736, - "isDeleted": false, - "boundElements": null, - "updated": 1697887326899, - "link": null, - "locked": false, - "text": "...", - "fontSize": 16, - "fontFamily": 1, - "textAlign": "left", - "verticalAlign": "top", - "baseline": 14, - "containerId": null, - "originalText": "...", - "lineHeight": 1.25 - }, - { - "type": "rectangle", - "version": 556, - "versionNonce": 1314298440, - "isDeleted": false, - "id": "ysdCOa_OFmXvTfzd5N0H4", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 446.56616601008756, - "y": 533.9208907241449, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 289, - "height": 131.97301171628777, - "seed": 27366200, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 191, - "versionNonce": 1538068024, - "isDeleted": false, - "id": "-sZKP9I32EQ4ZhN5DqbIn", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 749.2455472554294, - "y": 537.2280992981788, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 115.37593078613281, - "height": 40, - "seed": 2050750024, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Chunk #3\n0x8000 bytes", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Chunk #3\n0x8000 bytes", - "lineHeight": 1.25, - "baseline": 34 - }, - { - "type": "rectangle", - "version": 235, - "versionNonce": 1276907848, - "isDeleted": false, - "id": "nYss_NIU_T8I8dk-2lxof", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 462.93316920298014, - "y": 436.6417372822469, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 244.98098612488354, - "height": 30, - "seed": 1331567928, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "dhEKknrlbKKbWdMLTl3yO" - } - ], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 169, - "versionNonce": 543065912, - "isDeleted": false, - "id": "dhEKknrlbKKbWdMLTl3yO", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 467.93316920298014, - "y": 441.6417372822469, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 150.1439208984375, - "height": 20, - "seed": 957724216, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Command #31 data", - "textAlign": "left", - "verticalAlign": "middle", - "containerId": "nYss_NIU_T8I8dk-2lxof", - "originalText": "Command #31 data", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "type": "rectangle", - "version": 640, - "versionNonce": 1747016, - "isDeleted": false, - "id": "CTHNz4m4F-8xJ87bVepu0", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 462.39592694594904, - "y": 478.52940835742197, - "strokeColor": "#ffd43b", - "backgroundColor": "transparent", - "width": 248.9046222340831, - "height": 43.143467853907744, - "seed": 971378744, - "groupIds": [ - "sR3labby8bgzvTdruTCms" - ], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 196, - "versionNonce": 578347064, - "isDeleted": false, - "id": "YXNFW77BifkjMGtKnK9d_", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 466.6628633271048, - "y": 478.52940835742197, - "strokeColor": "#ffd43b", - "backgroundColor": "transparent", - "width": 206.4798583984375, - "height": 20, - "seed": 338118968, - "groupIds": [ - "sR3labby8bgzvTdruTCms" - ], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Block Header: offset, size", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Block Header: offset, size", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "type": "rectangle", - "version": 171, - "versionNonce": 103702344, - "isDeleted": false, - "id": "B8YrJOASSVmoYq2XVTzhX", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 467.13696736945553, - "y": 498.4417781361486, - "strokeColor": "#ffd43b", - "backgroundColor": "#ffec99", - "width": 20.38647382107729, - "height": 18.964161694025393, - "seed": 1675190840, - "groupIds": [ - "sR3labby8bgzvTdruTCms" - ], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 186, - "versionNonce": 31463736, - "isDeleted": false, - "id": "bUSoT2hL8GgzPGchjO_u-", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 495.3461578893182, - "y": 499.8640902632005, - "strokeColor": "#ffd43b", - "backgroundColor": "#ffec99", - "width": 20.38647382107729, - "height": 18.964161694025393, - "seed": 132143928, - "groupIds": [ - "sR3labby8bgzvTdruTCms" - ], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 187, - "versionNonce": 515061320, - "isDeleted": false, - "id": "LxwgApzzp8GeI1c55Ribg", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 522.8441923456551, - "y": 497.967674093798, - "strokeColor": "#ffd43b", - "backgroundColor": "#ffec99", - "width": 20.38647382107729, - "height": 18.964161694025393, - "seed": 1654666296, - "groupIds": [ - "sR3labby8bgzvTdruTCms" - ], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 194, - "versionNonce": 1106784824, - "isDeleted": false, - "id": "HGdxBOCSEpErTXmMJ3-4g", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 548.445810632589, - "y": 498.91588217849926, - "strokeColor": "#ffd43b", - "backgroundColor": "#ffec99", - "width": 20.38647382107729, - "height": 18.964161694025393, - "seed": 1778183480, - "groupIds": [ - "sR3labby8bgzvTdruTCms" - ], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 192, - "versionNonce": 512044360, - "isDeleted": false, - "id": "JouwXRXB0OGLglWa2fjKE", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 575.0324143159271, - "y": 497.60533863590376, - "strokeColor": "#ffd43b", - "backgroundColor": "#ffec99", - "width": 117.47190856933594, - "height": 20, - "seed": 928679480, - "groupIds": [ - "sR3labby8bgzvTdruTCms" - ], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "... 31 commands", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "... 31 commands", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "type": "rectangle", - "version": 620, - "versionNonce": 1599627064, - "isDeleted": false, - "id": "_B9xVGQMzu2ppo0drnHXB", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 456.52412836204655, - "y": 475.2344590671588, - "strokeColor": "#f08c00", - "backgroundColor": "transparent", - "width": 263.12774350460205, - "height": 125.41806161210387, - "seed": 572795976, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887330015, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 173, - "versionNonce": 1593853000, - "isDeleted": false, - "id": "ht8U6Rg7JJTUXJrXpA62S", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 464.3577450005488, - "y": 527.2530520305087, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 244.98098612488354, - "height": 30, - "seed": 527523144, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "UeCOik6QNNogNSLFlIerx" - } - ], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 100, - "versionNonce": 1128989752, - "isDeleted": false, - "id": "UeCOik6QNNogNSLFlIerx", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 469.3577450005488, - "y": 532.2530520305087, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 145.919921875, - "height": 20, - "seed": 1390834760, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Command #0 data", - "textAlign": "left", - "verticalAlign": "middle", - "containerId": "ht8U6Rg7JJTUXJrXpA62S", - "originalText": "Command #0 data", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "type": "text", - "version": 142, - "versionNonce": 771783496, - "isDeleted": false, - "id": "H4yeY2t-lCiyUPdXLc3p5", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 572.5353861499981, - "y": 547.8177325679554, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 13.151962280273438, - "height": 20, - "seed": 1676107592, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "...", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "...", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "type": "rectangle", - "version": 309, - "versionNonce": 214809912, - "isDeleted": false, - "id": "qVez-03q0hxKNeonATgQ1", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 461.87822089783515, - "y": 566.3055566482493, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 244.98098612488354, - "height": 30, - "seed": 102755656, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "wfN-sCwO9AEl71OrO0WwJ" - } - ], - "updated": 1697887326899, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 243, - "versionNonce": 1038209608, - "isDeleted": false, - "id": "wfN-sCwO9AEl71OrO0WwJ", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 466.87822089783515, - "y": 571.3055566482493, - "strokeColor": "#9c36b5", - "backgroundColor": "transparent", - "width": 150.1439208984375, - "height": 20, - "seed": 88278088, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887326899, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Command #31 data", - "textAlign": "left", - "verticalAlign": "middle", - "containerId": "qVez-03q0hxKNeonATgQ1", - "originalText": "Command #31 data", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "type": "text", - "version": 87, - "versionNonce": 1195342136, - "isDeleted": false, - "id": "A9OSLNnpLGBj_A75rRF9R", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 743.1786985097434, - "y": 474.1124531974678, - "strokeColor": "#f08c00", - "backgroundColor": "transparent", - "width": 65.615966796875, - "height": 20, - "seed": 874580536, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887340437, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Block #1", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Block #1", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "type": "text", - "version": 160, - "versionNonce": 349122376, - "isDeleted": false, - "id": "wGV2ENeWxrnZSkuNWCHA1", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 526.3745180160861, - "y": 605.2918749475142, - "strokeColor": "#f08c00", - "backgroundColor": "transparent", - "width": 109.48789978027344, - "height": 20, - "seed": 677798968, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887352148, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "... more blocks", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "... more blocks", - "lineHeight": 1.25, - "baseline": 14 - }, - { - "type": "rectangle", - "version": 602, - "versionNonce": 741168712, - "isDeleted": false, - "id": "J3lzDlav1RThPDpONLKWS", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 448.9485653315615, - "y": 676.3075004686616, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 289, - "height": 131.97301171628777, - "seed": 1035553608, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887379737, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 252, - "versionNonce": 1658654024, - "isDeleted": false, - "id": "lxiPSbQ6LKWDoFynnd6dk", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 748.2900992084909, - "y": 676.5303550241422, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 115.37593078613281, - "height": 40, - "seed": 1211013960, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887386465, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Chunk #4\n0x8000 bytes", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Chunk #4\n0x8000 bytes", - "lineHeight": 1.25, - "baseline": 34 - }, - { - "id": "_lYtmqtEAt1i_jw370iOM", - "type": "rectangle", - "x": 455.43255735232265, - "y": 681.017252887646, - "width": 273.75565167357934, - "height": 194.8155380248624, - "angle": 0, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "frameId": null, - "roundness": null, - "seed": 727440696, - "version": 166, - "versionNonce": 253960008, - "isDeleted": false, - "boundElements": null, - "updated": 1697887669342, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 119, - "versionNonce": 269904968, - "isDeleted": false, - "id": "-tlleGJMpmf9vbz2R36z_", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 303.95051963429984, - "y": 679.9243539577114, - "strokeColor": "#1971c2", - "backgroundColor": "transparent", - "width": 131.73988342285156, - "height": 25, - "seed": 959848776, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887455290, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "Index section", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Index section", - "lineHeight": 1.25, - "baseline": 18 - }, - { - "type": "text", - "version": 325, - "versionNonce": 1550365512, - "isDeleted": false, - "id": "RwqNJHMIfZKJwK67MqKsr", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 538.046655302104, - "y": 636.643124260674, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 96.13992309570312, - "height": 25, - "seed": 2125692744, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887491295, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "... padding", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "... padding", - "lineHeight": 1.25, - "baseline": 18 - }, - { - "type": "text", - "version": 408, - "versionNonce": 1668707896, - "isDeleted": false, - "id": "Xev0NQEUYUrWXutPfiBMV", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 541.2845970317047, - "y": 901.9095410926683, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 96.13992309570312, - "height": 25, - "seed": 770577992, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887618733, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "... padding", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "... padding", - "lineHeight": 1.25, - "baseline": 18 - }, - { - "type": "rectangle", - "version": 447, - "versionNonce": 28728904, - "isDeleted": false, - "id": "cD0hWKpgVIqaaGYtfEX79", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 460.3587769040305, - "y": 688.0110824719719, - "strokeColor": "#4dabf7", - "backgroundColor": "transparent", - "width": 260.36651322918146, - "height": 31.884088314076937, - "seed": 1757195080, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "vBOECytJu0jxIW645WoN6" - } - ], - "updated": 1697887682720, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 473, - "versionNonce": 1767468104, - "isDeleted": false, - "id": "vBOECytJu0jxIW645WoN6", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 465.3587769040305, - "y": 693.3250971909847, - "strokeColor": "#4dabf7", - "backgroundColor": "transparent", - "width": 241.6378631591797, - "height": 21.25605887605129, - "seed": 832045640, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887682720, - "link": null, - "locked": false, - "fontSize": 17.004847100841033, - "fontFamily": 1, - "text": "Index entry #0: offset, size", - "textAlign": "left", - "verticalAlign": "middle", - "containerId": "cD0hWKpgVIqaaGYtfEX79", - "originalText": "Index entry #0: offset, size", - "lineHeight": 1.25, - "baseline": 15 - }, - { - "type": "rectangle", - "version": 500, - "versionNonce": 1660199752, - "isDeleted": false, - "id": "p2hPvov9kO_ywOu2-DMyt", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 462.17364982699576, - "y": 726.5771320849891, - "strokeColor": "#4dabf7", - "backgroundColor": "transparent", - "width": 260.36651322918146, - "height": 31.884088314076937, - "seed": 505807928, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "_3o3AKWwZKoK1lArDRSBR" - } - ], - "updated": 1697887682720, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 528, - "versionNonce": 1770680648, - "isDeleted": false, - "id": "_3o3AKWwZKoK1lArDRSBR", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 467.17364982699576, - "y": 731.8911468040019, - "strokeColor": "#4dabf7", - "backgroundColor": "transparent", - "width": 234.54885864257812, - "height": 21.25605887605129, - "seed": 1414053176, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887682720, - "link": null, - "locked": false, - "fontSize": 17.004847100841033, - "fontFamily": 1, - "text": "Index entry #1: offset, size", - "textAlign": "left", - "verticalAlign": "middle", - "containerId": "p2hPvov9kO_ywOu2-DMyt", - "originalText": "Index entry #1: offset, size", - "lineHeight": 1.25, - "baseline": 15 - }, - { - "type": "rectangle", - "version": 650, - "versionNonce": 824758840, - "isDeleted": false, - "id": "WBraYjQYco03Gx0E57iVG", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 451.802902277498, - "y": 814.8240250260674, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 289, - "height": 131.97301171628777, - "seed": 583932728, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887603087, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 291, - "versionNonce": 903329608, - "isDeleted": false, - "id": "XDao1udogLSlLBGjVo8Eo", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 754.8729555298578, - "y": 814.3551046566752, - "strokeColor": "#e03131", - "backgroundColor": "transparent", - "width": 115.37593078613281, - "height": 40, - "seed": 733519688, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887610777, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "Chunk #5\n0x8000 bytes", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Chunk #5\n0x8000 bytes", - "lineHeight": 1.25, - "baseline": 34 - }, - { - "type": "text", - "version": 392, - "versionNonce": 1905680968, - "isDeleted": false, - "id": "_mQEE5dspr4rhEQ5TFmEs", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 583.4749882126047, - "y": 765.2542405173784, - "strokeColor": "#4dabf7", - "backgroundColor": "transparent", - "width": 16.439987182617188, - "height": 25, - "seed": 116866616, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887655891, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "...", - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "...", - "lineHeight": 1.25, - "baseline": 18 - }, - { - "type": "rectangle", - "version": 552, - "versionNonce": 533974856, - "isDeleted": false, - "id": "mFSwWeAZqNnmErR03Y58u", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 462.2557262948062, - "y": 833.4978612569287, - "strokeColor": "#4dabf7", - "backgroundColor": "transparent", - "width": 260.36651322918146, - "height": 31.884088314076937, - "seed": 1025956680, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "PQm5eKl9Qp_Z1yKHaj9cU" - } - ], - "updated": 1697887698235, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 583, - "versionNonce": 1110091336, - "isDeleted": false, - "id": "PQm5eKl9Qp_Z1yKHaj9cU", - "fillStyle": "cross-hatch", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 467.2557262948062, - "y": 838.8118759759415, - "strokeColor": "#4dabf7", - "backgroundColor": "transparent", - "width": 237.86386108398438, - "height": 21.25605887605129, - "seed": 1497117256, - "groupIds": [], - "frameId": null, - "roundness": null, - "boundElements": [], - "updated": 1697887698235, - "link": null, - "locked": false, - "fontSize": 17.004847100841033, - "fontFamily": 1, - "text": "Index entry #?: offset, size", - "textAlign": "left", - "verticalAlign": "middle", - "containerId": "mFSwWeAZqNnmErR03Y58u", - "originalText": "Index entry #?: offset, size", - "lineHeight": 1.25, - "baseline": 15 - } - ], - "appState": { - "gridSize": null, - "viewBackgroundColor": "#ffffff" - }, - "files": {} -} \ No newline at end of file diff --git a/docs/technical/img/IPakFormat.png b/docs/technical/img/IPakFormat.png deleted file mode 100644 index 731573291..000000000 Binary files a/docs/technical/img/IPakFormat.png and /dev/null differ