Macintosh resource fork data: GraphViz block diagram (.dot) source

The data format of Macintosh resource forks, used on Classic Mac OS and Mac OS X/macOS to store additional structured data along with a file's main data (the data fork). The kinds of data stored in resource forks include:

  • Document resources: images, sounds, etc. used by a document
  • Application resources: graphics, GUI layouts, localizable strings, and even code used by an application, a library, or system files
  • Common metadata: custom icons and version metadata that could be displayed by the Finder
  • Application-specific metadata: because resource forks follow a common format, other applications can store new metadata in them, even if the original application does not recognize or understand it

Macintosh file systems (MFS, HFS, HFS+, APFS) support resource forks natively, which allows storing resources along with any file. Non-Macintosh file systems and protocols have little or no support for resource forks, so the resource fork data must be stored in some other way when using such file systems or protocols. Various file formats and tools exist for this purpose, such as BinHex, MacBinary, AppleSingle, AppleDouble, or QuickTime RezWack. In some cases, resource forks are stored as plain data in separate files with a .rsrc extension, even on Mac systems that natively support resource forks.

On modern Mac OS X/macOS systems, resource forks are used far less commonly than on classic Mac OS systems, because of compatibility issues with other systems and historical limitations in the format. Modern macOS APIs and libraries do not use resource forks, and the legacy Carbon API that still used them has been deprecated since OS X 10.8. Despite this, even current macOS systems still use resource forks for certain purposes, such as custom file icons.

Application

Mac OS

File extension

["rsrc", "dfont"]

KS implementation details

License: MIT
Minimal Kaitai Struct required: 0.9

References

This page hosts a formal specification of Macintosh resource fork data using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

GraphViz block diagram source

resource_fork.dot

digraph {
	rankdir=LR;
	node [shape=plaintext];
	subgraph cluster__resource_fork {
		label="ResourceFork";
		graph[style=dotted];

		resource_fork__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
			<TR><TD PORT="header_pos">0</TD><TD PORT="header_size">16</TD><TD>FileHeader</TD><TD PORT="header_type">header</TD></TR>
			<TR><TD PORT="system_data_pos">16</TD><TD PORT="system_data_size">112</TD><TD></TD><TD PORT="system_data_type">system_data</TD></TR>
			<TR><TD PORT="application_data_pos">128</TD><TD PORT="application_data_size">128</TD><TD></TD><TD PORT="application_data_type">application_data</TD></TR>
		</TABLE>>];
		resource_fork__inst__data_blocks_with_io [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
			<TR><TD PORT="data_blocks_with_io_pos">header.ofs_data_blocks</TD><TD PORT="data_blocks_with_io_size">header.len_data_blocks</TD><TD>BytesWithIo</TD><TD PORT="data_blocks_with_io_type">data_blocks_with_io</TD></TR>
		</TABLE>>];
		resource_fork__inst__data_blocks [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
			<TR><TD>data_blocks</TD><TD>data_blocks_with_io.data</TD></TR>
		</TABLE>>];
		resource_fork__inst__resource_map [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
			<TR><TD PORT="resource_map_pos">header.ofs_resource_map</TD><TD PORT="resource_map_size">header.len_resource_map</TD><TD>ResourceMap</TD><TD PORT="resource_map_type">resource_map</TD></TR>
		</TABLE>>];
		subgraph cluster__file_header {
			label="ResourceFork::FileHeader";
			graph[style=dotted];

			file_header__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="ofs_data_blocks_pos">0</TD><TD PORT="ofs_data_blocks_size">4</TD><TD>u4be</TD><TD PORT="ofs_data_blocks_type">ofs_data_blocks</TD></TR>
				<TR><TD PORT="ofs_resource_map_pos">4</TD><TD PORT="ofs_resource_map_size">4</TD><TD>u4be</TD><TD PORT="ofs_resource_map_type">ofs_resource_map</TD></TR>
				<TR><TD PORT="len_data_blocks_pos">8</TD><TD PORT="len_data_blocks_size">4</TD><TD>u4be</TD><TD PORT="len_data_blocks_type">len_data_blocks</TD></TR>
				<TR><TD PORT="len_resource_map_pos">12</TD><TD PORT="len_resource_map_size">4</TD><TD>u4be</TD><TD PORT="len_resource_map_type">len_resource_map</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__data_block {
			label="ResourceFork::DataBlock";
			graph[style=dotted];

			data_block__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_data_pos">0</TD><TD PORT="len_data_size">4</TD><TD>u4be</TD><TD PORT="len_data_type">len_data</TD></TR>
				<TR><TD PORT="data_pos">4</TD><TD PORT="data_size">len_data</TD><TD></TD><TD PORT="data_type">data</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__resource_map {
			label="ResourceFork::ResourceMap";
			graph[style=dotted];

			resource_map__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="reserved_file_header_copy_pos">0</TD><TD PORT="reserved_file_header_copy_size">16</TD><TD>FileHeader</TD><TD PORT="reserved_file_header_copy_type">reserved_file_header_copy</TD></TR>
				<TR><TD PORT="reserved_next_resource_map_handle_pos">16</TD><TD PORT="reserved_next_resource_map_handle_size">4</TD><TD>u4be</TD><TD PORT="reserved_next_resource_map_handle_type">reserved_next_resource_map_handle</TD></TR>
				<TR><TD PORT="reserved_file_reference_number_pos">20</TD><TD PORT="reserved_file_reference_number_size">2</TD><TD>u2be</TD><TD PORT="reserved_file_reference_number_type">reserved_file_reference_number</TD></TR>
				<TR><TD PORT="file_attributes_pos">22</TD><TD PORT="file_attributes_size">2</TD><TD>FileAttributes</TD><TD PORT="file_attributes_type">file_attributes</TD></TR>
				<TR><TD PORT="ofs_type_list_pos">24</TD><TD PORT="ofs_type_list_size">2</TD><TD>u2be</TD><TD PORT="ofs_type_list_type">ofs_type_list</TD></TR>
				<TR><TD PORT="ofs_names_pos">26</TD><TD PORT="ofs_names_size">2</TD><TD>u2be</TD><TD PORT="ofs_names_type">ofs_names</TD></TR>
			</TABLE>>];
			resource_map__inst__type_list_and_reference_lists [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="type_list_and_reference_lists_pos">ofs_type_list</TD><TD PORT="type_list_and_reference_lists_size">(ofs_names - ofs_type_list)</TD><TD>TypeListAndReferenceLists</TD><TD PORT="type_list_and_reference_lists_type">type_list_and_reference_lists</TD></TR>
			</TABLE>>];
			resource_map__inst__names_with_io [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="names_with_io_pos">ofs_names</TD><TD PORT="names_with_io_size"></TD><TD>BytesWithIo</TD><TD PORT="names_with_io_type">names_with_io</TD></TR>
			</TABLE>>];
			resource_map__inst__names [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
				<TR><TD>names</TD><TD>names_with_io.data</TD></TR>
			</TABLE>>];
			subgraph cluster__file_attributes {
				label="ResourceFork::ResourceMap::FileAttributes";
				graph[style=dotted];

				file_attributes__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="resources_locked_pos">0</TD><TD PORT="resources_locked_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="resources_locked_type">resources_locked</TD></TR>
					<TR><TD PORT="reserved0_pos">0:1</TD><TD PORT="reserved0_size">6b</TD><TD>b6</TD><TD PORT="reserved0_type">reserved0</TD></TR>
					<TR><TD PORT="printer_driver_multifinder_compatible_pos">0:7</TD><TD PORT="printer_driver_multifinder_compatible_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="printer_driver_multifinder_compatible_type">printer_driver_multifinder_compatible</TD></TR>
					<TR><TD PORT="no_write_changes_pos">1</TD><TD PORT="no_write_changes_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="no_write_changes_type">no_write_changes</TD></TR>
					<TR><TD PORT="needs_compact_pos">1:1</TD><TD PORT="needs_compact_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="needs_compact_type">needs_compact</TD></TR>
					<TR><TD PORT="map_needs_write_pos">1:2</TD><TD PORT="map_needs_write_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="map_needs_write_type">map_needs_write</TD></TR>
					<TR><TD PORT="reserved1_pos">1:3</TD><TD PORT="reserved1_size">5b</TD><TD>b5</TD><TD PORT="reserved1_type">reserved1</TD></TR>
				</TABLE>>];
				file_attributes__inst__as_int [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="as_int_pos">0</TD><TD PORT="as_int_size">2</TD><TD>u2be</TD><TD PORT="as_int_type">as_int</TD></TR>
				</TABLE>>];
			}
			subgraph cluster__type_list_and_reference_lists {
				label="ResourceFork::ResourceMap::TypeListAndReferenceLists";
				graph[style=dotted];

				type_list_and_reference_lists__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="type_list_pos">0</TD><TD PORT="type_list_size">...</TD><TD>TypeList</TD><TD PORT="type_list_type">type_list</TD></TR>
					<TR><TD PORT="reference_lists_pos">...</TD><TD PORT="reference_lists_size"></TD><TD></TD><TD PORT="reference_lists_type">reference_lists</TD></TR>
				</TABLE>>];
				subgraph cluster__type_list {
					label="ResourceFork::ResourceMap::TypeListAndReferenceLists::TypeList";
					graph[style=dotted];

					type_list__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
						<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
						<TR><TD PORT="num_types_m1_pos">0</TD><TD PORT="num_types_m1_size">2</TD><TD>u2be</TD><TD PORT="num_types_m1_type">num_types_m1</TD></TR>
						<TR><TD PORT="entries_pos">2</TD><TD PORT="entries_size">8</TD><TD>TypeListEntry</TD><TD PORT="entries_type">entries</TD></TR>
						<TR><TD COLSPAN="4" PORT="entries__repeat">repeat num_types times</TD></TR>
					</TABLE>>];
					type_list__inst__num_types [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
						<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
						<TR><TD>num_types</TD><TD>((num_types_m1 + 1) % 65536)</TD></TR>
					</TABLE>>];
					subgraph cluster__type_list_entry {
						label="ResourceFork::ResourceMap::TypeListAndReferenceLists::TypeList::TypeListEntry";
						graph[style=dotted];

						type_list_entry__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
							<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
							<TR><TD PORT="type_pos">0</TD><TD PORT="type_size">4</TD><TD></TD><TD PORT="type_type">type</TD></TR>
							<TR><TD PORT="num_references_m1_pos">4</TD><TD PORT="num_references_m1_size">2</TD><TD>u2be</TD><TD PORT="num_references_m1_type">num_references_m1</TD></TR>
							<TR><TD PORT="ofs_reference_list_pos">6</TD><TD PORT="ofs_reference_list_size">2</TD><TD>u2be</TD><TD PORT="ofs_reference_list_type">ofs_reference_list</TD></TR>
						</TABLE>>];
						type_list_entry__inst__num_references [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
							<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
							<TR><TD>num_references</TD><TD>((num_references_m1 + 1) % 65536)</TD></TR>
						</TABLE>>];
						type_list_entry__inst__reference_list [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
							<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
							<TR><TD PORT="reference_list_pos">ofs_reference_list</TD><TD PORT="reference_list_size">...</TD><TD>ReferenceList</TD><TD PORT="reference_list_type">reference_list</TD></TR>
						</TABLE>>];
					}
				}
				subgraph cluster__reference_list {
					label="ResourceFork::ResourceMap::TypeListAndReferenceLists::ReferenceList";
					graph[style=dotted];

					reference_list__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
						<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
						<TR><TD PORT="references_pos">0</TD><TD PORT="references_size">12</TD><TD>Reference</TD><TD PORT="references_type">references</TD></TR>
						<TR><TD COLSPAN="4" PORT="references__repeat">repeat num_references times</TD></TR>
					</TABLE>>];
					subgraph cluster__reference {
						label="ResourceFork::ResourceMap::TypeListAndReferenceLists::ReferenceList::Reference";
						graph[style=dotted];

						reference__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
							<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
							<TR><TD PORT="id_pos">0</TD><TD PORT="id_size">2</TD><TD>s2be</TD><TD PORT="id_type">id</TD></TR>
							<TR><TD PORT="ofs_name_pos">2</TD><TD PORT="ofs_name_size">2</TD><TD>u2be</TD><TD PORT="ofs_name_type">ofs_name</TD></TR>
							<TR><TD PORT="attributes_pos">4</TD><TD PORT="attributes_size">1</TD><TD>Attributes</TD><TD PORT="attributes_type">attributes</TD></TR>
							<TR><TD PORT="ofs_data_block_pos">5</TD><TD PORT="ofs_data_block_size">3</TD><TD>b24</TD><TD PORT="ofs_data_block_type">ofs_data_block</TD></TR>
							<TR><TD PORT="reserved_handle_pos">8</TD><TD PORT="reserved_handle_size">4</TD><TD>u4be</TD><TD PORT="reserved_handle_type">reserved_handle</TD></TR>
						</TABLE>>];
						reference__inst__name [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
							<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
							<TR><TD PORT="name_pos">ofs_name</TD><TD PORT="name_size">...</TD><TD>Name</TD><TD PORT="name_type">name</TD></TR>
						</TABLE>>];
						reference__inst__data_block [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
							<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
							<TR><TD PORT="data_block_pos">ofs_data_block</TD><TD PORT="data_block_size">...</TD><TD>DataBlock</TD><TD PORT="data_block_type">data_block</TD></TR>
						</TABLE>>];
						subgraph cluster__attributes {
							label="ResourceFork::ResourceMap::TypeListAndReferenceLists::ReferenceList::Reference::Attributes";
							graph[style=dotted];

							attributes__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
								<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
								<TR><TD PORT="system_reference_pos">0</TD><TD PORT="system_reference_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="system_reference_type">system_reference</TD></TR>
								<TR><TD PORT="load_into_system_heap_pos">0:1</TD><TD PORT="load_into_system_heap_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="load_into_system_heap_type">load_into_system_heap</TD></TR>
								<TR><TD PORT="purgeable_pos">0:2</TD><TD PORT="purgeable_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="purgeable_type">purgeable</TD></TR>
								<TR><TD PORT="locked_pos">0:3</TD><TD PORT="locked_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="locked_type">locked</TD></TR>
								<TR><TD PORT="protected_pos">0:4</TD><TD PORT="protected_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="protected_type">protected</TD></TR>
								<TR><TD PORT="preload_pos">0:5</TD><TD PORT="preload_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="preload_type">preload</TD></TR>
								<TR><TD PORT="needs_write_pos">0:6</TD><TD PORT="needs_write_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="needs_write_type">needs_write</TD></TR>
								<TR><TD PORT="compressed_pos">0:7</TD><TD PORT="compressed_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="compressed_type">compressed</TD></TR>
							</TABLE>>];
							attributes__inst__as_int [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
								<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
								<TR><TD PORT="as_int_pos">0</TD><TD PORT="as_int_size">1</TD><TD>u1</TD><TD PORT="as_int_type">as_int</TD></TR>
							</TABLE>>];
						}
					}
				}
			}
			subgraph cluster__name {
				label="ResourceFork::ResourceMap::Name";
				graph[style=dotted];

				name__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
					<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
					<TR><TD PORT="len_value_pos">0</TD><TD PORT="len_value_size">1</TD><TD>u1</TD><TD PORT="len_value_type">len_value</TD></TR>
					<TR><TD PORT="value_pos">1</TD><TD PORT="value_size">len_value</TD><TD></TD><TD PORT="value_type">value</TD></TR>
				</TABLE>>];
			}
		}
	}
	resource_fork__seq:header_type -> file_header__seq [style=bold];
	file_header__seq:ofs_data_blocks_type -> resource_fork__inst__data_blocks_with_io:data_blocks_with_io_pos [color="#404040"];
	file_header__seq:len_data_blocks_type -> resource_fork__inst__data_blocks_with_io:data_blocks_with_io_size [color="#404040"];
	resource_fork__inst__data_blocks_with_io:data_blocks_with_io_type -> bytes_with_io__seq [style=bold];
	bytes_with_io__seq:data_type -> resource_fork__inst__data_blocks [color="#404040"];
	file_header__seq:ofs_resource_map_type -> resource_fork__inst__resource_map:resource_map_pos [color="#404040"];
	file_header__seq:len_resource_map_type -> resource_fork__inst__resource_map:resource_map_size [color="#404040"];
	resource_fork__inst__resource_map:resource_map_type -> resource_map__seq [style=bold];
	data_block__seq:len_data_type -> data_block__seq:data_size [color="#404040"];
	resource_map__seq:reserved_file_header_copy_type -> file_header__seq [style=bold];
	resource_map__seq:file_attributes_type -> file_attributes__seq [style=bold];
	resource_map__seq:ofs_type_list_type -> resource_map__inst__type_list_and_reference_lists:type_list_and_reference_lists_pos [color="#404040"];
	resource_map__seq:ofs_names_type -> resource_map__inst__type_list_and_reference_lists:type_list_and_reference_lists_size [color="#404040"];
	resource_map__seq:ofs_type_list_type -> resource_map__inst__type_list_and_reference_lists:type_list_and_reference_lists_size [color="#404040"];
	resource_map__inst__type_list_and_reference_lists:type_list_and_reference_lists_type -> type_list_and_reference_lists__seq [style=bold];
	resource_map__seq:ofs_names_type -> resource_map__inst__names_with_io:names_with_io_pos [color="#404040"];
	resource_map__inst__names_with_io:names_with_io_type -> bytes_with_io__seq [style=bold];
	bytes_with_io__seq:data_type -> resource_map__inst__names [color="#404040"];
	type_list_and_reference_lists__seq:type_list_type -> type_list__seq [style=bold];
	type_list__seq:entries_type -> type_list_entry__seq [style=bold];
	type_list__inst__num_types:num_types_type -> type_list__seq:entries__repeat [color="#404040"];
	type_list__seq:num_types_m1_type -> type_list__inst__num_types [color="#404040"];
	type_list_entry__seq:num_references_m1_type -> type_list_entry__inst__num_references [color="#404040"];
	type_list_entry__seq:ofs_reference_list_type -> type_list_entry__inst__reference_list:reference_list_pos [color="#404040"];
	type_list_entry__inst__reference_list:reference_list_type -> reference_list__seq [style=bold];
	reference_list__seq:references_type -> reference__seq [style=bold];
	reference_list__params:num_references_type -> reference_list__seq:references__repeat [color="#404040"];
	reference__seq:attributes_type -> attributes__seq [style=bold];
	reference__seq:ofs_name_type -> reference__inst__name:name_pos [color="#404040"];
	reference__inst__name:name_type -> name__seq [style=bold];
	reference__seq:ofs_data_block_type -> reference__inst__data_block:data_block_pos [color="#404040"];
	reference__inst__data_block:data_block_type -> data_block__seq [style=bold];
	name__seq:len_value_type -> name__seq:value_size [color="#404040"];
}