-- Table structure for table `cache_entity`
--

CREATE TABLE `cache_entity` (
  `cid` varchar(255) CHARACTER SET ascii COLLATE ascii_bin NOT NULL DEFAULT '' COMMENT 'Primary Key: Unique cache ID.',
  `data` longblob COMMENT 'A collection of data to cache.',
  `expire` int(11) NOT NULL DEFAULT '0' COMMENT 'A Unix timestamp indicating when the cache entry should expire, or -1 for never.',
  `created` decimal(14,3) NOT NULL DEFAULT '0.000' COMMENT 'A timestamp with millisecond precision indicating when the cache entry was created.',
  `serialized` smallint(6) NOT NULL DEFAULT '0' COMMENT 'A flag to indicate whether content is serialized (1) or not (0).',
  `tags` longtext COMMENT 'Space-separated list of cache tags for this entry.',
  `checksum` varchar(255) CHARACTER SET ascii NOT NULL COMMENT 'The tag invalidation checksum when this entry was saved.',
  PRIMARY KEY (`cid`),
  KEY `expire` (`expire`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Storage for the cache API.';

--
-- Dumping data for table `cache_entity`
--

set autocommit=0;
INSERT INTO `cache_entity` VALUES ('values:block_content:10','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:1:\"8\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"10\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"452ab128-1fe5-4e90-9795-7f268aad3b7f\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:18:\"Highlight - Yaffs \";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1489535989\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1489532812\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";N;}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:95:\"<p>Read <a href=\"/documents/how-yaffs-works\">How Yaffs Works</a> for technical details...</p>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"10\";s:8:\"revision\";s:1:\"8\";s:4:\"uuid\";s:36:\"452ab128-1fe5-4e90-9795-7f268aad3b7f\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:18:\"Highlight - Yaffs \";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:1:\"8\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.234,1,'block_content_values entity_field_info','814'),('values:block_content:12','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"10\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"12\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"0403436e-1843-4c91-b571-12a9bae675ac\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:18:\"Yaffs diagram link\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1489536065\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1489532812\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";N;}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:221:\"<p>A picture is worth thousands of words: <a href=\"/yaffs-structure-diagram\">this diagram</a> shows how the layers that make up Yaffs fit together.<br />\r\n[ibimage==291==ib_thumbnail==node==self==null]<br />\r\n&nbsp;</p>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"12\";s:8:\"revision\";s:2:\"10\";s:4:\"uuid\";s:36:\"0403436e-1843-4c91-b571-12a9bae675ac\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:18:\"Yaffs diagram link\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"10\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.317,1,'block_content_values entity_field_info','814'),('values:block_content:13','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"11\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"13\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"b6d7e364-208a-4a23-b16e-13455bc6f005\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:46:\"Considerations in Choosing a Flash File System\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1489533375\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1489532812\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";N;}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:384:\"<p>Our paper&nbsp;<a href=\"/documents/considerations-choosing-flash-file-system\">Considerations in Choosing a Flash File System</a>&nbsp;details the problems specific to Flash and describes why file systems not specifically&nbsp;designed for Flash RAM can fail. <a href=\"/sites/yaffs.net/files/Considerations-in-choosing-a-flash-file-system.pdf\">It\'s available as a PDF too</a>.</p>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"13\";s:8:\"revision\";s:2:\"11\";s:4:\"uuid\";s:36:\"b6d7e364-208a-4a23-b16e-13455bc6f005\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:46:\"Considerations in Choosing a Flash File System\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"11\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.384,1,'block_content_values entity_field_info','814'),('values:block_content:14','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"12\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"14\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"4b5d96ad-83f7-48de-9a9f-da4f825b5eea\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:31:\"Robust Flash Storage Since 2002\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1489532812\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1489532812\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";N;}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:92:\"<div style=\"text-align: right;\"><em>Robust Flash Storage Since 2002 &nbsp; &nbsp;</em></div>\";s:7:\"summary\";N;s:6:\"format\";s:9:\"full_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"14\";s:8:\"revision\";s:2:\"12\";s:4:\"uuid\";s:36:\"4b5d96ad-83f7-48de-9a9f-da4f825b5eea\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:31:\"Robust Flash Storage Since 2002\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"12\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.459,1,'block_content_values entity_field_info','814'),('values:block_content:18','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"16\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"18\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"4848c58d-90df-4819-81d8-0f9568eeeaac\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:11:\"Cookie info\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1491308791\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1491308791\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:119:\"<p>We use <a href=\"/legal\">cookies on this site</a>. By using this site you are giving us consent to set cookies.</p>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"18\";s:8:\"revision\";s:2:\"16\";s:4:\"uuid\";s:36:\"4848c58d-90df-4819-81d8-0f9568eeeaac\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:11:\"Cookie info\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"16\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.501,1,'block_content_values entity_field_info','814'),('values:block_content:19','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"21\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"19\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:10:\"hero_block\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"7bd640f0-cb4b-4c95-aa40-03cc074d53e6\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:15:\"Front page hero\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1495074624\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1495074624\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"field_hero_image\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"2\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:10:\"hero_block\";s:2:\"id\";s:2:\"19\";s:8:\"revision\";s:2:\"21\";s:4:\"uuid\";s:36:\"7bd640f0-cb4b-4c95-aa40-03cc074d53e6\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:15:\"Front page hero\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"21\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.576,1,'block_content_values entity_field_info','814'),('values:block_content:20','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"19\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"20\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"2b65df32-5067-47ad-a55d-ff0b164e3c47\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:14:\"Ordering lists\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1495029742\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1492857425\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";N;}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:869:\"<p><strong>Use this to organise a list</strong><br />\r\n<br />\r\nYou can drag, to re-order the list of items. Delete an item from the list by deleting the text in a field and then Saving. Add an item by typing part of its&nbsp;name in the field, and then choosing it&nbsp;from the list that appears. The number next to the name indicates the ID of the document/page, and you can use it to be sure you\'ve got the right one. The list that you see is restricted to particular types, so for example, you won\'t see logos in the list if you are working on ordering a list of features.<br />\r\n<br />\r\nThe ordering is used to highlight the most important items in a list. The most important appears at the top. When a list is produced, for instance on the /features page, all the features will be listed, but the first few on the page will come from the queue for features.</p>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"20\";s:8:\"revision\";s:2:\"19\";s:4:\"uuid\";s:36:\"2b65df32-5067-47ad-a55d-ff0b164e3c47\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:14:\"Ordering lists\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"19\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.652,1,'block_content_values entity_field_info','814'),('values:block_content:21','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"20\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"21\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"2cad5021-e096-4c99-9a7e-7fd63631c222\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:17:\"Managing ordering\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1495029159\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1495028790\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";N;}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:547:\"<p>Managing ordering is done using Drupal Entityqueues. Choose the appropriate queue for the sort of thing that you want to edit.<br />\r\n&nbsp;</p>\r\n\r\n<ul>\r\n	<li>The User Logo ordering is used to order the logos on the front page.</li>\r\n	<li>The Features is used to order features on the front page and on the <a href=\"/features\">/features page</a>.</li>\r\n	<li>The Documents Highlights orders the items on the front page, and in the megamenu, if it\'s switched on.</li>\r\n</ul>\r\n\r\n<p>Click Choose Edit items to work on&nbsp;a particular queue.</p>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"21\";s:8:\"revision\";s:2:\"20\";s:4:\"uuid\";s:36:\"2cad5021-e096-4c99-9a7e-7fd63631c222\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:17:\"Managing ordering\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"20\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.693,1,'block_content_values entity_field_info','814'),('values:block_content:22','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"22\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"22\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"d71c44fa-5f97-4236-92fa-765d08479c06\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:15:\"VxWorks + Yaffs\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496359437\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1496359437\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";N;}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:228:\"<h3>VxWorks + Yaffs!</h3>\r\n\r\n<p>Now Yaffs for VxWorks offers an easy way to combine the robustness offered by Yaffs with the proven safety of VxWorks.<br />\r\n<br />\r\n<a href=\"/documents/yaffs-vxworks\">Find out more ...</a></p>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"22\";s:8:\"revision\";s:2:\"22\";s:4:\"uuid\";s:36:\"d71c44fa-5f97-4236-92fa-765d08479c06\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:15:\"VxWorks + Yaffs\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"22\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.735,1,'block_content_values entity_field_info','814'),('values:block_content:23','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"24\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"23\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"78ab593d-35b6-4772-a141-30216e7fcbb2\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:14:\"Footer - Legal\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497347390\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1497347390\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:101:\"<p class=\"text-align-right\">&nbsp;<a href=\"http://localhost:8012/legal\">Legal &amp; Cookies</a></p>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:9:\"full_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"23\";s:8:\"revision\";s:2:\"24\";s:4:\"uuid\";s:36:\"78ab593d-35b6-4772-a141-30216e7fcbb2\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:14:\"Footer - Legal\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"24\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.777,1,'block_content_values entity_field_info','814'),('values:block_content:24','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"30\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"24\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"13019391-0c9d-4ad2-b5cc-8c36422d5126\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:23:\"Front Image Highlight 1\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497463992\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1497463992\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:391:\"<a href=\"/documents/considerations-choosing-flash-file-system\"><drupal-entity data-embed-button=\"media\" data-entity-embed-display=\"entity_reference:media_thumbnail\" data-entity-embed-display-settings=\"{&quot;image_style&quot;:&quot;max_325x325&quot;,&quot;image_link&quot;:&quot;&quot;}\" data-entity-type=\"media\" data-entity-uuid=\"ef592722-4f56-473e-b3ca-474c36ffda30\"></drupal-entity></a>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"24\";s:8:\"revision\";s:2:\"30\";s:4:\"uuid\";s:36:\"13019391-0c9d-4ad2-b5cc-8c36422d5126\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:23:\"Front Image Highlight 1\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"30\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.819,1,'block_content_values entity_field_info','814'),('values:block_content:25','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"29\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"25\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"fa53fc80-f3c4-4d6e-b947-0a3bcd479480\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:23:\"Front Image Highlight 2\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497463934\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1497463934\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:393:\"<a href=\"/documents/considerations-choosing-flash-file-system\">\r\n<drupal-entity data-embed-button=\"media\" data-entity-embed-display=\"entity_reference:media_thumbnail\" data-entity-embed-display-settings=\"{&quot;image_style&quot;:&quot;max_325x325&quot;,&quot;image_link&quot;:&quot;&quot;}\" data-entity-type=\"media\" data-entity-uuid=\"68722a5f-4d30-4a7e-9702-709ed1ee2e95\"></drupal-entity></a>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"25\";s:8:\"revision\";s:2:\"29\";s:4:\"uuid\";s:36:\"fa53fc80-f3c4-4d6e-b947-0a3bcd479480\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:23:\"Front Image Highlight 2\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"29\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.894,1,'block_content_values entity_field_info','814'),('values:block_content:26','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:2:\"28\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:2:\"26\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"8a7c7afe-a192-4840-850e-e70a9e8e9939\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:23:\"Front Image Highlight 3\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497463837\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1497463837\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:351:\"<a href=\"/get-yaffs\">\r\n<drupal-entity data-embed-button=\"media\" data-entity-embed-display=\"entity_reference:media_thumbnail\" data-entity-embed-display-settings=\"{&quot;image_style&quot;:&quot;max_325x325&quot;,&quot;image_link&quot;:&quot;&quot;}\" data-entity-type=\"media\" data-entity-uuid=\"a5ff3427-bfa9-4f71-964c-5f6647660eb5\"></drupal-entity></a>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:2:\"26\";s:8:\"revision\";s:2:\"28\";s:4:\"uuid\";s:36:\"8a7c7afe-a192-4840-850e-e70a9e8e9939\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:23:\"Front Image Highlight 3\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:2:\"28\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.936,1,'block_content_values entity_field_info','814'),('values:block_content:3','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:1:\"2\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:1:\"3\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"765f1638-9758-447c-aa50-a90e9ece1c10\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:19:\"Get YAFFS Highlight\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1489532812\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1489532812\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";N;}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:76:\"<p>[ibimage==233==original==http://localhost:8093/downloads==self==null]</p>\";s:7:\"summary\";N;s:6:\"format\";s:9:\"full_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:1:\"3\";s:8:\"revision\";s:1:\"2\";s:4:\"uuid\";s:36:\"765f1638-9758-447c-aa50-a90e9ece1c10\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:19:\"Get YAFFS Highlight\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:1:\"2\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.060,1,'block_content_values entity_field_info','814'),('values:block_content:7','O:40:\"Drupal\\block_content\\Entity\\BlockContent\":25:{s:8:\"\0*\0theme\";N;s:9:\"\0*\0values\";a:14:{s:11:\"revision_id\";a:1:{s:9:\"x-default\";s:1:\"6\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:2:\"id\";a:1:{s:9:\"x-default\";s:1:\"7\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"basic\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"6c2d4b45-4dba-4b2d-8b9f-76701bf27533\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"info\";a:1:{s:9:\"x-default\";s:15:\"Contact details\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1492986866\";}s:16:\"revision_created\";a:1:{s:9:\"x-default\";s:10:\"1489532812\";}s:13:\"revision_user\";a:1:{s:9:\"x-default\";N;}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:194:\"<ul class=\"fa-ul\">\r\n	<li><i class=\"fa-li fa fa-phone\"></i>+44 (0)1223 811679</li>\r\n	<li><i class=\"fa-li fa fa-envelope\"></i><a href=\"mailto:info@aleph1.co.uk\">info@aleph1.co.uk</a></li>\r\n</ul>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:9:\"full_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"basic\";s:2:\"id\";s:1:\"7\";s:8:\"revision\";s:1:\"6\";s:4:\"uuid\";s:36:\"6c2d4b45-4dba-4b2d-8b9f-76701bf27533\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:15:\"Contact details\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:1:\"6\";s:15:\"\0*\0entityTypeId\";s:13:\"block_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105466.142,1,'block_content_values entity_field_info','814'),('values:file:1','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"39004672-000c-4b13-af59-838822a4bc5a\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:20:\"media_embed_icon.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:29:\"public://media_embed_icon.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:3:\"341\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1492616282\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1492616282\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:1:\"1\";s:5:\"label\";s:20:\"media_embed_icon.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"39004672-000c-4b13-af59-838822a4bc5a\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105498.268,1,'entity_field_info file_values','815'),('values:file:102','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:3:\"102\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"6096cfeb-b53d-4eaf-943e-7151a53ab404\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:7:\"atm.jpg\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:26:\"public://2017-06/atm_1.jpg\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:10:\"image/jpeg\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:6:\"433615\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1497453264\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497453284\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:3:\"102\";s:5:\"label\";s:7:\"atm.jpg\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"6096cfeb-b53d-4eaf-943e-7151a53ab404\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105482.792,1,'entity_field_info file_values','815'),('values:file:103','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:3:\"103\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"616e86b3-d531-4b0b-ab75-de87118a1de7\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:8:\"wall.jpg\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:25:\"public://2017-06/wall.jpg\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:10:\"image/jpeg\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:6:\"341214\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1497453339\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497453368\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:3:\"103\";s:5:\"label\";s:8:\"wall.jpg\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"616e86b3-d531-4b0b-ab75-de87118a1de7\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105482.253,1,'entity_field_info file_values','815'),('values:file:104','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:3:\"104\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"d64d6f8f-c679-46bb-8367-357a6cf7642f\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:9:\"arrow.jpg\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:26:\"public://2017-06/arrow.jpg\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:10:\"image/jpeg\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:6:\"524605\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1497453467\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497453491\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:3:\"104\";s:5:\"label\";s:9:\"arrow.jpg\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"d64d6f8f-c679-46bb-8367-357a6cf7642f\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105483.089,1,'entity_field_info file_values','815'),('values:file:40','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"40\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"921d1ff5-c79c-4273-accc-1a485824d9e3\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:16:\"designA_logo.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:31:\"public://logos/designA_logo.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:5:\"16876\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1494510848\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1494510854\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"40\";s:5:\"label\";s:16:\"designA_logo.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"921d1ff5-c79c-4273-accc-1a485824d9e3\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105484.961,1,'entity_field_info file_values','815'),('values:file:43','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"43\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"684f77bd-3fba-4e13-b647-45e512065006\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:18:\"LANCOM_Logo_4c.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:33:\"public://logos/LANCOM_Logo_4c.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:5:\"32180\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1494601189\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1494601211\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"43\";s:5:\"label\";s:18:\"LANCOM_Logo_4c.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"684f77bd-3fba-4e13-b647-45e512065006\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105485.027,1,'entity_field_info file_values','815'),('values:file:44','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"44\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"dfd5cee0-fd49-4a37-a784-b8571e351cb0\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:14:\"leica_logo.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:29:\"public://logos/leica_logo.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:5:\"36068\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1494601543\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1494601548\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"44\";s:5:\"label\";s:14:\"leica_logo.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"dfd5cee0-fd49-4a37-a784-b8571e351cb0\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105485.061,1,'entity_field_info file_values','815'),('values:file:45','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"45\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"f0f26496-a05f-4456-8165-af8e39667299\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:30:\"bernina_international_logo.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:45:\"public://logos/bernina_international_logo.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:4:\"4454\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1494601682\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1494601697\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"45\";s:5:\"label\";s:30:\"bernina_international_logo.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"f0f26496-a05f-4456-8165-af8e39667299\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105485.127,1,'entity_field_info file_values','815'),('values:file:46','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"46\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"662c89ff-930d-4032-a7f8-e6740f2d41ac\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:14:\"eaton_logo.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:29:\"public://logos/eaton_logo.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:5:\"68284\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1494602119\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1494602123\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"46\";s:5:\"label\";s:14:\"eaton_logo.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"662c89ff-930d-4032-a7f8-e6740f2d41ac\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105485.184,1,'entity_field_info file_values','815'),('values:file:47','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"47\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"35ac1064-9b93-442a-a7e5-ec1aaeb73175\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:18:\"gallagher_logo.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:33:\"public://logos/gallagher_logo.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:6:\"296338\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1494602381\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1494602386\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"47\";s:5:\"label\";s:18:\"gallagher_logo.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"35ac1064-9b93-442a-a7e5-ec1aaeb73175\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105485.261,1,'entity_field_info file_values','815'),('values:file:48','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"48\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"9cfbc2c6-cb71-432c-bcdc-56781b086569\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:16:\"android_logo.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:31:\"public://logos/android_logo.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:4:\"7358\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1494602580\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1494602590\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"48\";s:5:\"label\";s:16:\"android_logo.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"9cfbc2c6-cb71-432c-bcdc-56781b086569\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105485.336,1,'entity_field_info file_values','815'),('values:file:76','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"76\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"649b672d-3d04-4fd6-94ad-02fe1472250c\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:17:\"HowYaffsWorks.pdf\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:36:\"public://downloads/HowYaffsWorks.pdf\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:15:\"application/pdf\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:6:\"402514\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496852430\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496852438\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"76\";s:5:\"label\";s:17:\"HowYaffsWorks.pdf\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"649b672d-3d04-4fd6-94ad-02fe1472250c\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105490.604,1,'entity_field_info file_values','815'),('values:file:77','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"77\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"10b3de93-5616-493f-bc87-f4b36dde2d59\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:44:\"ConsiderationsInChoosingAFlashFileSystem.pdf\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:65:\"public://downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:15:\"application/pdf\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:6:\"131376\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496853352\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496853416\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"77\";s:5:\"label\";s:44:\"ConsiderationsInChoosingAFlashFileSystem.pdf\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"10b3de93-5616-493f-bc87-f4b36dde2d59\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105490.632,1,'entity_field_info file_values','815'),('values:file:78','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"78\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"e3e66290-0bb4-43c3-829c-b53dcc1957a1\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:29:\"YaffsRobustnessAndTesting.pdf\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:48:\"public://downloads/YaffsRobustnessAndTesting.pdf\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:15:\"application/pdf\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:6:\"143414\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496872958\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496872963\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"78\";s:5:\"label\";s:29:\"YaffsRobustnessAndTesting.pdf\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"e3e66290-0bb4-43c3-829c-b53dcc1957a1\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105490.667,1,'entity_field_info file_values','815'),('values:file:79','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"79\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"943cfe84-eb21-4856-ba2d-f99c094d1b7f\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:33:\"YaffsRobustnessAndTesting.pdf.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:76:\"public://styles/pdf_image/public/downloads/YaffsRobustnessAndTesting.pdf.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:5:\"27903\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496873154\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496873154\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"79\";s:5:\"label\";s:33:\"YaffsRobustnessAndTesting.pdf.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"943cfe84-eb21-4856-ba2d-f99c094d1b7f\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105491.225,1,'entity_field_info file_values','815'),('values:file:80','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"80\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"57cb6eab-6e9e-43a4-b604-f0c8a6efe529\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:15:\"YaffsDirect.pdf\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:34:\"public://downloads/YaffsDirect.pdf\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:15:\"application/pdf\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:6:\"256079\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496875980\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496875984\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"80\";s:5:\"label\";s:15:\"YaffsDirect.pdf\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"57cb6eab-6e9e-43a4-b604-f0c8a6efe529\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105491.127,1,'entity_field_info file_values','815'),('values:file:81','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"81\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"a98ec2f3-a25f-48e8-bb4e-0ecd8df00967\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:19:\"YaffsDirect.pdf.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:62:\"public://styles/pdf_image/public/downloads/YaffsDirect.pdf.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:5:\"18167\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496875984\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496875984\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"81\";s:5:\"label\";s:19:\"YaffsDirect.pdf.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"a98ec2f3-a25f-48e8-bb4e-0ecd8df00967\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105491.327,1,'entity_field_info file_values','815'),('values:file:82','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"82\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"d4311368-859a-4449-ac19-6351e21f95ac\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:20:\"YaffsDirectTests.pdf\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:39:\"public://downloads/YaffsDirectTests.pdf\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:15:\"application/pdf\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:5:\"53457\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496922765\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496922769\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"82\";s:5:\"label\";s:20:\"YaffsDirectTests.pdf\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"d4311368-859a-4449-ac19-6351e21f95ac\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498107621.546,1,'entity_field_info file_values','815'),('values:file:83','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"83\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"d1cb5540-ff14-4da5-828f-7345a16f2768\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:30:\"YaffsNandFailureMitigation.pdf\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:49:\"public://downloads/YaffsNandFailureMitigation.pdf\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:15:\"application/pdf\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:6:\"235109\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496923138\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496923141\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"83\";s:5:\"label\";s:30:\"YaffsNandFailureMitigation.pdf\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"d1cb5540-ff14-4da5-828f-7345a16f2768\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105491.160,1,'entity_field_info file_values','815'),('values:file:84','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"84\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"ceaf7916-3519-45be-b8e2-9b4594bbf176\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:34:\"YaffsNandFailureMitigation.pdf.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:77:\"public://styles/pdf_image/public/downloads/YaffsNandFailureMitigation.pdf.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:5:\"22113\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496923141\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496923141\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"84\";s:5:\"label\";s:34:\"YaffsNandFailureMitigation.pdf.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"ceaf7916-3519-45be-b8e2-9b4594bbf176\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105491.361,1,'entity_field_info file_values','815'),('values:file:88','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"88\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"871ecf42-739e-4da4-acbe-fa56bd039980\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:50:\"ConsiderationsInChoosingAFlashFileSystem_0.pdf.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:93:\"public://styles/pdf_image/public/downloads/ConsiderationsInChoosingAFlashFileSystem_0.pdf.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:5:\"24383\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496924936\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496924936\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"88\";s:5:\"label\";s:50:\"ConsiderationsInChoosingAFlashFileSystem_0.pdf.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"871ecf42-739e-4da4-acbe-fa56bd039980\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105491.394,1,'entity_field_info file_values','815'),('values:file:89','O:23:\"Drupal\\file\\Entity\\File\":24:{s:9:\"\0*\0values\";a:11:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:2:\"89\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"c05d7843-a44d-4d09-98f0-76d498de8ef0\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:2:\"en\";}}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:8:\"filename\";a:1:{s:9:\"x-default\";s:21:\"HowYaffsWorks.pdf.png\";}s:3:\"uri\";a:1:{s:9:\"x-default\";s:64:\"public://styles/pdf_image/public/downloads/HowYaffsWorks.pdf.png\";}s:8:\"filemime\";a:1:{s:9:\"x-default\";s:9:\"image/png\";}s:8:\"filesize\";a:1:{s:9:\"x-default\";s:5:\"17640\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1496924967\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496924967\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:5:{s:6:\"bundle\";s:4:\"file\";s:2:\"id\";s:2:\"89\";s:5:\"label\";s:21:\"HowYaffsWorks.pdf.png\";s:8:\"langcode\";s:2:\"en\";s:4:\"uuid\";s:36:\"c05d7843-a44d-4d09-98f0-76d498de8ef0\";}s:25:\"\0*\0translatableEntityKeys\";a:1:{s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"file\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105491.428,1,'entity_field_info file_values','815'),('values:font:1147','O:31:\"Drupal\\fontyourface\\Entity\\Font\":24:{s:9:\"\0*\0values\";a:21:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:4:\"1147\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"0ebffe2e-0145-4bd8-baf7-df1f2e6e15d0\";}s:3:\"pid\";a:1:{s:9:\"x-default\";s:16:\"fontsquirrel_api\";}s:3:\"url\";a:1:{s:9:\"x-default\";s:74:\"https://www.fontsquirrel.com/fonts/liberation-serif#LiberationSerifRegular\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:24:\"Liberation Serif Regular\";}s:10:\"css_family\";a:1:{s:9:\"x-default\";s:22:\"LiberationSerifRegular\";}s:9:\"css_style\";a:1:{s:9:\"x-default\";s:6:\"normal\";}s:10:\"css_weight\";a:1:{s:9:\"x-default\";s:3:\"400\";}s:7:\"foundry\";a:1:{s:9:\"x-default\";s:7:\"Red Hat\";}s:11:\"foundry_url\";a:1:{s:9:\"x-default\";s:44:\"https://www.fontsquirrel.com/foundry/Red-Hat\";}s:7:\"license\";a:1:{s:9:\"x-default\";s:30:\"See Font Squirrel license page\";}s:11:\"license_url\";a:1:{s:9:\"x-default\";s:56:\"https://www.fontsquirrel.com/fonts/liberation-serif#eula\";}s:8:\"designer\";a:1:{s:9:\"x-default\";N;}s:12:\"designer_url\";a:1:{s:9:\"x-default\";N;}s:8:\"metadata\";a:1:{s:9:\"x-default\";s:284:\"a:5:{s:2:\"id\";s:3:\"382\";s:4:\"path\";s:16:\"liberation-serif\";s:13:\"font_filename\";s:27:\"LiberationSerif-Regular.ttf\";s:8:\"checksum\";s:32:\"67e7bee1eae33eee01a437b540becf6f\";s:13:\"preview_image\";s:84:\"https://www.fontsquirrel.com//fnt_imgs/67/e7be/e1eae33eee01a437b540becf6f/sp-720.png\";}\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1490210124\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1490219284\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:20:\"field_classification\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"4\";}}}s:25:\"field_supported_languages\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"2\";}}}s:10:\"field_tags\";a:1:{s:9:\"x-default\";a:2:{i:0;a:1:{s:9:\"target_id\";s:3:\"162\";}i:1;a:1:{s:9:\"target_id\";s:3:\"162\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:0:\"\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:6:{s:6:\"bundle\";s:4:\"font\";s:2:\"id\";s:4:\"1147\";s:5:\"label\";s:24:\"Liberation Serif Regular\";s:4:\"uuid\";s:36:\"0ebffe2e-0145-4bd8-baf7-df1f2e6e15d0\";s:3:\"pid\";s:16:\"fontsquirrel_api\";s:3:\"url\";s:74:\"https://www.fontsquirrel.com/fonts/liberation-serif#LiberationSerifRegular\";}s:25:\"\0*\0translatableEntityKeys\";a:0:{}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"font\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105468.935,1,'entity_field_info font_values','814'),('values:font:1148','O:31:\"Drupal\\fontyourface\\Entity\\Font\":24:{s:9:\"\0*\0values\";a:21:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:4:\"1148\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"3e9d00c5-a2cd-49c9-a169-0fb4e880640f\";}s:3:\"pid\";a:1:{s:9:\"x-default\";s:16:\"fontsquirrel_api\";}s:3:\"url\";a:1:{s:9:\"x-default\";s:73:\"https://www.fontsquirrel.com/fonts/liberation-serif#LiberationSerifItalic\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:23:\"Liberation Serif Italic\";}s:10:\"css_family\";a:1:{s:9:\"x-default\";s:21:\"LiberationSerifItalic\";}s:9:\"css_style\";a:1:{s:9:\"x-default\";s:6:\"normal\";}s:10:\"css_weight\";a:1:{s:9:\"x-default\";s:3:\"400\";}s:7:\"foundry\";a:1:{s:9:\"x-default\";s:7:\"Red Hat\";}s:11:\"foundry_url\";a:1:{s:9:\"x-default\";s:44:\"https://www.fontsquirrel.com/foundry/Red-Hat\";}s:7:\"license\";a:1:{s:9:\"x-default\";s:30:\"See Font Squirrel license page\";}s:11:\"license_url\";a:1:{s:9:\"x-default\";s:56:\"https://www.fontsquirrel.com/fonts/liberation-serif#eula\";}s:8:\"designer\";a:1:{s:9:\"x-default\";N;}s:12:\"designer_url\";a:1:{s:9:\"x-default\";N;}s:8:\"metadata\";a:1:{s:9:\"x-default\";s:283:\"a:5:{s:2:\"id\";s:3:\"382\";s:4:\"path\";s:16:\"liberation-serif\";s:13:\"font_filename\";s:26:\"LiberationSerif-Italic.ttf\";s:8:\"checksum\";s:32:\"5a0acd62eb817e86bc35c8b160df2d91\";s:13:\"preview_image\";s:84:\"https://www.fontsquirrel.com//fnt_imgs/5a/0acd/62eb817e86bc35c8b160df2d91/sp-720.png\";}\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1490210124\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1490219282\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:20:\"field_classification\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"4\";}}}s:25:\"field_supported_languages\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"2\";}}}s:10:\"field_tags\";a:1:{s:9:\"x-default\";a:2:{i:0;a:1:{s:9:\"target_id\";s:3:\"162\";}i:1;a:1:{s:9:\"target_id\";s:3:\"162\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:0:\"\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:6:{s:6:\"bundle\";s:4:\"font\";s:2:\"id\";s:4:\"1148\";s:5:\"label\";s:23:\"Liberation Serif Italic\";s:4:\"uuid\";s:36:\"3e9d00c5-a2cd-49c9-a169-0fb4e880640f\";s:3:\"pid\";s:16:\"fontsquirrel_api\";s:3:\"url\";s:73:\"https://www.fontsquirrel.com/fonts/liberation-serif#LiberationSerifItalic\";}s:25:\"\0*\0translatableEntityKeys\";a:0:{}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"font\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105468.869,1,'entity_field_info font_values','814'),('values:font:1149','O:31:\"Drupal\\fontyourface\\Entity\\Font\":24:{s:9:\"\0*\0values\";a:21:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:4:\"1149\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"4da0195e-4c79-46bc-ae71-11775b55ea5e\";}s:3:\"pid\";a:1:{s:9:\"x-default\";s:16:\"fontsquirrel_api\";}s:3:\"url\";a:1:{s:9:\"x-default\";s:71:\"https://www.fontsquirrel.com/fonts/liberation-serif#LiberationSerifBold\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:21:\"Liberation Serif Bold\";}s:10:\"css_family\";a:1:{s:9:\"x-default\";s:19:\"LiberationSerifBold\";}s:9:\"css_style\";a:1:{s:9:\"x-default\";s:6:\"normal\";}s:10:\"css_weight\";a:1:{s:9:\"x-default\";s:3:\"400\";}s:7:\"foundry\";a:1:{s:9:\"x-default\";s:7:\"Red Hat\";}s:11:\"foundry_url\";a:1:{s:9:\"x-default\";s:44:\"https://www.fontsquirrel.com/foundry/Red-Hat\";}s:7:\"license\";a:1:{s:9:\"x-default\";s:30:\"See Font Squirrel license page\";}s:11:\"license_url\";a:1:{s:9:\"x-default\";s:56:\"https://www.fontsquirrel.com/fonts/liberation-serif#eula\";}s:8:\"designer\";a:1:{s:9:\"x-default\";N;}s:12:\"designer_url\";a:1:{s:9:\"x-default\";N;}s:8:\"metadata\";a:1:{s:9:\"x-default\";s:281:\"a:5:{s:2:\"id\";s:3:\"382\";s:4:\"path\";s:16:\"liberation-serif\";s:13:\"font_filename\";s:24:\"LiberationSerif-Bold.ttf\";s:8:\"checksum\";s:32:\"72bb6fe42439229170deb65d48e2309e\";s:13:\"preview_image\";s:84:\"https://www.fontsquirrel.com//fnt_imgs/72/bb6f/e42439229170deb65d48e2309e/sp-720.png\";}\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1490210124\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1490219276\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:20:\"field_classification\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"4\";}}}s:25:\"field_supported_languages\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"2\";}}}s:10:\"field_tags\";a:1:{s:9:\"x-default\";a:2:{i:0;a:1:{s:9:\"target_id\";s:3:\"162\";}i:1;a:1:{s:9:\"target_id\";s:3:\"162\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:0:\"\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:6:{s:6:\"bundle\";s:4:\"font\";s:2:\"id\";s:4:\"1149\";s:5:\"label\";s:21:\"Liberation Serif Bold\";s:4:\"uuid\";s:36:\"4da0195e-4c79-46bc-ae71-11775b55ea5e\";s:3:\"pid\";s:16:\"fontsquirrel_api\";s:3:\"url\";s:71:\"https://www.fontsquirrel.com/fonts/liberation-serif#LiberationSerifBold\";}s:25:\"\0*\0translatableEntityKeys\";a:0:{}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"font\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105468.768,1,'entity_field_info font_values','814'),('values:font:1150','O:31:\"Drupal\\fontyourface\\Entity\\Font\":24:{s:9:\"\0*\0values\";a:21:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:4:\"1150\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"b5eecb8f-b735-40bc-ab61-690a2cde00ff\";}s:3:\"pid\";a:1:{s:9:\"x-default\";s:16:\"fontsquirrel_api\";}s:3:\"url\";a:1:{s:9:\"x-default\";s:77:\"https://www.fontsquirrel.com/fonts/liberation-serif#LiberationSerifBoldItalic\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:28:\"Liberation Serif Bold Italic\";}s:10:\"css_family\";a:1:{s:9:\"x-default\";s:25:\"LiberationSerifBoldItalic\";}s:9:\"css_style\";a:1:{s:9:\"x-default\";s:6:\"normal\";}s:10:\"css_weight\";a:1:{s:9:\"x-default\";s:3:\"400\";}s:7:\"foundry\";a:1:{s:9:\"x-default\";s:7:\"Red Hat\";}s:11:\"foundry_url\";a:1:{s:9:\"x-default\";s:44:\"https://www.fontsquirrel.com/foundry/Red-Hat\";}s:7:\"license\";a:1:{s:9:\"x-default\";s:30:\"See Font Squirrel license page\";}s:11:\"license_url\";a:1:{s:9:\"x-default\";s:56:\"https://www.fontsquirrel.com/fonts/liberation-serif#eula\";}s:8:\"designer\";a:1:{s:9:\"x-default\";N;}s:12:\"designer_url\";a:1:{s:9:\"x-default\";N;}s:8:\"metadata\";a:1:{s:9:\"x-default\";s:287:\"a:5:{s:2:\"id\";s:3:\"382\";s:4:\"path\";s:16:\"liberation-serif\";s:13:\"font_filename\";s:30:\"LiberationSerif-BoldItalic.ttf\";s:8:\"checksum\";s:32:\"58902070e6b1147e7f5d95fcbff9a5c5\";s:13:\"preview_image\";s:84:\"https://www.fontsquirrel.com//fnt_imgs/58/9020/70e6b1147e7f5d95fcbff9a5c5/sp-720.png\";}\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1490210124\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1490219280\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:20:\"field_classification\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"4\";}}}s:25:\"field_supported_languages\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"2\";}}}s:10:\"field_tags\";a:1:{s:9:\"x-default\";a:2:{i:0;a:1:{s:9:\"target_id\";s:3:\"162\";}i:1;a:1:{s:9:\"target_id\";s:3:\"162\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:0:\"\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:6:{s:6:\"bundle\";s:4:\"font\";s:2:\"id\";s:4:\"1150\";s:5:\"label\";s:28:\"Liberation Serif Bold Italic\";s:4:\"uuid\";s:36:\"b5eecb8f-b735-40bc-ab61-690a2cde00ff\";s:3:\"pid\";s:16:\"fontsquirrel_api\";s:3:\"url\";s:77:\"https://www.fontsquirrel.com/fonts/liberation-serif#LiberationSerifBoldItalic\";}s:25:\"\0*\0translatableEntityKeys\";a:0:{}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"font\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105468.836,1,'entity_field_info font_values','814'),('values:font:1151','O:31:\"Drupal\\fontyourface\\Entity\\Font\":24:{s:9:\"\0*\0values\";a:21:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:4:\"1151\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"01beee63-5662-4261-b745-f6f1f5f76cc2\";}s:3:\"pid\";a:1:{s:9:\"x-default\";s:16:\"fontsquirrel_api\";}s:3:\"url\";a:1:{s:9:\"x-default\";s:72:\"https://www.fontsquirrel.com/fonts/liberation-sans#LiberationSansRegular\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:23:\"Liberation Sans Regular\";}s:10:\"css_family\";a:1:{s:9:\"x-default\";s:21:\"LiberationSansRegular\";}s:9:\"css_style\";a:1:{s:9:\"x-default\";s:6:\"normal\";}s:10:\"css_weight\";a:1:{s:9:\"x-default\";s:3:\"400\";}s:7:\"foundry\";a:1:{s:9:\"x-default\";s:7:\"Red Hat\";}s:11:\"foundry_url\";a:1:{s:9:\"x-default\";s:44:\"https://www.fontsquirrel.com/foundry/Red-Hat\";}s:7:\"license\";a:1:{s:9:\"x-default\";s:30:\"See Font Squirrel license page\";}s:11:\"license_url\";a:1:{s:9:\"x-default\";s:55:\"https://www.fontsquirrel.com/fonts/liberation-sans#eula\";}s:8:\"designer\";a:1:{s:9:\"x-default\";N;}s:12:\"designer_url\";a:1:{s:9:\"x-default\";N;}s:8:\"metadata\";a:1:{s:9:\"x-default\";s:282:\"a:5:{s:2:\"id\";s:3:\"383\";s:4:\"path\";s:15:\"liberation-sans\";s:13:\"font_filename\";s:26:\"LiberationSans-Regular.ttf\";s:8:\"checksum\";s:32:\"08c88d2877e4d05a0cf749cb6c9031b5\";s:13:\"preview_image\";s:84:\"https://www.fontsquirrel.com//fnt_imgs/08/c88d/2877e4d05a0cf749cb6c9031b5/sp-720.png\";}\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1490210124\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1490219223\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:20:\"field_classification\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:2:\"19\";}}}s:25:\"field_supported_languages\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"2\";}}}s:10:\"field_tags\";a:1:{s:9:\"x-default\";a:2:{i:0;a:1:{s:9:\"target_id\";s:3:\"162\";}i:1;a:1:{s:9:\"target_id\";s:3:\"162\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:0:\"\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:6:{s:6:\"bundle\";s:4:\"font\";s:2:\"id\";s:4:\"1151\";s:5:\"label\";s:23:\"Liberation Sans Regular\";s:4:\"uuid\";s:36:\"01beee63-5662-4261-b745-f6f1f5f76cc2\";s:3:\"pid\";s:16:\"fontsquirrel_api\";s:3:\"url\";s:72:\"https://www.fontsquirrel.com/fonts/liberation-sans#LiberationSansRegular\";}s:25:\"\0*\0translatableEntityKeys\";a:0:{}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"font\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105468.644,1,'entity_field_info font_values','814'),('values:font:1152','O:31:\"Drupal\\fontyourface\\Entity\\Font\":24:{s:9:\"\0*\0values\";a:21:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:4:\"1152\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"b9d92d5a-04d2-41cc-9758-37de36c18ef6\";}s:3:\"pid\";a:1:{s:9:\"x-default\";s:16:\"fontsquirrel_api\";}s:3:\"url\";a:1:{s:9:\"x-default\";s:71:\"https://www.fontsquirrel.com/fonts/liberation-sans#LiberationSansItalic\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:22:\"Liberation Sans Italic\";}s:10:\"css_family\";a:1:{s:9:\"x-default\";s:20:\"LiberationSansItalic\";}s:9:\"css_style\";a:1:{s:9:\"x-default\";s:6:\"normal\";}s:10:\"css_weight\";a:1:{s:9:\"x-default\";s:3:\"400\";}s:7:\"foundry\";a:1:{s:9:\"x-default\";s:7:\"Red Hat\";}s:11:\"foundry_url\";a:1:{s:9:\"x-default\";s:44:\"https://www.fontsquirrel.com/foundry/Red-Hat\";}s:7:\"license\";a:1:{s:9:\"x-default\";s:30:\"See Font Squirrel license page\";}s:11:\"license_url\";a:1:{s:9:\"x-default\";s:55:\"https://www.fontsquirrel.com/fonts/liberation-sans#eula\";}s:8:\"designer\";a:1:{s:9:\"x-default\";N;}s:12:\"designer_url\";a:1:{s:9:\"x-default\";N;}s:8:\"metadata\";a:1:{s:9:\"x-default\";s:281:\"a:5:{s:2:\"id\";s:3:\"383\";s:4:\"path\";s:15:\"liberation-sans\";s:13:\"font_filename\";s:25:\"LiberationSans-Italic.ttf\";s:8:\"checksum\";s:32:\"48a80f98cfa6180874e4729c9da6394b\";s:13:\"preview_image\";s:84:\"https://www.fontsquirrel.com//fnt_imgs/48/a80f/98cfa6180874e4729c9da6394b/sp-720.png\";}\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1490210124\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1490219232\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:20:\"field_classification\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:2:\"19\";}}}s:25:\"field_supported_languages\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"2\";}}}s:10:\"field_tags\";a:1:{s:9:\"x-default\";a:2:{i:0;a:1:{s:9:\"target_id\";s:3:\"162\";}i:1;a:1:{s:9:\"target_id\";s:3:\"162\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:0:\"\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:6:{s:6:\"bundle\";s:4:\"font\";s:2:\"id\";s:4:\"1152\";s:5:\"label\";s:22:\"Liberation Sans Italic\";s:4:\"uuid\";s:36:\"b9d92d5a-04d2-41cc-9758-37de36c18ef6\";s:3:\"pid\";s:16:\"fontsquirrel_api\";s:3:\"url\";s:71:\"https://www.fontsquirrel.com/fonts/liberation-sans#LiberationSansItalic\";}s:25:\"\0*\0translatableEntityKeys\";a:0:{}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"font\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105468.684,1,'entity_field_info font_values','814'),('values:font:1153','O:31:\"Drupal\\fontyourface\\Entity\\Font\":24:{s:9:\"\0*\0values\";a:21:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:4:\"1153\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"6917bb40-d743-4c1e-a8c6-ab6627e68594\";}s:3:\"pid\";a:1:{s:9:\"x-default\";s:16:\"fontsquirrel_api\";}s:3:\"url\";a:1:{s:9:\"x-default\";s:69:\"https://www.fontsquirrel.com/fonts/liberation-sans#LiberationSansBold\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:20:\"Liberation Sans Bold\";}s:10:\"css_family\";a:1:{s:9:\"x-default\";s:18:\"LiberationSansBold\";}s:9:\"css_style\";a:1:{s:9:\"x-default\";s:6:\"normal\";}s:10:\"css_weight\";a:1:{s:9:\"x-default\";s:3:\"400\";}s:7:\"foundry\";a:1:{s:9:\"x-default\";s:7:\"Red Hat\";}s:11:\"foundry_url\";a:1:{s:9:\"x-default\";s:44:\"https://www.fontsquirrel.com/foundry/Red-Hat\";}s:7:\"license\";a:1:{s:9:\"x-default\";s:30:\"See Font Squirrel license page\";}s:11:\"license_url\";a:1:{s:9:\"x-default\";s:55:\"https://www.fontsquirrel.com/fonts/liberation-sans#eula\";}s:8:\"designer\";a:1:{s:9:\"x-default\";N;}s:12:\"designer_url\";a:1:{s:9:\"x-default\";N;}s:8:\"metadata\";a:1:{s:9:\"x-default\";s:279:\"a:5:{s:2:\"id\";s:3:\"383\";s:4:\"path\";s:15:\"liberation-sans\";s:13:\"font_filename\";s:23:\"LiberationSans-Bold.ttf\";s:8:\"checksum\";s:32:\"0e7bb8542e721fcc1ff8d5983c19ffc2\";s:13:\"preview_image\";s:84:\"https://www.fontsquirrel.com//fnt_imgs/0e/7bb8/542e721fcc1ff8d5983c19ffc2/sp-720.png\";}\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1490210124\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1490219251\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:20:\"field_classification\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:2:\"19\";}}}s:25:\"field_supported_languages\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"2\";}}}s:10:\"field_tags\";a:1:{s:9:\"x-default\";a:2:{i:0;a:1:{s:9:\"target_id\";s:3:\"162\";}i:1;a:1:{s:9:\"target_id\";s:3:\"162\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:0:\"\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:6:{s:6:\"bundle\";s:4:\"font\";s:2:\"id\";s:4:\"1153\";s:5:\"label\";s:20:\"Liberation Sans Bold\";s:4:\"uuid\";s:36:\"6917bb40-d743-4c1e-a8c6-ab6627e68594\";s:3:\"pid\";s:16:\"fontsquirrel_api\";s:3:\"url\";s:69:\"https://www.fontsquirrel.com/fonts/liberation-sans#LiberationSansBold\";}s:25:\"\0*\0translatableEntityKeys\";a:0:{}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"font\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105468.727,1,'entity_field_info font_values','814'),('values:font:1154','O:31:\"Drupal\\fontyourface\\Entity\\Font\":24:{s:9:\"\0*\0values\";a:21:{s:3:\"fid\";a:1:{s:9:\"x-default\";s:4:\"1154\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"15f46a26-a23e-464b-b9b8-41e6fb968d77\";}s:3:\"pid\";a:1:{s:9:\"x-default\";s:16:\"fontsquirrel_api\";}s:3:\"url\";a:1:{s:9:\"x-default\";s:75:\"https://www.fontsquirrel.com/fonts/liberation-sans#LiberationSansBoldItalic\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:27:\"Liberation Sans Bold Italic\";}s:10:\"css_family\";a:1:{s:9:\"x-default\";s:24:\"LiberationSansBoldItalic\";}s:9:\"css_style\";a:1:{s:9:\"x-default\";s:6:\"normal\";}s:10:\"css_weight\";a:1:{s:9:\"x-default\";s:3:\"400\";}s:7:\"foundry\";a:1:{s:9:\"x-default\";s:7:\"Red Hat\";}s:11:\"foundry_url\";a:1:{s:9:\"x-default\";s:44:\"https://www.fontsquirrel.com/foundry/Red-Hat\";}s:7:\"license\";a:1:{s:9:\"x-default\";s:30:\"See Font Squirrel license page\";}s:11:\"license_url\";a:1:{s:9:\"x-default\";s:55:\"https://www.fontsquirrel.com/fonts/liberation-sans#eula\";}s:8:\"designer\";a:1:{s:9:\"x-default\";N;}s:12:\"designer_url\";a:1:{s:9:\"x-default\";N;}s:8:\"metadata\";a:1:{s:9:\"x-default\";s:285:\"a:5:{s:2:\"id\";s:3:\"383\";s:4:\"path\";s:15:\"liberation-sans\";s:13:\"font_filename\";s:29:\"LiberationSans-BoldItalic.ttf\";s:8:\"checksum\";s:32:\"44300f89cde3c34fde0cf2f3d74e395b\";s:13:\"preview_image\";s:84:\"https://www.fontsquirrel.com//fnt_imgs/44/300f/89cde3c34fde0cf2f3d74e395b/sp-720.png\";}\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1490210124\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1490219291\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:20:\"field_classification\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:2:\"19\";}}}s:25:\"field_supported_languages\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:1:\"2\";}}}s:10:\"field_tags\";a:1:{s:9:\"x-default\";a:2:{i:0;a:1:{s:9:\"target_id\";s:3:\"162\";}i:1;a:1:{s:9:\"target_id\";s:3:\"162\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:0:\"\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:6:{s:6:\"bundle\";s:4:\"font\";s:2:\"id\";s:4:\"1154\";s:5:\"label\";s:27:\"Liberation Sans Bold Italic\";s:4:\"uuid\";s:36:\"15f46a26-a23e-464b-b9b8-41e6fb968d77\";s:3:\"pid\";s:16:\"fontsquirrel_api\";s:3:\"url\";s:75:\"https://www.fontsquirrel.com/fonts/liberation-sans#LiberationSansBoldItalic\";}s:25:\"\0*\0translatableEntityKeys\";a:0:{}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:4:\"font\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105468.968,1,'entity_field_info font_values','814'),('values:media:5','O:32:\"Drupal\\media_entity\\Entity\\Media\":25:{s:28:\"\0*\0queued_thumbnail_download\";b:0;s:9:\"\0*\0values\";a:18:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:1:\"8\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1497453264\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"mid\";a:1:{s:9:\"x-default\";s:1:\"5\";}s:6:\"bundle\";a:1:{s:9:\"x-default\";s:5:\"image\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"68722a5f-4d30-4a7e-9702-709ed1ee2e95\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:3:\"ATM\";}s:9:\"thumbnail\";a:1:{s:9:\"x-default\";a:5:{s:9:\"target_id\";s:3:\"102\";s:3:\"alt\";s:9:\"Thumbnail\";s:5:\"title\";s:3:\"ATM\";s:5:\"width\";s:4:\"2200\";s:6:\"height\";s:4:\"2200\";}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1497453264\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497453443\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:11:\"field_image\";a:1:{s:9:\"x-default\";a:1:{i:0;a:5:{s:9:\"target_id\";s:3:\"102\";s:3:\"alt\";s:31:\"Yaffs in action: How it is used\";s:5:\"title\";s:0:\"\";s:5:\"width\";s:4:\"2200\";s:6:\"height\";s:4:\"2200\";}}}s:22:\"field_media_in_library\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:1:\"1\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"image\";s:2:\"id\";s:1:\"5\";s:8:\"revision\";s:1:\"8\";s:4:\"uuid\";s:36:\"68722a5f-4d30-4a7e-9702-709ed1ee2e95\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:3:\"ATM\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:1:\"8\";s:15:\"\0*\0entityTypeId\";s:5:\"media\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105482.731,1,'entity_field_info media_values','814'),('values:media:6','O:32:\"Drupal\\media_entity\\Entity\\Media\":25:{s:28:\"\0*\0queued_thumbnail_download\";b:0;s:9:\"\0*\0values\";a:18:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:1:\"7\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1497453339\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"mid\";a:1:{s:9:\"x-default\";s:1:\"6\";}s:6:\"bundle\";a:1:{s:9:\"x-default\";s:5:\"image\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"ef592722-4f56-473e-b3ca-474c36ffda30\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:13:\"Yaffs storage\";}s:9:\"thumbnail\";a:1:{s:9:\"x-default\";a:5:{s:9:\"target_id\";s:3:\"103\";s:3:\"alt\";s:9:\"Thumbnail\";s:5:\"title\";s:13:\"Yaffs storage\";s:5:\"width\";s:4:\"2200\";s:6:\"height\";s:4:\"2200\";}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1497453339\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497453400\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:11:\"field_image\";a:1:{s:9:\"x-default\";a:1:{i:0;a:5:{s:9:\"target_id\";s:3:\"103\";s:3:\"alt\";s:35:\"Choosing Yaffs: How it can help you\";s:5:\"title\";s:0:\"\";s:5:\"width\";s:4:\"2200\";s:6:\"height\";s:4:\"2200\";}}}s:22:\"field_media_in_library\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:1:\"1\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"image\";s:2:\"id\";s:1:\"6\";s:8:\"revision\";s:1:\"7\";s:4:\"uuid\";s:36:\"ef592722-4f56-473e-b3ca-474c36ffda30\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:13:\"Yaffs storage\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:1:\"7\";s:15:\"\0*\0entityTypeId\";s:5:\"media\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105481.875,1,'entity_field_info media_values','814'),('values:media:7','O:32:\"Drupal\\media_entity\\Entity\\Media\":25:{s:28:\"\0*\0queued_thumbnail_download\";b:0;s:9:\"\0*\0values\";a:18:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:1:\"9\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1497453467\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"mid\";a:1:{s:9:\"x-default\";s:1:\"7\";}s:6:\"bundle\";a:1:{s:9:\"x-default\";s:5:\"image\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"a5ff3427-bfa9-4f71-964c-5f6647660eb5\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"name\";a:1:{s:9:\"x-default\";s:5:\"Arrow\";}s:9:\"thumbnail\";a:1:{s:9:\"x-default\";a:5:{s:9:\"target_id\";s:3:\"104\";s:3:\"alt\";s:9:\"Thumbnail\";s:5:\"title\";s:5:\"Arrow\";s:5:\"width\";s:4:\"2200\";s:6:\"height\";s:4:\"2200\";}}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1497453467\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497453491\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:11:\"field_image\";a:1:{s:9:\"x-default\";a:1:{i:0;a:5:{s:9:\"target_id\";s:3:\"104\";s:3:\"alt\";s:29:\"Download now: Try it for free\";s:5:\"title\";s:0:\"\";s:5:\"width\";s:4:\"2200\";s:6:\"height\";s:4:\"2200\";}}}s:22:\"field_media_in_library\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:1:\"1\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"image\";s:2:\"id\";s:1:\"7\";s:8:\"revision\";s:1:\"9\";s:4:\"uuid\";s:36:\"a5ff3427-bfa9-4f71-964c-5f6647660eb5\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:5:\"Arrow\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:1:\"9\";s:15:\"\0*\0entityTypeId\";s:5:\"media\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105482.915,1,'entity_field_info media_values','814'),('values:menu_link_content:1653','O:47:\"Drupal\\menu_link_content\\Entity\\MenuLinkContent\":25:{s:15:\"\0*\0insidePlugin\";b:0;s:9:\"\0*\0values\";a:16:{s:2:\"id\";a:1:{s:9:\"x-default\";s:4:\"1653\";}s:6:\"bundle\";a:1:{s:9:\"x-default\";s:17:\"menu_link_content\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"892d2edd-e97f-4082-b21a-bf4346c43c6f\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:15:\"Legal & Cookies\";}s:11:\"description\";a:1:{s:9:\"x-default\";N;}s:9:\"menu_name\";a:1:{s:9:\"x-default\";s:6:\"footer\";}s:4:\"link\";a:1:{s:9:\"x-default\";a:3:{s:3:\"uri\";s:15:\"internal:/legal\";s:5:\"title\";s:0:\"\";s:7:\"options\";s:6:\"a:0:{}\";}}s:8:\"external\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:10:\"rediscover\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"weight\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:8:\"expanded\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:7:\"enabled\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"parent\";a:1:{s:9:\"x-default\";N;}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1495042026\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:3:{s:6:\"bundle\";s:17:\"menu_link_content\";s:2:\"id\";s:4:\"1653\";s:4:\"uuid\";s:36:\"892d2edd-e97f-4082-b21a-bf4346c43c6f\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:15:\"Legal & Cookies\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:17:\"menu_link_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105427.089,1,'entity_field_info menu_link_content_values','814'),('values:menu_link_content:1655','O:47:\"Drupal\\menu_link_content\\Entity\\MenuLinkContent\":25:{s:15:\"\0*\0insidePlugin\";b:0;s:9:\"\0*\0values\";a:16:{s:2:\"id\";a:1:{s:9:\"x-default\";s:4:\"1655\";}s:6:\"bundle\";a:1:{s:9:\"x-default\";s:17:\"menu_link_content\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"fb3865fd-25e5-4e0b-bc79-e28df71edeae\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:9:\"Documents\";}s:11:\"description\";a:1:{s:9:\"x-default\";N;}s:9:\"menu_name\";a:1:{s:9:\"x-default\";s:4:\"main\";}s:4:\"link\";a:1:{s:9:\"x-default\";a:3:{s:3:\"uri\";s:19:\"internal:/documents\";s:5:\"title\";s:0:\"\";s:7:\"options\";s:6:\"a:0:{}\";}}s:8:\"external\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:10:\"rediscover\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"weight\";a:1:{s:9:\"x-default\";s:3:\"-48\";}s:8:\"expanded\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:7:\"enabled\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"parent\";a:1:{s:9:\"x-default\";N;}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1498052257\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:3:{s:6:\"bundle\";s:17:\"menu_link_content\";s:2:\"id\";s:4:\"1655\";s:4:\"uuid\";s:36:\"fb3865fd-25e5-4e0b-bc79-e28df71edeae\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:9:\"Documents\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:17:\"menu_link_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105427.090,1,'entity_field_info menu_link_content_values','814'),('values:menu_link_content:1656','O:47:\"Drupal\\menu_link_content\\Entity\\MenuLinkContent\":25:{s:15:\"\0*\0insidePlugin\";b:0;s:9:\"\0*\0values\";a:16:{s:2:\"id\";a:1:{s:9:\"x-default\";s:4:\"1656\";}s:6:\"bundle\";a:1:{s:9:\"x-default\";s:17:\"menu_link_content\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"114a64a8-46e1-4f17-9a3e-8cc236b585a4\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:8:\"Download\";}s:11:\"description\";a:1:{s:9:\"x-default\";N;}s:9:\"menu_name\";a:1:{s:9:\"x-default\";s:4:\"main\";}s:4:\"link\";a:1:{s:9:\"x-default\";a:3:{s:3:\"uri\";s:19:\"internal:/downloads\";s:5:\"title\";s:0:\"\";s:7:\"options\";s:6:\"a:0:{}\";}}s:8:\"external\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:10:\"rediscover\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"weight\";a:1:{s:9:\"x-default\";s:3:\"-47\";}s:8:\"expanded\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:7:\"enabled\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"parent\";a:1:{s:9:\"x-default\";N;}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1497348856\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:2:\"en\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";b:1;s:13:\"\0*\0entityKeys\";a:3:{s:6:\"bundle\";s:17:\"menu_link_content\";s:2:\"id\";s:4:\"1656\";s:4:\"uuid\";s:36:\"114a64a8-46e1-4f17-9a3e-8cc236b585a4\";}s:25:\"\0*\0translatableEntityKeys\";a:3:{s:5:\"label\";a:1:{s:9:\"x-default\";s:8:\"Download\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:2:\"en\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";N;s:15:\"\0*\0entityTypeId\";s:17:\"menu_link_content\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105427.112,1,'entity_field_info menu_link_content_values','814'),('values:node:31','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:19:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"569\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1496361414\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:2:\"31\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:4:\"page\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"e5204dda-42f3-41de-8427-1614eb565595\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:5:\"Legal\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1116797232\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496361414\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:4077:\"<h3><a>Cookies</a></h3>\r\n\r\n<p>We may store information about you using cookies (files which are sent by us to your computer or other access device) which we can access when you visit our site in future. We do this to enable functions like the text resize in the right hand column. If you want to delete any cookies that are already on your computer, please refer to the instructions for your file management software to locate the file or directory that stores cookies. Our cookies will have file names starting yaffs.net. These may be found among the Privacy settings for your web browser. Information on deleting or controlling cookies is available at the excellent and informative site:www.AboutCookies.org. Please note that by deleting our cookies or disabling future cookies you may not be able to access certain areas or features of our site.</p>\r\n\r\n<h3><a>Privacy</a></h3>\r\n\r\n<p>We, like all British companies handling data on computers, are registered under the Data Protection Act, which requires us (amongst many other things) to describe what use we shall make of the data we keep, and have the authorities record and accept that use, and permits you access to the data about you (for a reasonable fee).</p>\r\n\r\n<p>In practice when we write an Invoice we do it on a computer and we keep the invoice details for a few months (and our paper copy much longer).</p>\r\n\r\n<p>We DO NOT EVER pass this information on, or sell it, to any other company. We never have done so and we expect never to do so in the future. Details of your transaction with us remain private to us and you can expect them to be seen only by our staff and possibly by our professional Auditors.</p>\r\n\r\n<p>We suffer enough from junk mail and junk email to wish not to inflict any of it on anyone else!</p>\r\n\r\n<p>We do not promise not to tell you if we have a new product we think you might be interested in. We very rarely do this, but as our product range develops and changes for the better we might at some future time want to tell you about what was both new and likely to be relevant to you.</p>\r\n\r\n<p>If you tell us not to send you any mail about new developments then we will not do so.</p>\r\n\r\n<p>We do also run Email lists for some types of product, but you only receive emails if you ask to do so. Where such a list exists you will find details on the page about that product.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h3><a>Guarantee of goods</a></h3>\r\n\r\n<p>Our policy has always been to provide all the information a buyer needs to make an informed choice among our products. If you have questions to which you do not see answers we are happy to try to answer those specific questions, if you make clear to what product they relate.</p>\r\n\r\n<p>For this reason our Guarantee is as follows:-</p>\r\n\r\n<p>Our hardware products (except Balloon boards) and instruments are guaranteed against defects in materials or workmanship for a period of twelve months from date of purchase.</p>\r\n\r\n<p>Our software products and Balloon Boards and related hardware are offered only on an \"as is\" basis without any warranty as to their suitability for any particular purpose. This may seem unfair, but it follows from the terms of the GNU Public Licence and the Licence for the hardware designs. In practice we stand behind our products, and exchange them if they prove faulty.</p>\r\n\r\n<p>In all cases the company shall not be liable for any losses, damage, costs, expenses including (without limitation) any loss of profits, any loss or damage to property and any indirect or consequential loss howsoever caused including any liability to third parties.</p>\r\n\r\n<p>This Guarantee does not alter your statutory rights, which are described in more detail, for private buyers (not businesses) within the EC, at <a href=\"http://www.dti.gov.uk/cacp/ca/policy/distanceselling/newregs.htm\">http://www.dti.gov.uk/cacp/ca/policy/distanceselling/newregs.htm</a></p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h3><a>Title to goods</a></h3>\r\n\r\n<p>Title to goods (that is, ownership) passes to the buyer only when we have received full payment for the goods.</p>\r\n\";s:7:\"summary\";s:57:\"Details of our privacy policy and our conditions of sale.\";s:6:\"format\";s:10:\"basic_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:4:\"page\";s:2:\"id\";s:2:\"31\";s:8:\"revision\";s:3:\"569\";s:4:\"uuid\";s:36:\"e5204dda-42f3-41de-8427-1614eb565595\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:5:\"Legal\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"569\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105427.291,1,'entity_field_info node_values','814'),('values:node:32','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"523\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1495660982\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:2:\"32\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:4:\"page\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"054b3ebf-6a19-4ee7-8105-b7e465e33a3a\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:20:\"Yaffs Licence Sample\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1116799730\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1495660982\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:4335:\"<p>1. Definitions:</p><p>ALEPH ONE LIMITED - An English company, Registered Number 1017960, of The Old Courthouse, 123 High Street, Bottisham, Cambridge CB25 9BA UK.</p><p>SOURCE CODE - Code owned by Aleph One Ltd and supplied under this Licence</p><p>BINARY CODE - Code which has been compiled from SOURCE CODE</p><p>LICENCE-HOLDER - The firm represented by the person who signs this Agreement. Each Licence bears the Name and Address of a particular LICENCE HOLDER.</p><p>YAFFS FILESYSTEMS - any Filesystem Images made using YAFFS SOURCE CODE or YAFFS BINARY CODE.</p><p>PRODUCT will be defined precisely at the time of negotiation of the sale of the Licence. See section 3 for the principles used in defining PRODUCT</p><p>2. The Licence:</p><p>Allows the LICENCE-HOLDER to use Aleph One\'s software to create the File System, FS and incorporate the FS in the defined Products.</p><p>Entitles the LICENCE-HOLDER to distribute BINARY CODE compiled from the SOURCE CODE provided.</p><p>Does not entail any obligation to reveal the BINARY CODE.</p><p>Prohibits the LICENCE-HOLDER from releasing the SOURCE CODE to other parties, except to the extent necessary to permit sub-contractors to work with the LICENCE-HOLDER on a project using the code. The LICENCE-HOLDER is responsible for ensuring compliance with all the terms of this Licence by any sub-contractor used.</p><p>Is only available in a non-exclusive form.</p><p>Is applicable worldwide.</p><p>Has no time limit or per-unit royalty, but a fixed price paid upon signature of the Licence Agreement.&nbsp; From 1 August 2012 the base price (for one Product) is GB£10,000. Sterling</p><p>Applies to use of the FS for one PRODUCT rather than to a company/user/person. It cannot be transferred to another PRODUCT.</p><p>Provides the SOURCE CODE and any derived FILESYSTEMS without any warranty but &gt;AS IS&lt; save that (to the best of Aleph One\'s knowledge) the use of the SOURCE CODE does not infringe the intellectual propert rights of any third party.</p><p>3. Supporting information and Terms relating to use:</p><p>Aleph One Ltd supplies:</p><p>Free access to all documentation written for YAFFS by Aleph One, at http://www.yaffs.net</p><p>Certain pieces of software, with different Licences attached to them:-</p><p>SOURCE CODE for YAFFS/direct and Bootloader, being the subject of this Licence agreement, for incorporation in a PRODUCT.</p><p>YAFFS Development Tools; images created with the tools may be incorporated into a product. The images are not affected by the licence status of the tools.&nbsp; When these Tool files are supplied in the tarball we send, they will appear with a header saying they are used under the GNU General Public Licence, version 2.&nbsp; That term applies only to the Tools; the other files in the tarball will have headers making clear they are used under a paid Licence from Aleph One Ltd.</p><p>Source code modifications and enhancements made by the LICENCE-HOLDER remain the property of LICENCE-HOLDER, but may not be redistributed or sold to third parties by LICENCE-HOLDER without the consent of Aleph One.</p><p>PRODUCT DEFINITION<br><br>A Yaffs Licence Agreement requires the definition of the Product to which it applies.&nbsp; We do this with a brief description of its purpose, and the hardware in terms of the type or family of chips used as CPU or MCU, and any internal Code Name or Product name or SKU that you use for it.<br>Later changes to the PCB which are evolutionary do not create a fresh Product, nor do changes in the size or speed of those chips or of the I/O technology.</p><p>Discussion with Aleph One about licensing further Products is required where:<br>&nbsp;&nbsp;&nbsp; A new PCB or key CPU or MCU is used, or<br>&nbsp;&nbsp;&nbsp; You sell chip designs and no hardware, or<br>&nbsp;&nbsp;&nbsp; You sell a Development Board with SDK to customers who will integrate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Yaffs into their Products, or<br>&nbsp;&nbsp;&nbsp; Changes in the brand name or badge are made, or<br>&nbsp;&nbsp;&nbsp; Your rights to the Product pass to a new owner.<br><br>Following payment for the Licence Aleph One will provide a tarball with file headers showing that the code is being used by the LICENCE-HOLDER under a paid Licence from Aleph One.</p><ul><li>Version 24 - September 2015</li></ul>\";s:7:\"summary\";s:349:\"While the Yaffs code is available free of charge under GNU General Public Licence, version 2, that entails the obligation to disclose Source Code for your application using Yaffs. An Aleph One Licence does not impose that obligation and so is attractive for proprietary projects.  This provides an example of the points we expect a Licence to cover.\";s:6:\"format\";s:9:\"full_html\";}}}s:19:\"field_document_type\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:3:\"343\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:4:\"page\";s:2:\"id\";s:2:\"32\";s:8:\"revision\";s:3:\"523\";s:4:\"uuid\";s:36:\"054b3ebf-6a19-4ee7-8105-b7e465e33a3a\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:20:\"Yaffs Licence Sample\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"523\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498107603.438,1,'entity_field_info node_values','814'),('values:node:325','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:19:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"325\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1347895942\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"4\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"325\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:4:\"page\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"9105bf07-2560-4937-b033-4a9658bb8060\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:8:\"About us\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1133366647\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1347895942\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:2362:\"<p>Yaffs is a product from Aleph One Ltd.</p><p>The company was started in 1971.&nbsp; The name Aleph One was chosen to be non-specific.&nbsp; We started selling computer products in 1984, when we were using Biofeedback instruments to control video games on Acorn BBC Microcomputers&nbsp;&nbsp; This led to the development of processor cards for Acorn computers (which had their own unique operating system) which could run the DOS and Windows operating systems. Acorn users ran Windows applications in a window!</p><p>When Acorn left the computer market in 1998 we used our knowledge of other operating systems to move into Linux and then into embedded Linux.&nbsp; We have developed the Yaffs File System specifically to provide a robust journalling file system for NAND Flash chips, and it is now widely used in high-volume products around the world.</p><h2>Visitors</h2><p>We are happy to welcome visitors, though our premises are not a shop. Please contact us to make an appointment and let us know what you would like to talk about or look at.&nbsp;</p><h2>Staff</h2><h3>Core Staff</h3><ul><li>Managing Director: Mr Laurie van Someren</li><li>Charles Manning: Chief Yaffs Architect</li><li>Jenny Hopkins: Tech Support</li></ul><h2>Our name</h2><p>Aleph is the name of the first letter of the Hebrew alphabet.</p><p>A German mathematician active in the mid-19th century, Georg Cantor (1845-1918), realised that infinities came in different sizes; more precisely he showed that the infinite set of all integers was smaller than the infinite set of all real numbers, and gave the labels Aleph Null to the smaller, and Aleph One to the larger set.</p><p>J W Dauben, writing in <em>Scientific American</em>, June 1983, 112-121, said <em>The choice </em>of Aleph as a label for transfinite sets<em> was particularly clever, as Cantor was pleased to admit, because the Hebrew Aleph was also a symbol for the number 1. Since the transfinite cardinals were themselves infinite unities, the Aleph could be taken to represent a new beginning for mathematics.</em></p><p>The concept of Alephs is the subject of a successful book by Amir D Aczel called THE MYSTERY OF THE ALEPH. Paperback about £10 in the UK, ISBN 0-7434-2299-6 (We do not sell it)</p><h3><a name=\"VAT\"></a>VAT</h3><p>We are not registered for VAT and so our prices do not include it.</p><p>&nbsp;</p>\";s:7:\"summary\";s:790:\"<p>The company was started in 1971.&nbsp; The name Aleph One was chosen to be non-specific.&nbsp; We started selling computer products in 1984.</p><p>In 1984, we were using Biofeedback instruments to control video games on Acorn BBC Microcomputers&nbsp;&nbsp; This led to the development of processor cards for Acorn computers (which had their own operating system) which could run the DOS and Windows operating systems. Acorn users ran Windows applications in a window!</p><p>When Acorn left the computer market we used our knowledge of other operating systems to move into Linux and then into embedded Linux.&nbsp; We have developed the yaffs File System specifically to provide a robust journalling file system for NAND Flash chips, and it is now widely used in high-volume products.</p>\";s:6:\"format\";s:9:\"full_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:4:\"page\";s:2:\"id\";s:3:\"325\";s:8:\"revision\";s:3:\"325\";s:4:\"uuid\";s:36:\"9105bf07-2560-4937-b033-4a9658bb8060\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:8:\"About us\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"325\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498106001.992,1,'entity_field_info node_values','814'),('values:node:344','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"576\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1496397858\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"344\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:4:\"page\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"9c59b095-c279-4a56-b447-47f2e8a61ac7\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:14:\"Yaffs Overview\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"3\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1151544621\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496397858\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:4006:\"<p>Yaffs is a filesystem designed specifically for the characteristics of NAND flash. Its well-proven primary features are:</p>\r\n\r\n<ul>\r\n	<li>Fast - typically much faster than alternatives</li>\r\n	<li>Easily ported (currently ported to GNU/Linux, WinCE, eCOS, pSOS, VxWorks, and various bare-metal systems)</li>\r\n	<li>Log structured, providing wear-levelling and making it very robust</li>\r\n	<li>Supports many flash geometries including 2K-Byte and 512-Byte page NAND flash chips</li>\r\n	<li>Supports MLC and SLC flash</li>\r\n	<li>Very fast mount - almost immediate startup</li>\r\n	<li>Typically uses less RAM than comparable File Systems</li>\r\n	<li>Flexible <a href=\"/yaffs-licensing-overview\">Licensing</a> suitable for most circumstances</li>\r\n</ul>\r\n\r\n<p>There is a great deal of information about Yaffs available on this site. This page indexes that information and provides an overview of the product.</p>\r\n\r\n<p>Yaffs is currently at version 2. Yaffs2 supports 2K-byte page flash as well as 512-byte page flash. (Yaffs1 only supports the original 512-byte page flash and is now in maintenance mode.) There is a minimal subset of the filesystem called Yaffs/Direct or the Yaffs Direct Interface which is intended to be used in embedded systems, and can be licensed for use in proprietary systems. Yaffs is available to all under the GPL for use or evaluation; full details of Git access are&nbsp;<a href=\"/download-yaffs-using-git\">available </a></p>\r\n\r\n<p>Yaffs 1 and 2 have both been deployed in numerous commercial applications, some in high volume. abd with large Flash arrays. It has been used in phones, most notably Android phones, GPS receivers, train controllers, speech synthesisers, VOIP chip development kits and other applications.</p>\r\n\r\n<p>We have a number of documents and papers describing how to use Yaffs, how to customise it for your particular hardware/system, and the original considerations and filesystem design of the two versions.</p>\r\n\r\n<h3>Backgrounder</h3>\r\n\r\n<p>The best overview information is currently this 28-slide presentation&nbsp; <a href=\"node/77\">What it Does and How it Does it</a></p>\r\n\r\n<p>A useful historical Timeline on development is<a href=\"node/43\"> here</a></p>\r\n\r\n<h3>Developer Documentation</h3>\r\n\r\n<p>Yaffs Direct Interface - <a href=\"node/349\">User Guide</a>, describing how to port Yaffs to an embedded environment or RTOS using the YDI \'personality\' module\'.</p>\r\n\r\n<p>Brief notes on <a href=\"node/40\">How to use it on GNU/Linux</a></p>\r\n\r\n<p>A <a href=\"node/348\">memory footprint analysis</a> putting some numbers on \'low memory footprint\'.</p>\r\n\r\n<p><a href=\"/yaffs-embedded-structure\"><img alt=\"YAFFS embedded structure: YAFFS embedded structure\" height=\"376\" src=\"/sites/yaffs.net/files/images/yaffs-diagram.gif\" width=\"358\" /></a><br />\r\n<strong>Yaffs embedded structure</strong></p>\r\n\r\n<h3>Papers</h3>\r\n\r\n<p></p>\r\n\r\n<p></p>\r\n\r\n<p></p>\r\n\r\n<ul>\r\n	<li><a>The </a><a href=\"node/42\">starting state of NAND MTD</a> which caused the Yaffs filesystem to be designed.</li>\r\n	<li><a href=\"node/37\">The Specifications</a> are available</li>\r\n	<li>Development Notes describing the <a href=\"node/39\">filesystem design decisions and data structures for Yaffs1</a></li>\r\n	<li><a href=\"node/38\">Yaffs2 Filesystem design</a>, covering changes from Yaffs1</li>\r\n	<li><a href=\"http://www.cis.nctu.edu.tw/~lpchang/papers/SAC_wu_sac06.pdf\">Efficient Initialization and Crash Recovery for Log-based File Systems over Flash Memory</a>, describing a mechanism for avoiding full flash scans, even when not properly shut down. This is a likely future development.</li>\r\n</ul>\r\n\r\n<h3>Mailing list</h3>\r\n\r\n<p>There is a <a href=\"http://aleph1.co.uk//mailman/listinfo/yaffs\">Yaffs mailing list</a> for the development and discussion of Yaffs. It\'s a fairly low-traffic list. You will be emailed and asked to confirm your subscription request. You can also browse and search the <a href=\"http://aleph1.co.uk/lurker/splash/index.en.html\">Yaffs mailing list archives</a>.</p>\r\n\";s:7:\"summary\";s:219:\"YAFFS is a filesystem designed specifically for the characteristics of NAND flash. This page gives an overview of the project - what is available, how it works, how to use it, developer resources, and licensing options.\";s:6:\"format\";s:9:\"full_html\";}}}s:19:\"field_document_type\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:3:\"343\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:4:\"page\";s:2:\"id\";s:3:\"344\";s:8:\"revision\";s:3:\"576\";s:4:\"uuid\";s:36:\"9c59b095-c279-4a56-b447-47f2e8a61ac7\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:14:\"Yaffs Overview\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"3\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"576\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105488.620,1,'entity_field_info node_values','814'),('values:node:353','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"577\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1496398001\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"353\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:4:\"page\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"3536fa8c-76b9-42da-b17a-c942115833e8\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:18:\"Yaffs Licence FAQs\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"4\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1179420859\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496398001\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:3103:\"<h3>Do we need a Licence for Yaffs ?</h3>\r\n\r\n<p>Yaffs is and will remain free of charge from <a href=\"/node/346\">our web site</a>.&nbsp; You can grab the latest version and work and test and play with it without charge.<br />\r\n<br />\r\nIt comes with a GNU General Public Public Licence, version 2,&nbsp; :&nbsp;<a href=\"http://www.gnu.org/licenses/gpl-2.0.html\">http://www.gnu.org/licenses/gpl-2.0.html</a>&nbsp;&nbsp; As usual with GPL work, if you sell or distribute work embodying Yaffs you also have an obligation to disclose your associated Source Code to anyone who asks.</p>\r\n\r\n<h3>What if we link other code to Yaffs ?</h3>\r\n\r\n<p>The GPL obligation is not affected by the kind of linking between Yaffs and any associated code, nor is it affected by your disclosure of modifications you make to the code and release back into the main line.&nbsp; For example if you use Yaffs under GPL with Linux you should treat it just the same as Linux code; if you want to publish a patched kernel please do.</p>\r\n\r\n<h3>We do not want to disclose Source Code</h3>\r\n\r\n<p>Because Aleph One Limited created and owns Yaffs we can sell you a Licence to use Yaffs which does not have the GNU GPLV2 obligations.&nbsp; Such a licence is always perpetual, world-wide, non-exclusive. and free of any continuing royalty obligations.&nbsp; It is paid for by a single fee at the time of signing a Licence Agreement between you and Aleph One.</p>\r\n\r\n<p>The fee depends on the number of distinct Products in which Yaffs will be used, and there is a base price of GBP £10,000.&nbsp; If more than one Product is included in the same Licence there is usually a reduction in the second fee.</p>\r\n\r\n<h3>What do we do next ?</h3>\r\n\r\n<p>Tell us some more about the product you will use Yaffs in.&nbsp; We like the Agreement to contain a brief description of the hardware involved and the part number or product name and any internal code name.&nbsp; If you want us to sign a Non-Disclosure Agreement before you give us these details, send it to us; we are used to signing them.&nbsp; We can send you a standard form if you do not have one.</p>\r\n\r\n<p>Then we will send a draft Agreement and price to you, and negotiate until we are both satisfied.&nbsp; Next we each sign and exchange copies of the Agreement and you pay us.</p>\r\n\r\n<h3>What happens when we sign a Licence ?</h3>\r\n\r\n<p>When we have both signed a Licence Agreement and you have paid us we provide you with a tarball of files whose headers show that this code is under a proprietary Licence which you have bought from us.&nbsp; You use these files to create the FS code you embed in your Products.</p>\r\n\r\n<h3>Is there more information about licensing?</h3>\r\n\r\n<p>Yes there is!</p>\r\n\r\n<ul>\r\n	<li>More detail about the <a href=\"/yaffs-licence-sample\">definition of a Product is given </a><a href=\"/node/32\">i</a><a href=\"/yaffs-licence-sample\">n our sample commercial licence</a>.&nbsp;</li>\r\n	<li>Notes which give&nbsp;<a href=\"/licences-more-background-and-detail\">further background and detail about our licensing</a>.</li>\r\n</ul>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p>&nbsp;</p>\r\n\";s:7:\"summary\";s:86:\"<p>Some questions about the commercial licence for Yaffs and how we arrive at one.</p>\";s:6:\"format\";s:10:\"basic_html\";}}}s:19:\"field_document_type\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:3:\"343\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:4:\"page\";s:2:\"id\";s:3:\"353\";s:8:\"revision\";s:3:\"577\";s:4:\"uuid\";s:36:\"3536fa8c-76b9-42da-b17a-c942115833e8\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:18:\"Yaffs Licence FAQs\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"4\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"577\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105488.778,1,'entity_field_info node_values','814'),('values:node:358','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"544\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1495717209\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"358\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:7:\"article\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"9e71c43b-20dc-4f70-97ff-278cba50ed81\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:29:\"The Internal History of YAFFS\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1183224534\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1495717209\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:291:\"The following archive documents will give you some insight into the internal history of YAFFS\r\n\r\n<ul>\r\n<li><a href=\"/node/39\">YAFFS Development notes</a>.</li>\r\n<li><a href=\"/node/42\">State of NAND MTD driver at start of project</a></li>\r\n<li><a href=\"/node/42\">YAFFS History</a></li>\r\n</ul>\";s:7:\"summary\";s:75:\"A brief look into the history of YAFFS through a look at the the internals.\";s:6:\"format\";s:9:\"full_html\";}}}s:19:\"field_document_type\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:3:\"345\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:7:\"article\";s:2:\"id\";s:3:\"358\";s:8:\"revision\";s:3:\"544\";s:4:\"uuid\";s:36:\"9e71c43b-20dc-4f70-97ff-278cba50ed81\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:29:\"The Internal History of YAFFS\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"544\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498107621.269,1,'entity_field_info node_values','814'),('values:node:359','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"579\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1496398143\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"359\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:7:\"article\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"67b9e056-f327-46fa-a7d7-72c08c645d85\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:43:\"Comparison between Yaffs (Yaffs2) and JFFS2\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1183329435\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496398143\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:1649:\"<p>On Friday 02 March 2007 10:59, Charles F Johnson wrote:</p>\r\n\r\n<p>\"I\'m trying to understand the relative merits of JFFS2 vs YAFFS2. The response on the YAFFS mailing list is quite positive as far as leading me to believe that there are actual products shipping.\"</p>\r\n\r\n<p><br />\r\nCharles Manning replied:<br />\r\nAt a technical level, it is very difficult to make X vs Y comparisons because there are many factors involved which manifest differently on different systems therefore \'your mileage will vary\'. But, as a general rule of thumb, the following might help:</p>\r\n\r\n<p>1) YAFFS uses less run-time RAM to hold its state, so YAFFS scales better than JFFS2. There are quite a few systems using large NAND arrays (the largest partitions I know of are around the 6Gbyte mark).<br />\r\n<br />\r\n2) YAFFS garbage collection is simpler and faster, typically making for better performance under hard writing.<br />\r\n<br />\r\n3) YAFFS uses a whole page per file for headers, and does not provide compression. This means that JFFS2 is probably a better fit to small partitions. The flip side is that a lot of data (eg. MP3) does not compress very well, and enabling compression really hurts performance.<br />\r\n<br />\r\n4) While YAFFS has been used on NOR, it does not fit very well (because YAFFS does not use erase suspend). Thus if you\'re using smaller NAND partitions and using JFFS2 on NOR, then a JFFS2-only solution is very appealing.<br />\r\n<br />\r\nAll the above can generally boil down to: If you\'re using less than about 64MB the pain vs gain might play in favour of JFFS2. As you increase partition size, YAFFS makes more and more sense.</p>\r\n\";s:7:\"summary\";s:124:\"If you are trying to decide between Yaffs and JFFS2 then this note will give you an idea of the relative advantages of each.\";s:6:\"format\";s:10:\"basic_html\";}}}s:19:\"field_document_type\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:3:\"345\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:7:\"article\";s:2:\"id\";s:3:\"359\";s:8:\"revision\";s:3:\"579\";s:4:\"uuid\";s:36:\"67b9e056-f327-46fa-a7d7-72c08c645d85\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:43:\"Comparison between Yaffs (Yaffs2) and JFFS2\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"579\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498107621.361,1,'entity_field_info node_values','814'),('values:node:369','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"582\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1496398411\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"369\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:4:\"page\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"c5fbdd59-19eb-46b0-b431-2fdd6706881b\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:19:\"Yaffs Porting Guide\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"5\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1240841747\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496398411\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:34178:\"<p>version 2.0</p>\r\n\r\n<p>Last changed: rrw@kynesim.co.uk, 2009-03-20<br />\r\n&nbsp;</p>\r\n\r\n<h3>Purpose</h3>\r\n\r\n<p>The purpose of this document is to describe how to bring up Yaffs2 on a board previously unsupported using the Yaffs Direct Interface, with an example using eCos on a Balloon board.</p>\r\n\r\n<p>Before we start you probably want to have the data sheet for the NAND chips you are using in front you so that you can refer to it as we go along.</p>\r\n\r\n<h3>Background and NAND Flash Properties</h3>\r\n\r\n<p>NAND flash is generally arranged in <em>pages</em> and <em>blocks</em>. A page contains a section of data bytes and then a section of out-of-band (<em>OOB</em>) data bytes. Blocks contain a number of pages .<br />\r\n<a href=\"/yaffs-embedded-structure\"><img alt=\"YAFFS porting guide diagram\" height=\"335\" src=\"/sites/yaffs.net/files/images/yaffs_porting_guide_html_2de490f8.png\" width=\"783\" /></a></p>\r\n\r\n<p>The OOB section of each page is used keep track of various things like file system state, error correction data and bad block marking.</p>\r\n\r\n<p>NAND flash is programmed (written to) and read on a largely page basis (though with some level of random access) and is erased on a block basis. That is, to erase a page, you must erase the rest of the containing block along with it.</p>\r\n\r\n<p>When programming NAND flash only 1\'s can be programmed to 0\'s, so to change a byte containing 0x00 to 0xFF it must be erased, along with the rest of the block. However subsequent programs may still be made without an erase if no 0s are to be changed to 1s, this might be useful in a scenario where subsequent data might regularly have this property.</p>\r\n\r\n<p>When manufactured NAND flash contains bad blocks, these are blocks that are not reliable and any data in them will commonly corrupt easily. These must be kept track of and the OOB data section is used to mark a bad block.</p>\r\n\r\n<p>NAND in general is prone to bit errors and for that reason the OOB data is also used to write error correction codes (ECC) so that some errors can be corrected.</p>\r\n\r\n<h3>Yaffs NAND Model</h3>\r\n\r\n<p>It is probably a good thing to detail at this point how Yaffs2 expects the NAND to behave so that you are aware of what you have to provide in the NAND driver to get YAFF running. Yaffs uses some different terminology in that it refers to a page as a <em>chunk</em>.</p>\r\n\r\n<p>Yaffs2 uses a fairly abstract model for NAND flash, this allows a lot of flexibility in the way Yaffs can be used. Yaffs is designed for NAND flash and makes the following assumptions and definitions:</p>\r\n\r\n<ul>\r\n	<li>NAND flash is arranged in blocks. Each block is the same size and comprises an integer number of chunks. Each block is treated as a single erasable item.</li>\r\n	<li>A page (chunk) equates to the allocation units of flash.</li>\r\n	<li>All accesses (reads and writes) are page (chunk) aligned.</li>\r\n	<li>When programming a NAND flash, only the zero bits in the pattern being programmed are relevant, and one bits are \"don\'t care\". For example, if a byte already contains the binary pattern 1010, then programming 1001 will result in the pattern which is the logical AND of these two patterns i.e. 1000. This is different to NOR flash.</li>\r\n</ul>\r\n\r\n<p>Yaffs identifies blocks by their block number and chunks by their chunk Id. Yaffs treats a blank (0xFF filled) block as being free or erased. Thus, the equivalent of formatting for a Yaffs partition is to erase all the blocks that are not bad.</p>\r\n\r\n<p>Therefore Yaffs minimally needs access to functions that enable it to erase blocks and to read and write on a page basis. It is also helpful to be able to read only OOB data as reading/writing a full page to only view/update OOB data will cost many serial read cycles over the bus. This is an overhead that can be avoided using the random access read and write features of some nand chips.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h2>Writing a Driver for NAND flash Chips</h2>\r\n\r\n<h3>Writing a Driver for the Samsung 628 K9F2G08U0M PCB0 on the Balloon Board (v3.01)</h3>\r\n\r\n<p>For the Balloon board the NAND chips hang off the CPLD which is in turn hooked up to the system bus. This is quite board specific and in this case reading the VHDL code reveals how to change the values on the pins of the NAND chips. You may look at the code by downloading the balloon source code (Appendix A) and looking at balloon3.vhd and Balloon_nand.vhd in balloon/vhdl/fpga/.</p>\r\n\r\n<p>It will be likely that this is significantly different on your platform and you should consult the relevant data sheets and documentation to determine how to access the NAND hardware on your board. I will present an example of the balloon board in order to give an overview of the kind of thing that is required.</p>\r\n\r\n<p>On the Balloon the CPLD routes data on the bus with certain address to the logic on the CPLD that actually controls the flash chips. They are as follows:</p>\r\n\r\n<p><code>NAND Data Bus : 0x10e00000</code> <code>NAND Control 2: 0x10e00010</code> <code>NAND Control : 0x10e00014</code></p>\r\n\r\n<p>Sending data to the \'NAND Data Bus\' address will put that data onto the I/O pins of the NAND chips. All of the nand chips are hooked up to the same pins on the CPLD so writing to the \'NAND Data Bus\' address will put the value written on the I/O pins for <em>all</em> of the available flash chips. To isolate the chip you want to work with using the chip enable pin on each flash chip.</p>\r\n\r\n<p>This is done by writing to the \'NAND Control\' (0x10e00014) address. When writing to \'NAND control\', the CPLD takes the data value on the bus and routes each bit to a different wire. This bit field is structured as follows:</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<table>\r\n	<colgroup>\r\n		<col />\r\n		<col />\r\n	</colgroup>\r\n	<tbody>\r\n		<tr>\r\n			<td><em>Pin Attached To</em></td>\r\n			<td><em>Bit in NAND Control value</em></td>\r\n		</tr>\r\n		<tr>\r\n			<td>CLE (Control Latch Enable)</td>\r\n			<td>0</td>\r\n		</tr>\r\n		<tr>\r\n			<td>ALE (Address Latch Enable)</td>\r\n			<td>1</td>\r\n		</tr>\r\n		<tr>\r\n			<td>nCE0 (not Chip Enable for chip 0)</td>\r\n			<td>2</td>\r\n		</tr>\r\n		<tr>\r\n			<td>nCE1 (for chip 1)</td>\r\n			<td>3</td>\r\n		</tr>\r\n		<tr>\r\n			<td>nCE2 (for chip 2)</td>\r\n			<td>4</td>\r\n		</tr>\r\n		<tr>\r\n			<td>nCE3 (for chip 3)</td>\r\n			<td>5</td>\r\n		</tr>\r\n		<tr>\r\n			<td>nSE (not Chip Enable for chip 0)</td>\r\n			<td>6</td>\r\n		</tr>\r\n		<tr>\r\n			<td>nWP (not Write Protect)</td>\r\n			<td>7</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p>So for example bit 1 on the data lines is put onto the ALE pin on the physical chip. Bits prefixed with \'n\' are active low, for example chip 0 is selected when nCE0 is low and nCE1-3 are high.</p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p>So writing to \'NAND Control\' we can change the values of the pins on the flash. Again, CLE, ALE, nSE and nWP change the value of the corresponding pin on all the flash chips available, nCE[0-3] will select the chip you are using.</p>\r\n\r\n<p>Finally, NAND flash typically comes in couple of flavours, 8 bit wide (x8) and 16 bit wide (x16). This means that x8 chips have 8 I/O pins and x16 have 16. The logic on the CPLD on the Balloon can handle both if you tell it which you are currently dealing with. Writing to \'NAND Control 2\' a value of 1 puts the CPLD logic for the NAND chips into x8 mode and 0 into x16 mode. I will assume for the rest of this document that there are only x8 chips connected to the balloon but it should be fairly trivial to extend it to support both.</p>\r\n\r\n<h3>Using the Flash Chips</h3>\r\n\r\n<p>The flash chips we\'re using have a number of commands, each triggered by a sequence of one or two command codes. You will want to refer to the data sheets for precise details of these functions, but I will briefly describe some of them in this document. The command set that we have for the particular chip we\'re using is table 1 on page 7 of the data sheet.</p>\r\n\r\n<p>To input a command there is generally one or two command input cycles. For two cycle commands there is generally an initial command followed by some data needed to complete the command then another command cycle to notify that the relevant data has been input and to start execution. For example for read operations the command 0x00 is latched in followed by some address input cycles followed by the command 0x30 to start the operation. With this in mind I will now describe how to input commands, the \'Command Latch Cycle\'.</p>\r\n\r\n<p>Note that for this section I have assumed that the bus is sufficiently slow that the set-up and hold times are not an issue, if you have a fast bus then you may have to wait for a small amount of time (refer to the data sheet) after changing values on the pins (by writing to the correct address) so that set-up and hold times are not violated.</p>\r\n\r\n<h3>Command Latch Cycle</h3>\r\n\r\n<p>For the command latch cycle you need to first select a chip by setting the relevant nCE low and then you need to set the CLE bit high, that means writing to the \'NAND Control\' address. ALE must also be low and should be set at the same time as CLE. It is then a case of putting the command value onto the I/O pins by writing to the \'NAND Data Bus\' address the value of the command you want. This will then latch in the command, afterwards you will need to clear the CLE bit again.</p>\r\n\r\n<p>You will also notice from looking at the data sheet that something needs to be done with the nWE (not <strong>w</strong>rite <strong>e</strong>nable) pin (specifically it should be low while latching in the command), but that I have yet to describe a mechanism for changing its value. This is because it is dealt with by the logic in the CPLD and whenever data is sent to the data address the CPLD will toggle nWE appropriately. (This is also true of nRE (not <strong>r</strong>ead <strong>e</strong>nable) when reading). This process is implemented in the nand_chip_select and the send_command functions (flash.c).</p>\r\n\r\n<h3>Address Latch Cycle and Addressing</h3>\r\n\r\n<p>The process for the Address Latch Cycle is similar to that for command latching (with the sense of ALE and CLE reversed) and can be looked at in the data sheet and is implemented in send_address in flash.c. The addressing is done by row and column. There are 5 address cycles on the flash chips we\'re looking at. The first cycle contains bits 0-7 of the column address, the second bits 8-11 with the remaining bits of the byte to be sent low. The row address is over 3 more cycles in a similar fashion.</p>\r\n\r\n<p>You may wish to chose to address the individual bytes of the chip with the OOB data not directly addressable. This has enabled me to lump several chips into the same address space and select the correct chip based on the address. Addresses then need to be converted to row and column. You should also check that they are page/block aligned in the relevant places if that\'s what your functions expect. It needn\'t be done this way any you could use page numbers instead of bytes just as easily.</p>\r\n\r\n<p><br />\r\n<a href=\"/yaffs-embedded-structure\"><img alt=\"YAFFS porting guide diagram 2\" height=\"209\" src=\"sites/yaffs.net/files/images/yaffs_porting_guide_html_m11b1f893.png\" width=\"654\" /></a></p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<p>The \'row\' is essentially the page index and the \'column\' is the index into to that page, so if you wanted to read from the start of page 213 you would send 0 for the column and 213 for the row. Conversely if you wanted just the OOB bytes from the same page you would send a column value of 2048 (given a page size of 2048+64 bytes).</p>\r\n\r\n<p><br />\r\n<a href=\"/yaffs-embedded-structure\"><img alt=\"YAFFS porting guide diagram 3\" height=\"271\" src=\"sites/yaffs.net/files/images/yaffs_porting_guide_html_m4650262f.png\" width=\"347\" /></a></p>\r\n\r\n<p>&nbsp;</p>\r\n\r\n<h3>Finding Chip information</h3>\r\n\r\n<p>You will then need to find out which chips are active (e.g. on the balloon there are 4 possible chips, not all of which will exist) and what type of chips they are. For this there is the \'Read ID\' operation. This operation is implemented in the read_ids function in flash.c. The result of the operation gives the manufacturer and device code of the chip and information about the chip (page size, block size, oob size etc). To find which chips are available, loop through the possible chips and start a Read ID command on each of them, if the expected data is returned then there is a chip at that location.</p>\r\n\r\n<p>The operation is started by sending the command 0x90 and then one address cycle of 0x00. There are then 5 read cycles which give you data about the device. A description of how to unpack this information from the returned bytes is located on page 32 of the data sheet for the chip described here.</p>\r\n\r\n<p>This then gives you how many chips you have and what layout the data in them has.</p>\r\n\r\n<h3>Bad Block Checking</h3>\r\n\r\n<p>Contained within a nand chip are blocks that the manufacturer will not guarantee the reliability of (this is to increase yield in manufacturing) and so bad blocks must be kept track of. The Samsung chips come with the first byte (or word for x16) of the first and second page of each bad block not programmed as 0xFF.</p>\r\n\r\n<p>This bad block marking should be maintained and should be added to in the same way when a bad block is is discovered. Yaffs will expect you to provide a function it can call to mark a particular block as bad when yaffs decides it is necessary.</p>\r\n\r\n<p>Yaffs keeps track of bad blocks itself so that the driver doesn\'t need to worry about masking out bad blocks.</p>\r\n\r\n<h3>Erasing a Block</h3>\r\n\r\n<p>An example of this operation is given in nand_erase_block in flash.c. If you are addressing the nand by bytes then you must first check that the address is aligned to the start of a block and then convert the address into a block number. If there is more than one chip this will involve working out which chip the address refers to and then selecting the correct chip. This can be seen in the select_chip function in flash.c. You must then send the first command cycle for the erase operation before sending 3 cycles of address and then finally the last command cycle.</p>\r\n\r\n<p>For the erase operation the 3 address cycles are different than for the read/write operations. Only address bits A18 to A29 is valid (for x8) while A12 to A17 is ignored. In terms of the ordinary 5 cycles address input you only need to deal with the last 3 cycles and of those only the highest 2 bits of the 3rd cycle are used and the full 4th and 5th cycle are used.</p>\r\n\r\n<p>Once the operation has been started the program can check the progress of the operation by sending a command of 70h. Each subsequent read will contain the read status. The driver should wait until the read is complete (by the read status operation), the read status operation also contains information about whether the erase failed and this information should be returned from the function doing the erase.</p>\r\n\r\n<h3>Reading a Page</h3>\r\n\r\n<p>Reading a page is performed by first selecting the correct chip and then converting the address to a row and column number. You can then sending the first command cycle for the read operation followed by 5 address cycles as described in the previous sections. The second command cycle then starts the read operation. The driver must then wait for the data to be retrieved into the data registers on the NAND before they can be read out over the bus. For the example chip this is 25us, consult the data sheet as this may differ. The data can then be read out sequentially byte by byte until all the data needed is obtained.</p>\r\n\r\n<h3>Writing a Page</h3>\r\n\r\n<p>Page program operations are performed by first selecting the correct chip converting the address to row and column numbers. The page program operation is initiated by the relevant fist command latch cycle (command 0x80) followed by an address latch cycle (as for read), serial data loading and then the second command latch cycle (command 0x10).</p>\r\n\r\n<p>The serial data loading is done by serially writing data to the I/O pins. Up to 2112 bytes (x8) can be loaded into the data registers. Once the second command cycle is sent the program is initiated and there is then a programming period where the loaded data is programmed into the appropriate cell. The driver should wait for this to complete by issuing a read status command (0x70) and monitoring the R/nB (ready / not busy) bit. The R/nB flag is on I/O pin 6 and can be checked by repeatedly reading from the \'NAND Data Bus\' address. Once the operation is complete the Write Status Bit (I/O 0 ) may be checked to confirm that the operation was successful.</p>\r\n\r\n<h2>Yaffs</h2>\r\n\r\n<h3>How To Use Yaffs</h3>\r\n\r\n<h3>Checking Out From Git</h3>\r\n\r\n<p>The first thing to do is to obtain the source code for Yaffs. This can be done from CVS, details of the process can be found at <a href=\"http://www.yaffs.net/download-yaffs-using-git\">http://www.yaffs.net/download-yaffs-using-git</a>.</p>\r\n\r\n<p>The following command will checkout the latest Git version using public read-only access, if you are using bash.</p>\r\n\r\n<p><code>$&nbsp;</code>git clone git://www.aleph1.co.uk/yaffs2&nbsp;</p>\r\n\r\n<h3>Making Some Tweaks to the Source Code</h3>\r\n\r\n<p>As of the latest version from CVS in January 2009, you will need to make a small number of changes before you can compile the source code without errors and warnings. There is a patch file included with this document.</p>\r\n\r\n<p>You will need to provide a definition of loff_t (in yaffs2/direct/ydirectenv.h) this is for holding the file size in bytes, you should make it big enough to hold the largest file size you wish to support. Unsigned long is probably a good place to start. You will need to edit yaffsfs.c to change a #if to a #ifdef. Then if you have the relevant warnings and -Werror switched on you will need to correct a couple of printf format strings to get the type right (changing a few \'%d\' to \'%ld\').</p>\r\n\r\n<p><code>change yaffs/ydirectenv.h </code></p>\r\n\r\n<p><code>+ typedef unsigned long loff_t; </code></p>\r\n\r\n<p><code>change yaffs2/direct/yaffsfs.c ~line 1117 </code></p>\r\n\r\n<p><code>- #if CONFIG_YAFFS_WINCE </code></p>\r\n\r\n<p><code>+ #ifdef CONFIG_YAFFS_WINCE</code></p>\r\n\r\n<h3>Relevant Files to the Direct Interface</h3>\r\n\r\n<p>There are quite a few files that get checked out, not all of which you will need to get going with the yaffs direct interface. The ones you will actually need are listed bellow, you do not need to compile the rest in.</p>\r\n\r\n<p><code><code>direct/yaffsfs.c </code></code></p>\r\n\r\n<p><code><code>yaffs_guts.c </code></code></p>\r\n\r\n<p><code><code>direct/yaffscfg.c </code></code></p>\r\n\r\n<p><code><code>yaffs_nand.c </code></code></p>\r\n\r\n<p><code><code>yaffs_tagsvalidity.c </code></code></p>\r\n\r\n<p><code><code>yaffs_checkptrw.c </code></code></p>\r\n\r\n<p><code><code>yaffs_qsort.c </code></code></p>\r\n\r\n<p><code><code>yaffs_tagscompat.c </code></code></p>\r\n\r\n<p><code><code>yaffs_ecc.c </code></code></p>\r\n\r\n<p><code><code>yaffs_packedtags2.c</code></code></p>\r\n\r\n<h3>Some Relevant Preprocessor Flags</h3>\r\n\r\n<p>There are many different configuration options for yaffs, here are a few that you should be aware of for using the yaffs direct interface.</p>\r\n\r\n<ul>\r\n	<li>CONFIG_YAFFS_DIRECT - Tell yaffs to use the direct interface.</li>\r\n	<li>CONFIG_YAFFS_YAFFS2 - Tell yaffs we want to use yaffs2</li>\r\n	<li>CONFIG_YAFFS_PROVIDE_DEFS - provides some definitions for file types and #includes linux/types.h, linux/fs.h, linux/stat.h (see yaffs2/devextras.h).</li>\r\n	<li>CONFIG_YAFFSFS_PROVIDE_VALUES - This may be used so that you can customise error values and constants like O_RDONLY to match the underlying system values, if itis not defined then it includes errno.h,sys/stat.h and fcntl.h (see yaffs2/direct/yaffsfs.h).</li>\r\n</ul>\r\n\r\n<p>Specify these options when compiling yaffs, i.e. -DCONFIG_YAFFS_DIRECT etc.</p>\r\n\r\n<h3>Configuring</h3>\r\n\r\n<p>You will then need to provide yaffs with configuration information. This includes details about the nand flash you are using and also tells yaffs which functions to call when when it wants to read/write/erase parts of the flash, these functions will form the bridge between yaffs and the underlying hardware driver. This customisation is done in yaffscfg.h. Within yaffscfg.h you will need to provide a number of operating-system-like functions and a function to initialise yaffs. For example providing functions for malloc and free. Here is a breakdown of those functions that need to be implemented.</p>\r\n\r\n<h3>Operating System Functions</h3>\r\n\r\n<p><code><code>void yaffsfs_SetError(int err); </code> </code></p>\r\n\r\n<p>Report system errors, for example using errno if it exists.</p>\r\n\r\n<p><code><code>void *yaffs_malloc(size_t size);</code> <code>void yaffs_free(void *ptr);</code> </code></p>\r\n\r\n<p>As for the standard malloc and free functions, if they already exist on your system then you can just shim them.</p>\r\n\r\n<p><code><code>void yaffsfs_LocalInitialisation(void);</code> <code>void yaffsfs_Lock(void);</code> <code>void yaffsfs_Unlock(void);</code> </code></p>\r\n\r\n<p>Use yaffsfs_LocalInitalisation to initialise \"Real Time Operating System\" state, if the system is multi-threaded then it should initialise a semaphore/mutex for use by lock and unlock. Lock/unlock should use the semaphore set up in LocalInitialisation to lock yaffs from multi-threaded access.</p>\r\n\r\n<p><code><code>__u32 yaffsfs_CurrentTime(void);</code> </code></p>\r\n\r\n<p>This can be any time increment of use to the system. If this is not required, then it is fine to just use a function that returns zero.</p>\r\n\r\n<h3>Yaffs Startup Function</h3>\r\n\r\n<p><code><code>int yaffs_StartUp(void); </code> </code></p>\r\n\r\n<p><code><code>Return value: YAFFS_OK or YAFFS_FAIL</code> </code></p>\r\n\r\n<p>This functions should be used to provide yaffs with many details about the properties of the underlying nand device. Within this function you will need to set up a \'yaffs_Device\' (yaffs_guts.h) and a \'yaffsfs_DeviceConfiguration\' (direct/yaffscfg.h). How to set up a yaffs device will follow in the next section. Once you have set up the required yaffs_Device structures you should call yaffs_initialise (yaffs_guts.h) with a pointer to a null terminated array of yaffs_DeviceConfiguration structures. A yaffs_DeviceConfiguration structure contains a pointer to a yaffs_Device and the \'mount point\' string (prefix) that that device corresponds to.</p>\r\n\r\n<h3>Yaffs Devices</h3>\r\n\r\n<p>A yaffs device is a logical device that represents part of or a whole physical device. You might think of it as a \'partition\' on the nand. For example, it might cover the whole of the nand device or perhaps only claim half, with another yaffs_Device claiming the other half. It may also be used so that you can use a device other than a flash device (e.g. RAM) for testing purposes.</p>\r\n\r\n<p>A yaffs_Device keeps track of the start and end block, so you may have more than one yaffs_Device corresponding to the same physical device by altering the start and end block of the yaffs device.</p>\r\n\r\n<p>The fields on the yaffs_Device struct that you need to set up yourself are listed below, all other fields are setup automatically by yaffs.</p>\r\n\r\n<p><code><code>int nDataBytesPerChunk</code> </code></p>\r\n\r\n<p>As the name suggests this is the number of bytes per chunk, remembering that in yaffs terminology a page is referred to as a chunk, this is then the number of bytes per page. This is the number of data bytes, that is the number of bytes excluding the OOB byte data. E.g. if a page is 2048byte + 64bytes of OOB then set nDataBytesPerChunk to 2048.</p>\r\n\r\n<p><code><code>int nChunksPerBlock </code> </code></p>\r\n\r\n<p>Straightforwardly the number of chunks (pages on the nand) in each block on the physical nand device. Must be at least 2.</p>\r\n\r\n<p><code><code>int spareBytesPerChunk</code></code><br />\r\nThis is the size of the spare area, i.e. the number of OOB bytes per chunk (page)<code>. </code></p>\r\n\r\n<p><code><code>int startBlock</code> </code></p>\r\n\r\n<p>The block number (not the address in bytes) on the chip of the first block of this logical yaffs_Device. Beware, yaffs needs the first block to be free so you should not set this to 0, if it is then yaffs will add on one to it itself and also add on one to the end block which could be an issue if you wanted your device to start at block 0 and finish at the last block which might mean yaffs trying to write to a non-existent block.</p>\r\n\r\n<p><code><code>int endBlock</code> </code></p>\r\n\r\n<p>The block number on the chip of the last block for this logical yaffs_Device. If startBlock == 0 then yaffs will use endBlock+1. Must be at least startBlock + nReservedBlocks + 2.</p>\r\n\r\n<p><code><code>int nReservedBlocks</code> </code></p>\r\n\r\n<p>This is then number of erasable blocks that Yaffs must keep in reserve for garbage collection and to cover for block failures. This must be a minimum of 2, but 5 or so is better. If you are using a medium that is not expected to fail (eg. RAM for a RAM disk, or a host file system emulation then 2 is OK).</p>\r\n\r\n<p><code><code>int nShortOpCaches</code> </code></p>\r\n\r\n<p>This configures the number of entries in the Yaffs cache for this device. A value of zero defeats the cache. A value of 10 to 20 is recommended for most systems. Cannon be any bigger than YAFFS_MAX_SHORT_OP_CACHES.</p>\r\n\r\n<p><code><code>int useNANDECC</code> </code></p>\r\n\r\n<p>This is a flag that tells yaffs whether it should be doing ECC calculations or if it should be left to the driver.</p>\r\n\r\n<p><code><code>void *genericDevice</code> </code></p>\r\n\r\n<p>This is a pointer which should point to any data that the underlying nand driver will need to know to write and read from the physical device.</p>\r\n\r\n<p><code><code>int isYaffs2</code> </code></p>\r\n\r\n<p>Are we using Yaffs2? We only deal with Yaffs2 in this document.</p>\r\n\r\n<p><code><code>int inbandTags</code> </code></p>\r\n\r\n<p>Is there an OOB section? If not then this should be true. Only relevant to Yaffs2.</p>\r\n\r\n<p><code><code>_u32 totalBytesPerChunk</code> </code></p>\r\n\r\n<p>Possibly a misleading name, it should be equal to nDataBytesPerChunk not nDataBytesPerChunk + spareBytesPerChunk as the name might suggest. If inbandTags is true then yaffs sets nDataBytesPerChunk such that there is enough space for the data yaffs would normally store in the spare area.</p>\r\n\r\n<p><code><code>write/readChunkWithTagsFromNAND, markNANDBlockBad, queryNANDBlock</code> </code></p>\r\n\r\n<p>These are all pointers to functions that you shall provide to provide Yaffs with a method of writing/reading etc from the NAND.</p>\r\n\r\n<h3>NAND access functions</h3>\r\n\r\n<p>If you are using Yaffs2 you need to provide pointers to functions that Yaffs can call to write and read from the nand. Example implementations of these function can be seen in yaffs_mtdif.c, these are the functions written to do the same job for the linux mtd layer and provides the write and read functions. The following functions return YAFFS_OK on success and YAFFS_FAIL on failure.</p>\r\n\r\n<p><code><code>int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct * dev,</code> <code>int chunkInNAND, const __u8 * data,</code> <code>const yaffs_ExtendedTags * tags);</code> <code>dev: yaffs_Device to write to.</code> <code>chunkInNAND: Which page to write the chunk to.</code> <code>Data: Pointer to the data to write</code> <code>tags: Unpacked OOB data.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code> </code></p>\r\n\r\n<p>This function is to write pages (chunks) to the nand. In this function you will probably want to first retrive any useful data that you put in dev-&gt;genericDevice (in the yaffs_StartUp function) and use it to call the function you wrote previously to write data to the nand. For yaffs2 data and tags should never be NULL. chunkInNand is the page number of the page to write to, not an address so it will need converting if that\'s what your underling functions to write to the nand expect.</p>\r\n\r\n<p>You will then need to pack the tags into a yaffs_PackedTags2 structure, this takes out the all relevant details from the yaffs_ExtendedTags tags structure and calculates ECC data on it before placing them in the packedtags2 structure. This structure is the OOB data you will want to write out to the nands spare area.</p>\r\n\r\n<p>How you write these out to the OOB data depends on your architecture, nand chips and therefore how bad block marking is done. If for example the first byte is used for bad block marking then simply writing the tags out after the first byte is acceptable. The ECC data in packed tags only covers error correction and detection for the tags in the OOB data, if you want ECC on the data then you must do that yourself.</p>\r\n\r\n<p>To perform ECC checks to the data bytes you may use the yaffs_ECCCalculate function which calculates ECC data for 256 byte sections of data. This function produces 3 bytes of ECC data per 256 bytes. Therefore for 2048 bytes of data in each page you would need (2048/256) * 3 = 8 * 3 = 24 extra bytes of ECC data. This can be written out after the bad block byte and packed tags data.<br />\r\n&nbsp;</p>\r\n\r\n<p><code><code>int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct * dev,</code> <code>int chunkInNAND, __u8 * data,</code> <code>yaffs_ExtendedTags * tags);</code> <code>dev: The yaffs_Device to read from.</code> <code>chunkInNAND: Which page to read from.</code> <code>Data: Pointer to a buffer to read data to.</code> <code>tags: Pointer to a buffer to unpacked OOB data into.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code> </code></p>\r\n\r\n<p>This function should do the opposite to the previous function. Firstly, read in the data and OOB bytes. Secondly place the data bytes in the area pointed to by data, then unpack the OOB bytes into into the pointer to tags using yaffs_UnpackTags2.</p>\r\n\r\n<p>Once the tags have been unpacked you should then recalculate the ECC data on the data bytes you just read back, just as you did for the write operation. Then use the recalculated ECC and the ECC data read out of the OOB bytes with yaffs_ECCCorrect to correct the data.</p>\r\n\r\n<p>Depending on the return value from yaffs_ECCCorrect you should set tags-&gt;eccResult to reflect whether anything was corrected or the correction failed. yaffs_UnpackTags2 also sets tags-&gt;eccResult so you should only update it if the result of the data correction is worse than is already there. i.e. if after the tags are unpacked and eccResult is YAFFS_ECC_RESULT_FIXED and ECC correction on the data read back resulted in no errors then you should leave unpackedtags2 and YAFFS_ECC_RESULT_FIXED and not set it to YAFFS_ECC_RESULT_NO_ERROR.</p>\r\n\r\n<p><code><code>int (*markNANDBlockBad) (struct yaffs_DeviceStruct * dev, int blockNo);</code> <code>dev: yaffs_Device to write to.</code> <code>blockNo: Which block to mark.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code></code></p>\r\n\r\n<p>This should mark the block bad. This probably means reading the OOB data and changing the relevant byte that marks the bad block, and writing the OOB data back.</p>\r\n\r\n<p><code><code>int (*queryNANDBlock) (struct yaffs_DeviceStruct * dev, int blockNo,</code> <code>yaffs_BlockState * state, __u32 *sequenceNumber);</code> <code>dev: The yaffs_Device to write to.</code> <code>blockNo: Which block to mark.</code> <code>state: Upon returning this should be set to the relevant state of this particular block.</code> <code>Sequence number: The Sequence number of this block. 0 if the block is unused.</code> <code>Return: YAFFS_OK / YAFFS_FAIL</code> </code></p>\r\n\r\n<p>This should check whether or not the block is valid.</p>\r\n\r\n<p>If the bad block marker is set in the OOB then *state should be set to YAFFS_BLOCK_STATE_DEAD *sequenceNumber set to 0, and return YAFFS_FAIL.</p>\r\n\r\n<p>If the block is not bad then the tags should be unpacked. After the tags are unpacked, and it is found that chunk is used (see tags.chunkUsed) *sequenceNumber should be set to tags.sequenceNumber and *state to YAFFS_BLOCK_STATE_NEEDS_SCANNING, otherwise if the block is not used then *sequenceNumber should be 0 and *state should be set to YAFFS_BLOCK_STATE_EMPTY.</p>\r\n\r\n<h3>Application Interface</h3>\r\n\r\n<p>The yaffs provides a number of functions for applications to interface with it. These are mostly the same as the standard clib open/close etc prefixed with yaffs_ eg yaffs_open. These functions are defined in direct/yaffsfs.h.</p>\r\n\r\n<p>To initialise yaffs so that reading and writing can be done, you must call yaffs mount for each yaffs device you would like to use, e.g. yaffs_mount(\"/boot\"). This could be done at system boot if there is an operating system present so that the application need to worry about this. You will also need to call yaffs_unmount when you have finished so that yaffs may write any state it needs to to disk.</p>\r\n\r\n<p>If there is already an application interface for reading and writing files you may shim the relevant function calls with the related operating system calls.</p>\r\n\r\n<p>E.g. simply doing #define open(path, oflag, mode) yaffs_open(path, oflag, mode)</p>\r\n\r\n<p>Or having something more complex to provide redirection functions if there is more than one file system present.</p>\r\n\r\n<p><code><code>For example: int open(const char *path,...)<br />\r\n{<br />\r\n//Determine which file system is being used </code> <code>if(it_is_a_yaffs_path(path)) {</code> <code> return yaffs_open(...);<br />\r\n} else {<br />\r\n// Do something else<br />\r\n}<br />\r\n}</code></code></p>\r\n\r\n<h2>Appendices</h2>\r\n\r\n<h3>Appendix A - Accessing the Balloon Source Code</h3>\r\n\r\n<p>The latest source code for the balloon board can be checked out from SVN. There is different code for different balloon versions. Details of getting the source and setting up tool chains is decribed in the following page <a href=\"http://www.balloonboard.org/software.html\">http://www.balloonboard.org/software.html</a>. If you just want to take a look at the latest mainline code then the following will give you what you want.</p>\r\n\r\n<p>svn checkout svn://balloonboard.org/balloon/trunk/</p>\r\n\r\n<p>&nbsp;</p>\r\n\";s:7:\"summary\";s:181:\"The purpose of this document is to describe how to bring up Yaffs2 on a board previously unsupported using the Yaffs Direct Interface, with an example using eCos on a Balloon board.\";s:6:\"format\";s:10:\"basic_html\";}}}s:19:\"field_document_type\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:3:\"345\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:4:\"page\";s:2:\"id\";s:3:\"369\";s:8:\"revision\";s:3:\"582\";s:4:\"uuid\";s:36:\"c5fbdd59-19eb-46b0-b431-2fdd6706881b\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:19:\"Yaffs Porting Guide\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"5\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"582\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498107621.436,1,'entity_field_info node_values','814'),('values:node:38','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"571\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1496365861\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:2:\"38\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:4:\"page\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"10044baf-840c-421b-9888-e789cd7d53e3\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:21:\"Yaffs 2 Specification\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"3\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1116848038\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496365861\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:10894:\"<h2>Summary</h2>\r\n\r\n<p>The original motivation for Yaffs 2 was to add support for the new NAND with 2kB pages instead of 512-byte pages and strictly sequential page writing order.</p>\r\n\r\n<p>To achieve this, a new design is used which also realises the following benefits:</p>\r\n\r\n<ul>\r\n	<li>\r\n	<p>Zero page rewrites means faster operation. (Yaffs1 uses a single rewrite in the spare area to delete a page).</p>\r\n	</li>\r\n	<li>\r\n	<p>Ability to exploit simultaneous page programming on some chips.</p>\r\n	</li>\r\n	<li>\r\n	<p>Improves performance relative to Yaffs1 speed(write:1.5x to 5x, delete: 4x, garbage collection: 2x)</p>\r\n	</li>\r\n	<li>\r\n	<p>Lower RAM footprint (approx. 25% to 50% of Yaffs1).</p>\r\n	</li>\r\n	<li>\r\n	<p>Can support Toshiba/Sandisk MLC parts.</p>\r\n	</li>\r\n</ul>\r\n\r\n<p>Most of Yaffs1 and Yaffs2 code is common, therefore the code will likely be kept common with Yaffs1 vs Yaffs2 being run-time selected.</p>\r\n\r\n<h4>Method</h4>\r\n\r\n<p>The main philosophical difference between Yaffs&nbsp;and Yaffs2 is how discarded status is tracked. Since we can\'t do any re-writing, we can\'t use the \"discarded\" flags in Yaffs2.</p>\r\n\r\n<p>Instead Yaffs2 uses two mechanisms to resolve data state.</p>\r\n\r\n<ul>\r\n	<li>\r\n	<p>Yaffs2 chunks have more tag information, including a block sequence Id. From that we can determine the chunk sequence Id since the chunks are allocated sequentially in a block. Thus we always know the patch order for all chunks in the system.</p>\r\n	</li>\r\n	<li>\r\n	<p>The above helps us track stale -vs- fresh data, but does not help determine when a file/object is deleted. Deletion is achieved by moving the object to the \"unlinked\" directory. We also keep track of the number of chunks (both stale and current) in the system for each object. While this number indicates that there are still chunks associated with this object we keep the deletion record. When the last trace of the object has been really erased from NAND, we can forget about the deletion record too.</p>\r\n	</li>\r\n	<li>\r\n	<p>Since there is no deletion, a resize (shrinking) of a file will still have valid data chunks past the end of file on the NAND. However, we write a new ObjectHeader at the time of the resize, therefore this shows the shrunken file size.</p>\r\n	</li>\r\n</ul>\r\n\r\n<p>This changes erasure slightly:</p>\r\n\r\n<ul>\r\n	<li>\r\n	<p>During garbage collection we can\'t just look at chunk state flags, instead we must read the tags of each chunk to determine which object\'s chunk count we must decrement. This step must also be performed when a block is erased (as part of deletion).</p>\r\n	</li>\r\n</ul>\r\n\r\n<p>This makes erasure &amp; garbage collection more expensive (by adding reads), but remember that ion Yaffs2 we don\'t need to do page deletions which are much more expensive operations. Thus, all-up Yaffs2 wins.</p>\r\n\r\n<h4>Tag structure</h4>\r\n\r\n<p>Each chunk in Yaffs2 has the following information:</p>\r\n\r\n<p>Field</p>\r\n\r\n<p>Comment</p>\r\n\r\n<p>Size for 1kb chunks</p>\r\n\r\n<p>Size for 2kB chunks</p>\r\n\r\n<table>\r\n	<tbody>\r\n		<tr>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>blockState</p>\r\n			</td>\r\n			<td>\r\n			<p>Block state. non-0xFF for bad block</p>\r\n			</td>\r\n			<td>\r\n			<p>1 byte</p>\r\n			</td>\r\n			<td>\r\n			<p>1 byte</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>chunkId</p>\r\n			</td>\r\n			<td>\r\n			<p>32-bit chunk Id</p>\r\n			</td>\r\n			<td>\r\n			<p>4 bytes</p>\r\n			</td>\r\n			<td>\r\n			<p>4 bytes</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>objectId</p>\r\n			</td>\r\n			<td>\r\n			<p>32-bit object Id</p>\r\n			</td>\r\n			<td>\r\n			<p>4 bytes</p>\r\n			</td>\r\n			<td>\r\n			<p>4 bytes</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>nBytes</p>\r\n			</td>\r\n			<td>\r\n			<p>Number of data bytes in this chunk</p>\r\n			</td>\r\n			<td>\r\n			<p>2 bytes</p>\r\n			</td>\r\n			<td>\r\n			<p>2 bytes</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>blockSequence</p>\r\n			</td>\r\n			<td>\r\n			<p>sequence number for this block</p>\r\n			</td>\r\n			<td>\r\n			<p>4 bytes</p>\r\n			</td>\r\n			<td>\r\n			<p>4 bytes</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>tagsEcc</p>\r\n			</td>\r\n			<td>\r\n			<p>ECC on tags area</p>\r\n			</td>\r\n			<td>\r\n			<p>3 bytes</p>\r\n			</td>\r\n			<td>\r\n			<p>3 bytes</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>ecc</p>\r\n			</td>\r\n			<td>\r\n			<p>ECC, 3 bytes/256 bytes of data</p>\r\n			</td>\r\n			<td>\r\n			<p>12 bytes</p>\r\n			</td>\r\n			<td>\r\n			<p>24 bytes</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p><strong>Total</strong></p>\r\n			</td>\r\n			<td>\r\n			<p>&nbsp;</p>\r\n			</td>\r\n			<td>\r\n			<p><strong>30 bytes</strong></p>\r\n			</td>\r\n			<td>\r\n			<p><strong>42 bytes</strong></p>\r\n			</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<p><br />\r\n&nbsp;</p>\r\n\r\n<p>To get enough spare bytes for this tagging structure requires a chunk-size of at least 1kB.</p>\r\n\r\n<p>The blockSequence increments each time a block is allocated. (ie. the first block allocated is block 1, and so on).</p>\r\n\r\n<h4>Scanning</h4>\r\n\r\n<p>The only reason we need to keep track of data status on NAND is to be able to recreate the file system state during scanning. Since we no longer have chunk deletion status flags we use a slightly different process for scanning a Yaffs2 system.</p>\r\n\r\n<p>In effect, Yaffs2 recreates its state by \"replaying the tape\". ie. it scans the chunks in their allocation order (block sequence Id order) rather than in their order on the media. This implies that at start up, the blocks must be read and their block sequence determined.</p>\r\n\r\n<h4>Performance</h4>\r\n\r\n<p>Times for 2kB read(units of 1uS).</p>\r\n\r\n<p>Operation</p>\r\n\r\n<p>Yaffs1</p>\r\n\r\n<p>Yaffs2 (512b pages)</p>\r\n\r\n<p>Yaffs2 (2kB pages)</p>\r\n\r\n<p>Yaffs2(2kB pages, x16)</p>\r\n\r\n<table>\r\n	<tbody>\r\n		<tr>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Seek</p>\r\n			</td>\r\n			<td>\r\n			<p>40</p>\r\n			</td>\r\n			<td>\r\n			<p>40</p>\r\n			</td>\r\n			<td>\r\n			<p>10</p>\r\n			</td>\r\n			<td>\r\n			<p>10</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Read</p>\r\n			</td>\r\n			<td>\r\n			<p>220</p>\r\n			</td>\r\n			<td>\r\n			<p>220</p>\r\n			</td>\r\n			<td>\r\n			<p>220</p>\r\n			</td>\r\n			<td>\r\n			<p>110</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Total</p>\r\n			</td>\r\n			<td>\r\n			<p>260</p>\r\n			</td>\r\n			<td>\r\n			<p>260</p>\r\n			</td>\r\n			<td>\r\n			<p>230</p>\r\n			</td>\r\n			<td>\r\n			<p>120</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>MB/s</p>\r\n			</td>\r\n			<td>\r\n			<p>7.6</p>\r\n			</td>\r\n			<td>\r\n			<p>7.6</p>\r\n			</td>\r\n			<td>\r\n			<p>8.7</p>\r\n			</td>\r\n			<td>\r\n			<p>16.7</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Relative speed</p>\r\n			</td>\r\n			<td>\r\n			<p>1</p>\r\n			</td>\r\n			<td>\r\n			<p>1</p>\r\n			</td>\r\n			<td>\r\n			<p>1.1</p>\r\n			</td>\r\n			<td>\r\n			<p>2.2</p>\r\n			</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<p><br />\r\n&nbsp;</p>\r\n\r\n<p>Times for 2kB writes(units of 1uS).</p>\r\n\r\n<p>Operation</p>\r\n\r\n<p>Yaffs1</p>\r\n\r\n<p>Yaffs2 (512b pages)</p>\r\n\r\n<p>Yaffs2 (2kB pages)</p>\r\n\r\n<p>Yaffs2(2kB pages, x16)</p>\r\n\r\n<table>\r\n	<tbody>\r\n		<tr>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Seek</p>\r\n			</td>\r\n			<td>\r\n			<p>40</p>\r\n			</td>\r\n			<td>\r\n			<p>40</p>\r\n			</td>\r\n			<td>\r\n			<p>10</p>\r\n			</td>\r\n			<td>\r\n			<p>10</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Program</p>\r\n			</td>\r\n			<td>\r\n			<p>800</p>\r\n			</td>\r\n			<td>\r\n			<p>800</p>\r\n			</td>\r\n			<td>\r\n			<p>200</p>\r\n			</td>\r\n			<td>\r\n			<p>200</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Seek</p>\r\n			</td>\r\n			<td>\r\n			<p>40</p>\r\n			</td>\r\n			<td>\r\n			<p>40</p>\r\n			</td>\r\n			<td>\r\n			<p>10</p>\r\n			</td>\r\n			<td>\r\n			<p>10</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Read</p>\r\n			</td>\r\n			<td>\r\n			<p>220</p>\r\n			</td>\r\n			<td>\r\n			<p>220</p>\r\n			</td>\r\n			<td>\r\n			<p>220</p>\r\n			</td>\r\n			<td>\r\n			<p>110</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Total</p>\r\n			</td>\r\n			<td>\r\n			<p>1320</p>\r\n			</td>\r\n			<td>\r\n			<p>1320</p>\r\n			</td>\r\n			<td>\r\n			<p>660</p>\r\n			</td>\r\n			<td>\r\n			<p>440</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>MB/s</p>\r\n			</td>\r\n			<td>\r\n			<p>1.5</p>\r\n			</td>\r\n			<td>\r\n			<p>1.5</p>\r\n			</td>\r\n			<td>\r\n			<p>3</p>\r\n			</td>\r\n			<td>\r\n			<p>4.5</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Relative speed</p>\r\n			</td>\r\n			<td>\r\n			<p>1</p>\r\n			</td>\r\n			<td>\r\n			<p>1</p>\r\n			</td>\r\n			<td>\r\n			<p>2</p>\r\n			</td>\r\n			<td>\r\n			<p>3</p>\r\n			</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<p><br />\r\n&nbsp;</p>\r\n\r\n<p>Times for 1MB delete (units of 1uS).</p>\r\n\r\n<p>Operation</p>\r\n\r\n<p>Yaffs1</p>\r\n\r\n<p>Yaffs2 (512b pages)</p>\r\n\r\n<p>Yaffs2 (2kB pages)</p>\r\n\r\n<p>Yaffs2(2kB pages, x16)</p>\r\n\r\n<table>\r\n	<tbody>\r\n		<tr>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Seek</p>\r\n			</td>\r\n			<td>\r\n			<p>20480</p>\r\n			</td>\r\n			<td>\r\n			<p>0</p>\r\n			</td>\r\n			<td>\r\n			<p>0</p>\r\n			</td>\r\n			<td>\r\n			<p>0</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Program</p>\r\n			</td>\r\n			<td>\r\n			<p>409600</p>\r\n			</td>\r\n			<td>\r\n			<p>0</p>\r\n			</td>\r\n			<td>\r\n			<p>0</p>\r\n			</td>\r\n			<td>\r\n			<p>0</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Erase</p>\r\n			</td>\r\n			<td>\r\n			<p>128000</p>\r\n			</td>\r\n			<td>\r\n			<p>128000</p>\r\n			</td>\r\n			<td>\r\n			<p>16000</p>\r\n			</td>\r\n			<td>\r\n			<p>16000</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Total</p>\r\n			</td>\r\n			<td>\r\n			<p>558080</p>\r\n			</td>\r\n			<td>\r\n			<p>128000</p>\r\n			</td>\r\n			<td>\r\n			<p>16000</p>\r\n			</td>\r\n			<td>\r\n			<p>16000</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>MB/s</p>\r\n			</td>\r\n			<td>\r\n			<p>1.8</p>\r\n			</td>\r\n			<td>\r\n			<p>7.8</p>\r\n			</td>\r\n			<td>\r\n			<p>62.5</p>\r\n			</td>\r\n			<td>\r\n			<p>62.5</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Relative speed</p>\r\n			</td>\r\n			<td>\r\n			<p>1</p>\r\n			</td>\r\n			<td>\r\n			<p>4</p>\r\n			</td>\r\n			<td>\r\n			<p>34</p>\r\n			</td>\r\n			<td>\r\n			<p>34</p>\r\n			</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<p><br />\r\n&nbsp;</p>\r\n\r\n<p>Times for 1MB of garbage collection at 50% dirty (units of 1uS).</p>\r\n\r\n<p>Operation</p>\r\n\r\n<p>Yaffs1</p>\r\n\r\n<p>Yaffs2 (512b pages)</p>\r\n\r\n<p>Yaffs2 (2kB pages)</p>\r\n\r\n<p>Yaffs2(2kB pages, x16)</p>\r\n\r\n<table>\r\n	<tbody>\r\n		<tr>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Delete 1MB</p>\r\n			</td>\r\n			<td>\r\n			<p>558080</p>\r\n			</td>\r\n			<td>\r\n			<p>128000</p>\r\n			</td>\r\n			<td>\r\n			<p>16000</p>\r\n			</td>\r\n			<td>\r\n			<p>16000</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Write 0.5MB</p>\r\n			</td>\r\n			<td>\r\n			<p>337920</p>\r\n			</td>\r\n			<td>\r\n			<p>337920</p>\r\n			</td>\r\n			<td>\r\n			<p>168960</p>\r\n			</td>\r\n			<td>\r\n			<p>112640</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Total</p>\r\n			</td>\r\n			<td>\r\n			<p>896000</p>\r\n			</td>\r\n			<td>\r\n			<p>465920</p>\r\n			</td>\r\n			<td>\r\n			<p>184960</p>\r\n			</td>\r\n			<td>\r\n			<p>128640</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>MB/s</p>\r\n			</td>\r\n			<td>\r\n			<p>1.1</p>\r\n			</td>\r\n			<td>\r\n			<p>2.1</p>\r\n			</td>\r\n			<td>\r\n			<p>5.4</p>\r\n			</td>\r\n			<td>\r\n			<p>7.7</p>\r\n			</td>\r\n		</tr>\r\n		<tr>\r\n			<td>\r\n			<p>Relative speed</p>\r\n			</td>\r\n			<td>\r\n			<p>1</p>\r\n			</td>\r\n			<td>\r\n			<p>1.9</p>\r\n			</td>\r\n			<td>\r\n			<p>4.9</p>\r\n			</td>\r\n			<td>\r\n			<p>7</p>\r\n			</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n\r\n<p><br />\r\n&nbsp;</p>\r\n\";s:7:\"summary\";s:323:\"<p>The initial specification for Yaffs version 2. Describes the development of Yaffs to deal with next-generation NAND chips which have larger (2Kb) pages and don\'t allow page rewrites. This newer design is be significantly faster (write: 1.5x-5x, delete: 4x, garbage collection: 2x) and has 25-50% lower RAM footfrint.</p>\";s:6:\"format\";s:9:\"full_html\";}}}s:19:\"field_document_type\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:3:\"345\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:4:\"page\";s:2:\"id\";s:2:\"38\";s:8:\"revision\";s:3:\"571\";s:4:\"uuid\";s:36:\"10044baf-840c-421b-9888-e789cd7d53e3\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:21:\"Yaffs 2 Specification\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"3\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"571\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498107621.181,1,'entity_field_info node_values','814'),('values:node:380','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:19:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"381\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1441709157\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"5\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"380\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:4:\"page\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"8ac866f7-55a9-4957-9251-b56a24da9079\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:7:\"Support\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1330383366\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1441709157\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:806:\"<p>We offer support for Yaffs through the <a href=\"http://stoneboat.aleph1.co.uk/mailman/listinfo/yaffs\">Yaffs mailing list</a>. It\'s best to start by searching the <a href=\"http://www.aleph1.co.uk/lurker/list/yaffs.html\">list archive</a> to see if someone has already asked the same question.</p><p>If you feel uncomfortable asking your question on an open mailing list you can try mailing us, but we (or you) may say \'You should be paying for this\', and if that is agreed, then we can accept payments via PayPal or other means.</p><p>Serious long-term work is best done as a negotiated contract; for instance we have built special features for clients with very particular needs. If you think you may want this sort of help then <a href=\"/contact\">contact us</a>, telling us a bit about your problem.</p>\";s:7:\"summary\";s:189:\"<p>We offer support for Yaffs through the&nbsp;<a href=\"http://stoneboat.aleph1.co.uk/mailman/listinfo/yaffs\">Yaffs mailing list</a>. We also offer paid contracts for longer term needs.</p>\";s:6:\"format\";s:9:\"full_html\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:4:\"page\";s:2:\"id\";s:3:\"380\";s:8:\"revision\";s:3:\"381\";s:4:\"uuid\";s:36:\"8ac866f7-55a9-4957-9251-b56a24da9079\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:7:\"Support\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"381\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498106001.856,1,'entity_field_info node_values','814'),('values:node:384','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"385\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1430391793\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"4\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"384\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:27:\"what_is_special_about_yaffs\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"664b09ab-a5dc-4e2f-9889-9a8f61b0017c\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:16:\"Royalty Free... \";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1330455802\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496398582\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:342:\"<p><strong>100% ROYALTY FREE</strong></p>\r\n\r\n<p>Of course there\'s no royalty when you use Yaffs under the GPL; it\'s the GPL!</p>\r\n\r\n<p>Our commercial licences are paid for once at the time of buying the Licence, and so they are also royalty free. No accounting and no need to worry about increasing costs as you make or sell more units.</p>\r\n\";s:7:\"summary\";s:128:\"Whether you use Yaffs under the GNU General Public Licence or under a commercial licence, Yaffs is free of any per-unit royalty.\";s:6:\"format\";s:10:\"basic_html\";}}}s:15:\"field_icon_text\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:12:\"fa-thumbs-up\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:27:\"what_is_special_about_yaffs\";s:2:\"id\";s:3:\"384\";s:8:\"revision\";s:3:\"385\";s:4:\"uuid\";s:36:\"664b09ab-a5dc-4e2f-9889-9a8f61b0017c\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:16:\"Royalty Free... \";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"385\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105486.605,1,'entity_field_info node_values','814'),('values:node:385','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"386\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1354548038\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"4\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"385\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:27:\"what_is_special_about_yaffs\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"dc36c8cd-8e9f-468a-91dd-af26f383fa03\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:29:\"A robust flash file system...\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1330456244\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496412025\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:400:\"<p>As part of our regular testing, we run power-fail tests. Whether it\'s during a read or a write, Yaffs is designed to preserve your existing data during a device power failure. And because Yaffs is open source, you can download the tests and run them yourself in the most severe conditions you expect the product to encounter. See:- http://www.yaffs.net/documents/yaffs-robustness-and-testing</p>\r\n\";s:7:\"summary\";s:135:\"After more than 100,000 <strong>random</strong> power-failures during reading or writing, a test file showed NO data corruption at all!\";s:6:\"format\";s:10:\"basic_html\";}}}s:15:\"field_icon_text\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:9:\"fa-shield\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:27:\"what_is_special_about_yaffs\";s:2:\"id\";s:3:\"385\";s:8:\"revision\";s:3:\"386\";s:4:\"uuid\";s:36:\"dc36c8cd-8e9f-468a-91dd-af26f383fa03\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:29:\"A robust flash file system...\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"386\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105486.639,1,'entity_field_info node_values','814'),('values:node:388','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"389\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1430391671\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"4\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"388\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:27:\"what_is_special_about_yaffs\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"44690426-a9a6-466e-adb5-e4e58521c2be\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:23:\"Yaffs is Open Source...\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1330467790\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496401931\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:590:\"<p>Yaffs is downloadable with a GNU General Public Licence v.2, as at&nbsp; http://www.gnu.org/licenses/gpl-2.0.html&nbsp;&nbsp; You get the source code, with all the benefits that brings. And of course, if you buy a commercial licence, you get the source code too, but without the encumberance of your responsibilities under the GNU GPL</p>\r\n\r\n<p>Because it\'s Open Source, you can always see what the code is doing and trace through; and having the code means you\'ll never be in a situation where you are critically dependent on us, either from a technical or a business perspective.</p>\r\n\";s:7:\"summary\";s:168:\"You can have a look at the code at any time. <a title=\"Get it now!\" href=\"/downloads\">Download it now</a>! And it\'s suitable for GPL and commercially licensed projects.\";s:6:\"format\";s:10:\"basic_html\";}}}s:15:\"field_icon_text\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:8:\"fa-heart\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:27:\"what_is_special_about_yaffs\";s:2:\"id\";s:3:\"388\";s:8:\"revision\";s:3:\"389\";s:4:\"uuid\";s:36:\"44690426-a9a6-466e-adb5-e4e58521c2be\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:23:\"Yaffs is Open Source...\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"389\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105486.782,1,'entity_field_info node_values','814'),('values:node:389','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"390\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1378306103\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"389\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:27:\"what_is_special_about_yaffs\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"d884956b-47ae-45e1-bb19-25349e1f14db\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:42:\"Tried and tested in millions of devices...\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1330468194\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496407203\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:368:\"<p>Yaffs is the leading Flash file system, running in millions of devices. It\'s been used on Linux computers, in cameras, mobile phones, hard drives, and on many custom boards. People and companies trust it to keep their data safe. Read more about <a href=\"/documents/yaffs-robustness-and-testing\">how we test Yaffs in our Robustness and Testing white paper</a>.</p>\r\n\";s:7:\"summary\";s:177:\"Yaffs is widely used in Linux and proprietary commercial RTOSs. It\'s been included in hundreds of devices, and shipped as part of Google\'s Android, with millions of units sold. \";s:6:\"format\";s:10:\"basic_html\";}}}s:15:\"field_icon_text\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:5:\"value\";s:15:\"fa-mobile-phone\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:27:\"what_is_special_about_yaffs\";s:2:\"id\";s:3:\"389\";s:8:\"revision\";s:3:\"390\";s:4:\"uuid\";s:36:\"d884956b-47ae-45e1-bb19-25349e1f14db\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:42:\"Tried and tested in millions of devices...\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"390\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105486.916,1,'entity_field_info node_values','814'),('values:node:397','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"398\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1336591220\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"397\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:15:\"yaffs_user_logo\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"73d2bdce-bc12-4215-8b33-d7478f7248a5\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:18:\"Design Electronics\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1336589997\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496412075\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:37:\"<p>Design Electronics use Yaffs</p>\r\n\";s:7:\"summary\";s:28:\"Design Electronics use Yaffs\";s:6:\"format\";s:10:\"basic_html\";}}}s:21:\"field_yaffs_user_logo\";a:1:{s:9:\"x-default\";a:1:{i:0;a:5:{s:9:\"target_id\";s:2:\"40\";s:3:\"alt\";s:0:\"\";s:5:\"title\";s:0:\"\";s:5:\"width\";s:3:\"427\";s:6:\"height\";s:3:\"302\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:15:\"yaffs_user_logo\";s:2:\"id\";s:3:\"397\";s:8:\"revision\";s:3:\"398\";s:4:\"uuid\";s:36:\"73d2bdce-bc12-4215-8b33-d7478f7248a5\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:18:\"Design Electronics\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"398\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105484.505,1,'entity_field_info node_values','814'),('values:node:398','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"399\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1336605810\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"398\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:15:\"yaffs_user_logo\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"6444ad81-8e37-4969-8a5c-17807309c46b\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:5:\"Eaton\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1336605810\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496412157\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:24:\"<p>Eaton use Yaffs</p>\r\n\";s:7:\"summary\";s:15:\"Eaton use Yaffs\";s:6:\"format\";s:10:\"basic_html\";}}}s:21:\"field_yaffs_user_logo\";a:1:{s:9:\"x-default\";a:1:{i:0;a:5:{s:9:\"target_id\";s:2:\"46\";s:3:\"alt\";s:0:\"\";s:5:\"title\";s:0:\"\";s:5:\"width\";s:3:\"591\";s:6:\"height\";s:3:\"249\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:15:\"yaffs_user_logo\";s:2:\"id\";s:3:\"398\";s:8:\"revision\";s:3:\"399\";s:4:\"uuid\";s:36:\"6444ad81-8e37-4969-8a5c-17807309c46b\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:5:\"Eaton\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"399\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105484.609,1,'entity_field_info node_values','814'),('values:node:399','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"400\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1336605985\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"399\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:15:\"yaffs_user_logo\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"a5c10bec-5f10-4c54-9cd0-09ca8b4cc0af\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:13:\"LANCOM Sytems\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1336605955\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1494601211\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:34:\"<p>Lancom Systems use Yaffs.</p>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}s:21:\"field_yaffs_user_logo\";a:1:{s:9:\"x-default\";a:1:{i:0;a:5:{s:9:\"target_id\";s:2:\"43\";s:3:\"alt\";s:0:\"\";s:5:\"title\";s:0:\"\";s:5:\"width\";s:4:\"2118\";s:6:\"height\";s:3:\"531\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:15:\"yaffs_user_logo\";s:2:\"id\";s:3:\"399\";s:8:\"revision\";s:3:\"400\";s:4:\"uuid\";s:36:\"a5c10bec-5f10-4c54-9cd0-09ca8b4cc0af\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:13:\"LANCOM Sytems\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"400\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105484.676,1,'entity_field_info node_values','814'),('values:node:400','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"401\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1342416153\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"400\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:15:\"yaffs_user_logo\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"fe518988-cfd7-464f-bd0a-941c1ee56307\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:7:\"Bernina\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1336606047\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1494601697\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:27:\"<p>Bernina use Yaffs.</p>\r\n\";s:7:\"summary\";s:0:\"\";s:6:\"format\";s:10:\"basic_html\";}}}s:21:\"field_yaffs_user_logo\";a:1:{s:9:\"x-default\";a:1:{i:0;a:5:{s:9:\"target_id\";s:2:\"45\";s:3:\"alt\";s:0:\"\";s:5:\"title\";s:0:\"\";s:5:\"width\";s:4:\"1024\";s:6:\"height\";s:3:\"153\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:15:\"yaffs_user_logo\";s:2:\"id\";s:3:\"400\";s:8:\"revision\";s:3:\"401\";s:4:\"uuid\";s:36:\"fe518988-cfd7-464f-bd0a-941c1ee56307\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:7:\"Bernina\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"401\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105484.751,1,'entity_field_info node_values','814'),('values:node:401','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:20:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"402\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1336606157\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"401\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:15:\"yaffs_user_logo\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"82fb641c-f24f-4653-a58b-04377a5c1619\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:9:\"Gallagher\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1336606102\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496412218\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:26:\"<p>Used by Gallagher</p>\r\n\";s:7:\"summary\";s:17:\"Used by Gallagher\";s:6:\"format\";s:10:\"basic_html\";}}}s:21:\"field_yaffs_user_logo\";a:1:{s:9:\"x-default\";a:1:{i:0;a:5:{s:9:\"target_id\";s:2:\"47\";s:3:\"alt\";s:0:\"\";s:5:\"title\";s:0:\"\";s:5:\"width\";s:4:\"1796\";s:6:\"height\";s:3:\"580\";}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:15:\"yaffs_user_logo\";s:2:\"id\";s:3:\"401\";s:8:\"revision\";s:3:\"402\";s:4:\"uuid\";s:36:\"82fb641c-f24f-4653-a58b-04377a5c1619\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:9:\"Gallagher\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"402\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105484.785,1,'entity_field_info node_values','814'),('values:node:409','O:23:\"Drupal\\node\\Entity\\Node\":25:{s:10:\"in_preview\";N;s:9:\"\0*\0values\";a:22:{s:3:\"vid\";a:1:{s:9:\"x-default\";s:3:\"612\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:18:\"revision_timestamp\";a:1:{s:9:\"x-default\";s:10:\"1496924967\";}s:12:\"revision_uid\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:12:\"revision_log\";a:1:{s:9:\"x-default\";N;}s:3:\"nid\";a:1:{s:9:\"x-default\";s:3:\"409\";}s:4:\"type\";a:1:{s:9:\"x-default\";s:5:\"paper\";}s:4:\"uuid\";a:1:{s:9:\"x-default\";s:36:\"7ded725e-366e-4ad5-a9c4-4d97e16adac0\";}s:17:\"isDefaultRevision\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:5:\"title\";a:1:{s:9:\"x-default\";s:15:\"How Yaffs works\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"6\";}s:7:\"created\";a:1:{s:9:\"x-default\";s:10:\"1338593328\";}s:7:\"changed\";a:1:{s:9:\"x-default\";s:10:\"1496924967\";}s:7:\"promote\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:6:\"sticky\";a:1:{s:9:\"x-default\";s:1:\"0\";}s:29:\"revision_translation_affected\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:4:\"body\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:5:\"value\";s:239922:\"<p align=\"center\" style=\"margin-top: 0.42cm; orphans: 0; widows: 0; page-break-after: avoid\">\r\n<br/>\r\n<br/>\r\n\r\n</p>\r\n\r\n	<p class=\"western\" align=\"justify\">This document aims to give a\r\n	reasonable explanation of most of the core mechanisms that make\r\n	Yaffs work. \r\n	</p>\r\n	<p class=\"western\" align=\"justify\">This document should serve as a\r\n	first port of call for understanding Yaffs.</p>\r\n\r\n<h1 class=\"western\">1 Purpose</h1>\r\n<p class=\"western\">The purpose of this document is to give a\r\nreasonable explanation of most of the core mechanisms that make Yaffs\r\nwork. As of the time of writing this, the Yaffs2 code base includes\r\napproximately 19,000 lines of code making a very detailed discussion\r\nimpractical.</p>\r\n<p class=\"western\">This document should serve as a first port of call\r\nfor understanding Yaffs. Further detailed questions and discussions\r\nare welcomed on the Yaffs discussion list.</p>\r\n<p class=\"western\">This document is updated periodically. Yaffs\r\nmechanism design changes from time to time and this document will not\r\nalways reflect the most up to date code. \r\n</p>\r\n<h1 class=\"western\">2 What is Yaffs?</h1>\r\n<p class=\"western\">Yaffs stands for <i>Yet Another Flash File System</i>,\r\na term coined by Charles Manning in 2001 when suggesting that the\r\nalready cluttered flash file system space could do with yet another\r\noffering – this time a flash file system designed from the ground\r\nup to work with NAND flash.</p>\r\n<p class=\"western\">The first release of Yaffs was developed during\r\nthe end of 2001 and the beginning of 2002. By mid-2002, Yaffs was\r\nbeing trialled in various products.  In May 2002,  Yaffs was\r\nannounced and a few more projects started playing with it. In June,\r\nporting to other OSs started. In September 2002, Yaffs was announced\r\non linuxdevices.com which started a far wider uptake of Yaffs.</p>\r\n<p class=\"western\">Yaffs1, the original version of Yaffs, supported\r\n512-byte page NAND devices with a SmartMedia-like memory layout.</p>\r\n<p class=\"western\">Yaffs2 is a follow-up to Yaffs1 extending Yaffs1\r\nto support larger and different devices with different constraints.</p>\r\n<p class=\"western\">Yaffsis highly portable and has been used in many\r\ndifferent products and applications as varied as sewing machines,\r\npoint of sale, phones and aerospace. Yaffs has been used with\r\nmultiple different operating systems. Native support is available for\r\nLinux, WindowsCE and eCOS while Yaffs Direct Interface provides a\r\nlayer that can be used in other applications such as RTOSs. Yaffs has\r\nbeen used with multiple different CPUs and compilers.</p>\r\n<p class=\"western\">Yaffs has also been used as a NOR file system and\r\neven as a RAM file system.</p>\r\n<h1 class=\"western\">3 Design and coding strategies</h1>\r\n<p class=\"western\">Yaffs is designed to work in multiple environments\r\nwhich drives the need for portability. Portability also improves the\r\ndebugging and testing since it is easier to develop and debug code in\r\nan application environment than within an OS kernel. This generally\r\nallows Yaffs to progress faster with less programming resources and\r\nprovides more varied testing. Primary strategies that improve\r\nportability include:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">No OS-specific features used in main code\r\n	body.</p>\r\n	<li/>\r\n<p class=\"western\">No compiler-specific features used in the\r\n	main code body.</p>\r\n	<li/>\r\n<p class=\"western\">Abstract types and functions used to allow\r\n	Unicode or ASCII operation.</p>\r\n</ul>\r\n\r\n<p class=\"western\" style=\"page-break-before: auto; page-break-after: avoid\">\r\nSimplicity is another key goal. Complexity is limited to those\r\nsituations that provide significant improvements to performance or\r\nutility. Simplicity improves robustness and the ease of integration\r\nand development. Primary strategies that improve simplicity are:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">Single threaded model. Yaffs is locked on a\r\n	per-partition basis at a high level. This is simpler than tracking\r\n	lower-level locking. Yaffs Direct Interface uses a single lock for\r\n	all partitions.</p>\r\n</ul>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">Log structure makes for a simpler garbage\r\n	collector and allocation methodology.</p>\r\n	<li/>\r\n<p class=\"western\">Abstractions that build layered code which\r\n	is easier to understand, port and debug.</p>\r\n</ul>\r\n<h1 class=\"western\">4 Terminology: Yaffs vs Yaffs1 vs Yaffs2</h1>\r\n<p class=\"western\">Before we embark on our quest to understand what\r\nYaffs is, a terminology explanation is in order.</p>\r\n<p class=\"western\">There are two versions of Yaffs code: the original\r\nYaffs code-base and the current Yaffs2 code-base. The Yaffs2\r\ncode-base supports functionality provided by the Yaffs code-base as\r\nwell as being extended with new functionality to provide extra modes\r\nof operation, most importantly those required to work with larger and\r\nmore modern NAND parts. The Yaffs2 code-base supports the Yaffs1 mode\r\nof operation through a backward compatibility mode.</p>\r\n<p class=\"western\">Unless explicitly mentioned, this text refers to\r\nthe Yaffs2 code-base.</p>\r\n<p class=\"western\">This text uses three terms Yaffs, Yaffs1 and\r\nYaffs2 depending on various modes of operation.</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Yaffs1\r\n	is a simpler mode of operation that uses deletion markers to track\r\n	state. </font>\r\n	</p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Yaffs2\r\n	is a more complex mode of operating that was developed to support\r\n	larger modern flash types, in particular MLC NAND, that cannot used\r\n	deletion markers.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Yaffs\r\n	means operations common to both.</font></p>\r\n</ul>\r\n<p class=\"western\">Yaffs1 originally only worked with 512-byte page\r\ndevices but has been extended to support larger flash pages such as\r\nIntel M18 flash with 1k pages.</p>\r\n<p class=\"western\">Yaffs2 was originally designed for 1k or larger\r\npage sizes but can be used with smaller pages by using in-band tags.</p>\r\n<p class=\"western\">Since the Yaffs1 mode of operation is simpler to\r\nunderstand than the Yaffs2 mode of operation,  Yaffs1 will be\r\ndescribed first and readers interested in Yaffs2 operation should\r\nfirst fully acquaint themselves with the Yaffs1 mode of operation. It\r\nis suggested that this document be read sequentially rather than\r\nbrowsing it.</p>\r\n<h1 class=\"western\">5 Objects</h1>\r\n<p class=\"western\">In Yaffs-speak, an Object is anything that is\r\nstored in the file system. These are:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">Regular data files</p>\r\n	<li/>\r\n<p class=\"western\">Directories</p>\r\n	<li/>\r\n<p class=\"western\">Hard-links</p>\r\n	<li/>\r\n<p class=\"western\">Symbolic links</p>\r\n	<li/>\r\n<p class=\"western\">Special objects (pipes, devices etc).</p>\r\n</ul>\r\n<p class=\"western\">All objects are identified by a unique integer\r\nobject id (<i><b>obj_id</b></i><i><b>)</b></i>.</p>\r\n<p class=\"western\">In the standard POSIX model, as used by Linux,\r\nthere are inodes and directory entries (dentries). \r\n</p>\r\n<p class=\"western\">An inode may be a regular file, directory, or\r\nspecial file.</p>\r\n<p class=\"western\">Directory entries provide the naming mechanism\r\nthat is used to locate inodes.</p>\r\n<p class=\"western\">Under POSIX, each inode may have zero, one or many\r\ndentries:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">One dentry per inode is commonly\r\n	understood.</p>\r\n	<li/>\r\n<p class=\"western\">Multiple dentries per inode allow the same\r\n	inode to be accessed via multiple names. This is achieved through\r\n	hard links.</p>\r\n	<li/>\r\n<p class=\"western\">Zero dentries per inode is less often\r\n	understood. This happens when an inode is unlinked while there is\r\n	still a handle open to the inode. The unlinking deletes the dentry\r\n	but the inode still exists. As soon as the handle is closed the\r\n	inode is deleted too.</p>\r\n</ul>\r\n<h1 class=\"western\">6 The Yaffs NAND model</h1>\r\n<p class=\"western\">The memory in NAND flash is arranged in <i><b>pages.</b></i>\r\nA page is the unit of allocation and programming.  In Yaffs, the unit\r\nof allocation is the<i> </i><i><b>chunk</b></i>. Typically a chunk\r\nwill be the same as a NAND page, but there is flexibility to use\r\nchunks which map to multiple pages (eg. A system may have two NAND\r\nchips in parallel requiring 2x2048 = 4096 byte chunks) . This\r\ndistinction gives a lot of flexibility in how the system can be\r\nconfigured.  In this text the term page and chunk are synonymous\r\nunless stated otherwise.</p>\r\n<p class=\"western\">Many, typically 32 to 128 but as many as a few\r\nhundred, chunks form a <i><b>block</b></i>. A block is the unit of\r\nerasure. \r\n</p>\r\n<p class=\"western\">NAND flash may be shipped with bad blocks and\r\nfurther blocks may go bad during the operation of the device. Thus,\r\nYaffs is aware of bad blocks and needs to be able to detect and mark\r\nbad blocks.</p>\r\n<p class=\"western\">NAND flash also typically requires the use of some\r\nsort of error detection and correction code (ECC). Yaffs can either\r\nuse existing ECC logic or provide its own.</p>\r\n<h1 class=\"western\">7 How Yaffs1 stores files</h1>\r\n<p class=\"western\">Yaffs1 has a modified log structure, while Yaffs2\r\n(see below) has a true log structure. A true log structured file\r\nsystem only ever writes sequentially. Yaffs1 uses deletion markers,\r\nwhich breaks the sequential write rule. Yaffs2 does not use deletion\r\nmarkers and is thus a true log structured file system.</p>\r\n<p class=\"western\">Instead of writing data in locations specific to\r\nthe files, the file system data is written in the form of a\r\nsequential log, The entries in the log are all one chunk in size and\r\ncan hold one of two types of chunk:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><i><b>Data chunk</b></i>: A chunk holding\r\n	regular data file contents.</p>\r\n	<li/>\r\n<p class=\"western\"><i><b>Object Header</b></i>: A descriptor\r\n	for an object (directory, regular data file, hard link, soft link,\r\n	special descriptor,...). This holds details such as the identifier\r\n	for the parent directory, object name, etc.</p>\r\n</ul>\r\n<p class=\"western\">Each chunk has <i><b>tags</b></i> associated with\r\nit. The tags comprise the following important fields (others being\r\nignored for now):</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><i><b>Object Id (</b></i><i><b>obj_id</b></i><i><b>)</b></i>:\r\n	Identifies which object the chunk belongs to.</p>\r\n	<li/>\r\n<p class=\"western\"><i><b>Chunk Id (</b></i><i><b>chunk_id</b></i><i><b>)</b></i>:\r\n	Identifies where in the file this chunk belongs. A chunk_id of zero\r\n	signifies that this chunk contains an objectHeader. chunk_id==1\r\n	signifies the first chunk in the file (ie. At file offset 0),\r\n	chunk_id==2  is the next chunk and so on.</p>\r\n	<li/>\r\n<p class=\"western\"><i><b>Deletion Marker (</b></i><i><b>is_deleted</b></i><i><b>)</b></i><i><b>:</b></i>\r\n	(Yaffs1 only)  Shows that this chunk is no longer in use.</p>\r\n	<li/>\r\n<p class=\"western\"><i><b>Byte Count</b></i><b>: </b><b>(n_bytes)</b>:\r\n	Number of bytes of data if this is a data chunk.</p>\r\n	<li/>\r\n<p class=\"western\"><i><b>Serial Number </b></i><i><b>(ser</b></i><i><b>ia</b></i><i><b>l_number)</b></i>:\r\n	 (Yaffs1 only) Serial number used to differentiate chunks with the\r\n	same obj_id and chunk_id.</p>\r\n</ul>\r\n\r\n<p class=\"western\" style=\"page-break-before: always\">Now let\'s bring\r\nthat all together in an explanation. This is a simplified explanation\r\nand skips over issues such as Soft Deletion (mentioned later in the\r\ndocument). For explanation purposes, we shall consider usage of\r\nfictitious NAND type that has 4 chunks per block, starting with an\r\nempty (erased) flash.</p>\r\n\r\n<p class=\"western\">First we\'ll create a file.</p>\r\n\r\n<table width=\"605\" cellpadding=\"4\" cellspacing=\"0\">\r\n	<col width=\"37\">\r\n	<col width=\"56\">\r\n	<col width=\"67\">\r\n	<col width=\"60\">\r\n	<col width=\"64\">\r\n	<col width=\"271\">\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" style=\"font-weight: normal\">Block</p>\r\n		</td>\r\n		<td width=\"56\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" style=\"font-weight: normal\">Chunk</p>\r\n		</td>\r\n		<td width=\"67\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" style=\"font-weight: normal\">obj_id</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" style=\"font-weight: normal\">chunk_id</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" style=\"font-weight: normal\">Deletion</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border: 1px solid #000000; padding: 0.1cm\">\r\n			<p class=\"western\" style=\"font-weight: normal\">Comment</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" height=\"26\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"56\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"67\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Object Header for this file (length 0)</p>\r\n		</td>\r\n	</tr>\r\n</table>\r\n\r\n<p class=\"western\">Next we write a few chunks of data to the file.</p>\r\n\r\n<table width=\"605\" cellpadding=\"4\" cellspacing=\"0\">\r\n	<col width=\"37\">\r\n	<col width=\"48\">\r\n	<col width=\"60\">\r\n	<col width=\"64\">\r\n	<col width=\"56\">\r\n	<col width=\"290\">\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Block</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Chunk</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">obj_id</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">chunk_id</p>\r\n		</td>\r\n		<td width=\"56\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deletion</p>\r\n		</td>\r\n		<td width=\"290\" style=\"border: 1px solid #000000; padding: 0.1cm\">\r\n			<p class=\"western\">Comment</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"56\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"290\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Object Header for t<font size=\"3\" style=\"font-size: 12pt\">his\r\n			file (length 0)</font></p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"56\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"290\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">First chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"56\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"290\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Second chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"56\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"290\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Third chunk of data</p>\r\n		</td>\r\n	</tr>\r\n</table>\r\n\r\n<p class=\"western\">Next we close the file. This writers a new object\r\nheader for the file. Notice how the previous object header is\r\ndeleted.</p>\r\n\r\n<table width=\"605\" cellpadding=\"4\" cellspacing=\"0\">\r\n	<col width=\"37\">\r\n	<col width=\"48\">\r\n	<col width=\"60\">\r\n	<col width=\"68\">\r\n	<col width=\"60\">\r\n	<col width=\"282\">\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Block</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Chunk</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">obj_id</p>\r\n		</td>\r\n		<td width=\"68\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">chunk_id</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deletion</p>\r\n		</td>\r\n		<td width=\"282\" style=\"border: 1px solid #000000; padding: 0.1cm\">\r\n			<p class=\"western\">Comment</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"68\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"282\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsoleted object header <font size=\"2\" style=\"font-size: 10pt\">(length\r\n			0)</font></p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"68\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"282\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">First chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"68\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"282\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Second chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"68\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"282\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Third chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"68\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"282\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">New object header <font size=\"2\" style=\"font-size: 10pt\">(length\r\n			n)</font></p>\r\n		</td>\r\n	</tr>\r\n</table>\r\n\r\n<p class=\"western\" style=\"page-break-before: always\">Let\'s now open\r\nthe file for read/write, overwrite part of the first chunk in the\r\nfile and close the file. The replaced data and object header chunks\r\nbecome deleted.</p>\r\n\r\n<table width=\"605\" cellpadding=\"4\" cellspacing=\"0\" style=\"page-break-inside: avoid\">\r\n	<col width=\"37\">\r\n	<col width=\"48\">\r\n	<col width=\"64\">\r\n	<col width=\"64\">\r\n	<col width=\"71\">\r\n	<col width=\"271\">\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Block</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Chunk</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">obj_id</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">chunk_id</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deletion</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border: 1px solid #000000; padding: 0.1cm\">\r\n			<p class=\"western\">Comment</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsolete object header.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsolete first chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Second chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Third chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsolete object header</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">New first chunk of file</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">New object header</p>\r\n		</td>\r\n	</tr>\r\n</table>\r\n\r\n<p class=\"western\">Now let\'s resize the file to zero by opening the\r\nfile with O_TRUNC and closing the file. This writes a new object\r\nheader with length 0 and the contents are pruned making the data\r\nchunks deleted.</p>\r\n\r\n<table width=\"605\" cellpadding=\"4\" cellspacing=\"0\">\r\n	<col width=\"37\">\r\n	<col width=\"48\">\r\n	<col width=\"64\">\r\n	<col width=\"64\">\r\n	<col width=\"71\">\r\n	<col width=\"271\">\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Block</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Chunk</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">obj_id</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">chunk_id</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deletion</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border: 1px solid #000000; padding: 0.1cm\">\r\n			<p class=\"western\">Comment</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsolete object header.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsolete first chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Second chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Third chunk of data</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsolete object header</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Deleted first chunk of file</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Delted</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsoleted object header</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"37\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"48\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"64\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"71\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"271\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">New object header <font size=\"2\" style=\"font-size: 10pt\">(length\r\n			0).</font></p>\r\n		</td>\r\n	</tr>\r\n</table>\r\n\r\n<p class=\"western\">Note how all the pages in block 1 are now marked\r\nas deleted. This means that block 1 no longer contains useful\r\ninformation so we can now erase block 1 and reuse the space.</p>\r\n<p class=\"western\">We will now rename the file. To do this we write a\r\nnew object header for the file</p>\r\n\r\n<table width=\"605\" cellpadding=\"4\" cellspacing=\"0\" style=\"page-break-inside: avoid\">\r\n	<col width=\"38\">\r\n	<col width=\"42\">\r\n	<col width=\"58\">\r\n	<col width=\"60\">\r\n	<col width=\"60\">\r\n	<col width=\"297\">\r\n	<tr valign=\"top\">\r\n		<td width=\"38\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Block</p>\r\n		</td>\r\n		<td width=\"42\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Chunk</p>\r\n		</td>\r\n		<td width=\"58\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">obj_id</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">chunk_id</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"297\" style=\"border: 1px solid #000000; padding: 0.1cm\">\r\n			<p class=\"western\">Comment</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"38\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"42\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"58\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"297\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Erased</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"38\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"42\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"58\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"297\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Erased</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"38\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"42\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"58\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"297\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Erased</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"38\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"1\" sdnum=\"2057;\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"42\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"58\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\"><br/>\r\n\r\n			</p>\r\n		</td>\r\n		<td width=\"297\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Erased</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"38\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"42\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"58\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"297\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsolete object header</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"38\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"42\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"58\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">1</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"297\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Deleted first chunk of file</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"38\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"42\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"58\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"297\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsoleted object header</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"38\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"2\" sdnum=\"2057;\">\r\n			<p class=\"western\">2</p>\r\n		</td>\r\n		<td width=\"42\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"58\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Deleted</p>\r\n		</td>\r\n		<td width=\"297\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">Obsolete object header</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"38\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\" sdval=\"3\" sdnum=\"2057;\">\r\n			<p class=\"western\">3</p>\r\n		</td>\r\n		<td width=\"42\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"58\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">500</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">0</p>\r\n		</td>\r\n		<td width=\"60\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Live</p>\r\n		</td>\r\n		<td width=\"297\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">New object header showing new name</p>\r\n		</td>\r\n	</tr>\r\n</table>\r\n\r\n<p class=\"western\">Block 2 now contains only deleted chunks and can\r\nbe erased and reused.</p>\r\n<p class=\"western\">Note how the tags tell us:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Which\r\n	chunks belong to which object</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">The\r\n	position of the chunks within a file,</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Which\r\n	chunks are current</font></p>\r\n</ul>\r\n<ul>\r\n	<p class=\"western\"><font size=\"3\" style=\"font-size: 12pt\">With that\r\n	information we can recreate the state of the files regardless of the\r\n	placement of the chunks in NAND. This means that should the system\r\n	fail (crash, power fail,...) at any point during the sequences\r\n	above, we are still able to recover the file system state up to that\r\n	point.</font></p>\r\n</ul>\r\n<p class=\"western\"><font size=\"3\" style=\"font-size: 12pt\">Note that\r\nthere are no file allocation tables or similar structures stored in\r\nthe flash. This reduces the amount of writing and erasing (improving\r\nwrite performance) while also improving robustness. Corruption of\r\nfile allocation tables and similar structures is a common failure\r\nmechanism for embedded file systems. The lack of such structures\r\nmakes Yaffs more robust. Or, to put it another way, you can\'t corrupt\r\nwhat you don\'t store.</font></p>\r\n<h1 class=\"western\">8 Garbage collection</h1>\r\n<p class=\"western\">As we have shown so far, when a block is made up\r\nonly of deleted chunks, that block can be erased and reused. However,\r\nconsider what will happen if we have many blocks which each have a\r\nfew current chunks in them. Clearly we cannot erase any of the\r\ncurrent blocks or we will destroy data. What we need to do is copy\r\nthe useful data chunks off a block, deleting the originals and\r\nallowing the block to be erased and reused. This process is referred\r\nto as <i><b>garbage collection</b></i>.</p>\r\n<p class=\"western\">The Yaffs garbage collection process works as\r\nfollows:</p>\r\n<ol>\r\n	<li/>\r\n<p class=\"western\">Find a block worth collecting (according\r\n	the the heuristics below). If none found, then exit.</p>\r\n	<li/>\r\n<p class=\"western\">Iterate through the chunks in the block. If\r\n	the chunk is in use then create a new copy and delete the original.\r\n	Fix up the RAM data structures to reflect the change.</p>\r\n</ol>\r\n<p class=\"western\">Once all chunks in this block have been deleted,\r\nthe block can be erased ready for reuse.</p>\r\n<p class=\"western\">Note that although step 2 deletes the original\r\nchunk when it gets copied there is not much point in actually\r\nprogramming the deletion marker (is_deleted flag) in flash since\r\nwe\'re about to erase the block anyway. Thus Yaffs does not program\r\nthe deletion marker in these cases. If power is lost part way through\r\nthe operation we can still tell the difference between the original\r\nand the copy by looking at the serial number (not that it really\r\nmatters anyway since the two have the same contents so either can be\r\nused).</p>\r\n<p class=\"western\">The heuristics to determine whether a block is\r\nworth collecting are as follows:</p>\r\n<ol>\r\n	<li/>\r\n<p class=\"western\">If there are many erased blocks available,\r\n	then Yaffs does not need to work hard, but will instead only attempt\r\n	to perform garbage collection of blocks with very few chunks in use.\r\n	This is termed <i><b>passive</b></i> garbage collection.</p>\r\n	<li/>\r\n<p class=\"western\">If, however, there are very few erased\r\n	blocks, Yaffs will work much harder to recover more space and will\r\n	garbage collect blocks with more chunks in use. This is termed\r\n	<i><b>aggressive</b></i> garbage collection.</p>\r\n</ol>\r\n<p class=\"western\">OK, the passive/aggressive names are a bit silly,\r\nbut they were contrived around midnight... give me a break!</p>\r\n<p class=\"western\">If garbage collection is aggressive, we need\r\nerased space urgency and the whole block is collected in a single\r\ngarbage collection cycle. If the collection is passive then only a\r\nfew chunks are collected at a time thus spreading the effort over\r\nmany garbage collection cycles. This is done to reduce garbage\r\ncollection load and improve responsiveness.</p>\r\n<p class=\"western\">The rationale behind the above heuristics is to\r\ndelay garbage collection when possible to reduce the amount of\r\ncollection that needs to be performed, thus increasing average system\r\nperformance. Yet there is a conflicting goal of trying to spread the\r\ngarbage collection so that it does not all happen at the same causing\r\nfluctuations in file system throughput. These conflicting goals make\r\ngarbage tuning quite challenging.</p>\r\n<p class=\"western\">All flash file systems need some sort of garbage\r\ncollector to reclaim space. The garbage collector is often a\r\ndetermining factor in the performance of the flash file system. Many\r\nfile systems have to do a significant amount of effort in a single\r\ncollection sweep.</p>\r\n<p class=\"western\">Yaffs only deals with one block at a time which\r\nconstrains the amount of effort in a garbage collection cycle, thus\r\nreducing the “stall time”.  Under normal conditions that garbage\r\ncollection is performed a few chunks at a time, further reducing\r\n“stall time”.</p>\r\n<h1 class=\"western\">9 Yaffs1 serial numbers</h1>\r\n<p class=\"western\">In Yaffs1, each chunk is marked with a 2-bit\r\nserial number that is incremented every time a chunk with the same\r\ntags value is replaced (eg. When a chunk is overwritten or when\r\ncopied by garbage collection).</p>\r\n<p class=\"western\">Now let\'s suppose first that we did not have a\r\nserial number. \r\n</p>\r\n<p class=\"western\">Let\'s consider a rename where an object header\r\nchunk must be replaced with a new one with the new name. Yaffs could\r\ndo the following:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Delete\r\n	the old chunk.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Write\r\n	the new chunk. </font>\r\n	</p>\r\n</ul>\r\n<p class=\"western\">If the system fails after the delete, the system\r\ncould end up with no chunks matching the relevant tags values. This\r\ncould cause files to be lost (end up in the lost+found directory).\r\nThus, we have to write the new chunk before deleting the old chunk.</p>\r\n<p class=\"western\">But now consider what might happen if we did this:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">W<font face=\"Liberation Serif, serif\">rite\r\n	new chunk.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Delete\r\n	old chunk.</font></p>\r\n</ul>\r\n<p class=\"western\">If the system failed after the write we now have\r\ntwo chunks that match the tags. How can we tell which one is current?</p>\r\n<p class=\"western\">The current chunk is determined by inspecting the\r\nserial number.  Since the serial number is only incremented by one\r\nbefore the old chunk is deleted, a 2-bit serial number is sufficient.\r\nValid pairs are:</p>\r\n<table width=\"86\" cellpadding=\"4\" cellspacing=\"0\">\r\n	<col width=\"35\">\r\n	<col width=\"33\">\r\n	<tr valign=\"top\">\r\n		<td width=\"35\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">Old</p>\r\n		</td>\r\n		<td width=\"33\" style=\"border: 1px solid #000000; padding: 0.1cm\">\r\n			<p class=\"western\">New</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"35\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">00</p>\r\n		</td>\r\n		<td width=\"33\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">01</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"35\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">01</p>\r\n		</td>\r\n		<td width=\"33\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">10</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"35\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">10</p>\r\n		</td>\r\n		<td width=\"33\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">11</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"35\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">11</p>\r\n		</td>\r\n		<td width=\"33\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">00</p>\r\n		</td>\r\n	</tr>\r\n</table>\r\n\r\n<p class=\"western\">Thus, by inspecting the serial number attached to\r\nthe old and new tags the current chunk can be determined and the old\r\nchunk can be deleted.</p>\r\n<h1 class=\"western\">10 Yaffs2 NAND model</h1>\r\n<p class=\"western\">Yaffs2 is an extension of Yaffs designed to\r\nfulfill a new set of objectives to work with newer NAND types\r\nincluding:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">Zero overwrites. Yaffs1 only ever\r\n	overwrites a single byte in the spare area of the chunks to set the\r\n	deletion marker. More modern NAND devices are less tolerant of\r\n	overwrites and Yaffs2 performs no overwrites at all.</p>\r\n	<li/>\r\n<p class=\"western\">Sequential chunk writing within a block.\r\n	More modern NAND reliability specifications tend to assume\r\n	sequential writing. Since Yaffs2 does not write deletion markers,\r\n	the writing of chunks within a block is strictly sequential.</p>\r\n	<li/>\r\n<p class=\"western\">Some flash technologies – such as MLC –\r\n	only work properly if pages are written sequentially. This is a\r\n	fundamental requirement of how many MLC types perform the bit\r\n	overlaying.</p>\r\n</ul>\r\n<p class=\"western\">Since Yaffs2 performs less writes, there is\r\npotential for Yaffs2 to have improved write performance.</p>\r\n<p class=\"western\">Yaffs2 cannot use a deletion marker because that\r\nwould violate the zero overwrites mandate and alternate mechanisms\r\nare provided to determine which chunks are current and which are\r\ndeleted. These mechanisms are:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><i><b>Sequence Number </b></i><i><b>(seq_number)</b></i>:\r\n	As each block is allocated, the file system\'s sequence number is\r\n	incremented and each chunk in the block is marked with that sequence\r\n	number. The sequence number thus provides a way of organising the\r\n	log in chronological order.</p>\r\n	<li/>\r\n<p class=\"western\"><i><b>Shrink Header Marker </b></i><i><b>(shrink_header)</b></i>:\r\n	The shrink header marker is used to mark object headers that are\r\n	written to shrink the size of a data file. This is explained more in\r\n	the accompanying text.</p>\r\n</ul>\r\n\r\n<p class=\"western\" align=\"center\"><i><b>Note: The Yaffs2 sequence\r\nnumber is not the same as the Yaffs1 serial number!</b></i></p>\r\n\r\n<p class=\"western\">Note: We still refer to chunk deletion in Yaffs2.\r\nThe chunks are marked as deleted in the RAM data structures used by\r\ngarbage collection etc, but there is no deletion marker written to\r\nflash.</p>\r\n<h2 class=\"western\">10.1 Sequence Number</h2>\r\n<ul>\r\n	<p class=\"western\">The sequence number allows the chronological\r\n	order to be determined which allows Yaffs to determine the sequence\r\n	of events and restore the file system state. This is achieved by\r\n	scanning <i><b>backwards</b></i> chronologically (ie. From the\r\n	highest sequence number backwards to the lowest sequence number).\r\n	Thus:</p>\r\n	<li/>\r\n<p class=\"western\">Since we\'re scanning backwards, the most\r\n	recently written – and thus current – chunk matching an\r\n	obj_id:chunk_id pair will be encountered first and all subsequent\r\n	matching chunks must be obsolete and treated as deleted.</p>\r\n	<li/>\r\n<p class=\"western\">The file length in object headers are used\r\n	to trim back resized files. If an object header is encountered, then\r\n	subsequent data chunks that lie beyond that file length are clearly\r\n	obsolete and treated as deleted. Note that both current and obsolete\r\n	object header sizes must be used to obtain an accurate\r\n	reconstruction.</p>\r\n</ul>\r\n<h2 class=\"western\">10.2 Shrink Header</h2>\r\n<p class=\"western\">Explaining the purpose of the shrink header marker\r\nis a bit convoluted. The purpose of a shrink header marker is to show\r\nthat this object header indicates that a file has shrunken in size,\r\nand to prevent those object headers from being deleted by garbage\r\ncollection.  To understand this, it is easiest to consider what would\r\nhappen if the shrink header markers did not exist.</p>\r\n<p class=\"western\">For simplification we\'ll assume no garbage\r\ncollection happens during this part of the exercise. It is safe to\r\nmake that assumption since it does not alter the reasoning.</p>\r\n<p class=\"western\">Consider a file that has been through the\r\nfollowing:</p>\r\n<p class=\"code-western\"><font face=\"Liberation Mono, monospace\"><font size=\"2\" style=\"font-size: 10pt\"><b>#define\r\nMB (1024 * 1024)<br/>\r\n</b></font></font><br/>\r\n\r\n</p>\r\n<p class=\"code-western\"><code class=\"western\"><font face=\"Liberation Mono, monospace\"><font size=\"2\" style=\"font-size: 9pt\">h\r\n= open(“foo”,O_CREAT| O_RDWR, S_IREAD|S_IWRITE); /* create file\r\n*/</font></font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 9pt\"><br/>\r\nwrite(h,data,5*</font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 9pt\">MB</font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 9pt\">);\r\n/* write 5 MB of data /<br/>\r\ntruncate(h,1*</font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 9pt\">MB</font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 9pt\">);\r\n /* truncate to 1MB */<br/>\r\nlseek(h,2*</font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 9pt\">MB</font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 9pt\">,\r\nSEEK_SET); /* set the file access position to 2MB\r\n*/<br/>\r\nwrite(h,data,1*</font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 9pt\">MB</font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 9pt\">);\r\n/* write 1MB of data */<br/>\r\nclose(h);</font></code><br/>\r\n<br/>\r\n\r\n</p>\r\n<p class=\"western\">The file will now be 3MB in length, but there will\r\nbe a “hole” between 1MB and 2MB. According to POSIX (and to aid\r\nsecurity etc) that “hole” should always read back as zeros.</p>\r\n<p class=\"western\">Yaffs2 would represent that in NAND with the\r\nfollowing sequence of chunks:</p>\r\n<ol>\r\n	<li/>\r\n<p class=\"western\">Object header for file creation (file\r\n	length = 0)</p>\r\n	<li/>\r\n<p class=\"western\">5MB worth of data chunks (0 to 5MB)</p>\r\n	<li/>\r\n<p class=\"western\">Object header for truncation (file length =\r\n	1MB)</p>\r\n	<li/>\r\n<p class=\"western\">1MB worth of data chunks (2MB to 3MB)</p>\r\n	<li/>\r\n<p class=\"western\">Object header for close (file length = 3MB)</p>\r\n	<p class=\"western\">At this stage, only the the following data chunks\r\n	are current:</p>\r\n</ol>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">The first 1MB of data created in step 2\r\n	above.</p>\r\n	<li/>\r\n<p class=\"western\">The 1MB of data created in step 4 above.</p>\r\n	<li/>\r\n<p class=\"western\">The object header created in step 5 above.</p>\r\n</ul>\r\n<p class=\"western\">But Yaffs must remember the truncation that\r\nhappened in step 3, otherwise Yaffs will “forget”  that there is\r\na hole, which would cause the old data to be visible again. Thus, if\r\nYaffs creates a hole it first writes a shrink header to indicate the\r\nstart of the hole and a regular object header to mark the end of the\r\nhole. \r\n</p>\r\n<p class=\"western\">The shrink header modifies the behavior of the\r\ngarbage collector to ensure that  these shrink headers are not erased\r\nuntil it is safe to do so. This unfortunately has a negative impact\r\non garbage collection in systems which make extensive use of files\r\nwith holes.</p>\r\n<p class=\"western\">Shrink headers are also used to indicate that a\r\nfile has been deleted and that the record of the file deletion is not\r\nlost.</p>\r\n<h2 class=\"western\">10.3 Yaffs2 extended tags</h2>\r\n<p class=\"western\">Yaffs2 extends the tags in object headers with\r\nextra fields to improve mount scanning performance. The operation of\r\nextended tags is described later in this document.</p>\r\n<h1 class=\"western\">11 Bad block handling NAND error handling</h1>\r\n<p class=\"western\">NAND flash is designed to be very low cost and\r\nvery high density. In order to get high yields, and thus keep costs\r\ndown, NAND flash is typically shipped with a few bad blocks and some\r\nfurther blocks are expected to go bad during the use of the device.\r\nThus, any flash file system without an effective bad block handling\r\npolicy is unsuitable for NAND flash.</p>\r\n<p class=\"western\">Yaffs1 uses the Smart-Media style of bad block\r\nmarking. This checks the sixth byte (byte 5) of the spare area. In a\r\ngood block this should be 0xFF. A factory-marked bad block should be\r\n0x00. If Yaffs1 determines that a block has gone bad it is marked bad\r\nwith 0x59 (\'Y\'). Using a distinctive marker allows Yaffs-marked bad\r\nblocks to be differentiated from factory-marked bad blocks.</p>\r\n<p class=\"western\">Yaffs2 mode is designed to support a wider range\r\nof devices and spare-area layouts. Thus, Yaffs2 does not decide which\r\nbytes to mark but instead calls driver functions to determine whether\r\nthe block is bad, or to mark it bad.</p>\r\n<p class=\"western\">So, when does Yaffs mark a block bad? Yaffs will\r\nmark a block bad if a read or write operation fails or if three ECC\r\nerrors are detected. A block that is marked bad is retired from use,\r\nthus improving the robustness of the file system. This policy is\r\nsuitable for SLC flash. MLC policies are under development.</p>\r\n<p class=\"western\">Further, NAND flash cells can sometimes be\r\ndisturbed (corrupted) by NAND activity and charge loss.  These errors\r\nare corrected by error correction codes (ECC) which may be\r\nimplemented in hardware, software drivers, or within Yaffs itself.\r\nAgain, any flash file system lacking effective ECC handling is\r\nunsuitable for NAND flash.</p>\r\n<p class=\"western\">Yaffs1 mode can use either the built in ECC or use\r\nECC provided by the driver or hardware.</p>\r\n<p class=\"western\">Since Yaffs2 mode is designed for a wider range of\r\ndevices, it does not provide ECC internally but requires that the\r\ndriver provide the ECC.</p>\r\n<p class=\"western\">The ECC code supplied with Yaffs (yaffs_ecc.c) is\r\nthe fastest C code implementation of a Smart Media compatible ECC\r\nalgorithm that we are aware of. This code will correct any single bit\r\nerror within a 256-byte data block and detect 2 errors per 256-byte\r\ndata block. This is sufficient error correction to provide very high\r\nreliability on most SLC-type NAND flash.</p>\r\n<p class=\"western\">For a more complete description of failure\r\nhandling, please refer to the Yaffs error mitigation document.</p>\r\n<h1 class=\"western\">12 RAM structures</h1>\r\n<p class=\"western\">While it is theoretically possible to use a log\r\nstructured file system with very few RAM structures, this would\r\nprovide reduce performance. Thus, significant RAM data structures are\r\nrequired to store enough information to provide sufficiently high\r\nperformance. \r\n</p>\r\n<p class=\"western\">Before we jump in, it is a good idea to first\r\nfigure out what purpose the RAM structures serve. The main structures\r\nare defined in yaffs_guts.h and their main purposes, are :</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">Device/partition: This is named <i><b>yaffs_dev</b></i><span style=\"font-style: normal\"><span style=\"font-weight: normal\">.\r\n	</span></span>This is required to hold information relating to a\r\n	Yaffs “partition” or “mount point”. Using these, rather than\r\n	globals, allows Yaffs to simultaneously support multiple partitions\r\n	and partitions of different types. In fact, almost other data\r\n	structures mentioned here are part of, or accessed via, the\r\n	structure.</p>\r\n	<li/>\r\n<p class=\"western\">NAND Block Information: This is named\r\n	<i><b>yaffs_block_info </b></i>and holds the current state of the\r\n	NAND blocks. Each yaffs_dev has an array of these.</p>\r\n	<li/>\r\n<p class=\"western\">NAND Chunk Information: This is a bitfield\r\n	attached to the yaffs_dev that holds the current in-use state of\r\n	each chunk in the system. There is one bit per chunk in the\r\n	partition.</p>\r\n	<li/>\r\n<p class=\"western\">Object: This is named <i><b>yaffs_obj</b></i>\r\n	and holds the state of an object (see section 3). There is one of\r\n	these for each object in the file system, where an object is one of\r\n	a regular file, directory, hard link, symbolic link or special link.\r\n	There are different variants of yaffs_Objects to reflect the\r\n	different data required for these different object types. Each\r\n	object is uniquely identified by an obj_id.</p>\r\n	<li/>\r\n<p class=\"western\">File structure: For each file object, Yaffs\r\n	holds a tree which provides the mechanism to find the data chunks in\r\n	a file. The tree consists of nodes called <i><b>yaffs_tnode</b></i>\r\n	(tree nodes).</p>\r\n	<li/>\r\n<p class=\"western\">Directory structure: The directory\r\n	structure allows objects to be found by name. The directory\r\n	structure is built from a doubly-linked list that is rooted in the\r\n	directory and binds together the sibling objects within a directory.</p>\r\n	<li/>\r\n<p class=\"western\">Object number hash table: The object number\r\n	hash table provides a mechanism to find an object from its obj_id.\r\n	The obj_id is hashed to select a hash bucket. Each hash bucket has a\r\n	doubly-linked list of objects that belong in this hash bucket, as\r\n	well as a count of the objects in the bucket.</p>\r\n	<li/>\r\n<p class=\"western\">Cache: Yaffs provides a read/write cache\r\n	that significantly improves performance for short operations. The\r\n	size of the cache can be set at run-time.</p>\r\n</ul>\r\n<p class=\"western\">The usage of these structures is described in more\r\ndetail below.</p>\r\n<p class=\"western\">Yaffs makes significant use of doubly-linked\r\nlists. These data structures are very useful because they provide\r\nrapid insertion, removal and traversal. They do however come at the\r\nexpense of requiring two pointers rather than just one that would be\r\nrequired by a singly-linked list.</p>\r\n<h2 class=\"western\">12.1 Yaffs objects (struct yaffs_obj)</h2>\r\n<p class=\"western\">Each object (file, directory,...) in the system is\r\nrepresented by a yaffs_obj structure \r\n</p>\r\n<p class=\"western\">The yaffs_obj\'s main function is to store most of\r\nthe object metadata and type-specific information. This means that\r\nalmost all the information about an object can be accessed\r\nimmediately without reading flash.</p>\r\n<p class=\"western\">The metadata includes, amongst others:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">obj_id:\r\n	The number used to identify the object.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">parent:\r\n	A pointer to the parent directory. Not all objects have a parent.\r\n	The root director and special directories for unlinked and deleted\r\n	files do not have parents so this is NULL.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">short_name:\r\n	If the name is short enough to fit in a small fixed-sized array\r\n	(default 16 characters) then it is stored here otherwise it must be\r\n	fetched from flash each time it is requested.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">type:\r\n	Type of object.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Permissions,\r\n	time, ownership and other attributes</font></p>\r\n</ul>\r\n<p class=\"western\"><font size=\"3\" style=\"font-size: 12pt\">Depending\r\non the object type, yaffs_obj also stores:</font></p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">A\r\n	tnode tree, file extents etc for data files</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">A\r\n	directory chain for directories</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">An\r\n	equivalent object for hard links</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">A\r\n	string for symbolic links</font></p>\r\n</ul>\r\n<h2 class=\"western\">12.2 Look-up by obj_id</h2>\r\n<p class=\"western\">The purpose of this mechanism is to rapidly access\r\nan object by its device and obj_id. This is required during garbage\r\ncollection, scanning and similar operations.</p>\r\n<p class=\"western\">Each yaffs_dev uses a hash table for this purpose.\r\nThe hash table has 256 “buckets” (tunable), each holding a\r\ndoubly-linked list of the yaffs_objs in that bucket.</p>\r\n<p class=\"western\">The hash table\'s hash function is just masking the\r\nleast significant bits of the obj_id. This is a very cheap function\r\nthat provides reasonable “spread”.</p>\r\n<p class=\"western\">Yaffs makes an attempt to assign obj_ids in a way\r\nthat keeps the number of objects in each hash bucket quite low, thus\r\npreventing any one hash entry getting too long.</p>\r\n<p class=\"western\">This mechanism is also charged with assigning new\r\n(unique) obj_id values.</p>\r\n<h2 class=\"western\">12.3 Directory structure</h2>\r\n<p class=\"western\">The purpose of the directory structure is to\r\nrapidly access an object by name. This is required to perform file\r\noperations such as opening, renaming etc.</p>\r\n<p class=\"western\"><font size=\"3\" style=\"font-size: 12pt\">The Yaffs\r\ndirectory structure is formed by a tree of objects of type\r\nYAFFS_OBJECT_TYPE_DIRECTORY. These objects have a doubly linked node\r\nof children.</font></p>\r\n<p class=\"western\">Each yaffs_obj also has a doubly linked list node\r\ncalled sibling which chain together the siblings in a directory.</p>\r\n<p class=\"western\">Each Yaffs partition has a root directory.</p>\r\n<p class=\"western\">Each yaffs partition also has some special purpose\r\n“fake” directories which are not stored in NAND but are instead\r\ncreated on mounting:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">lost+found: This directory is used as a\r\n	place to store any lost file parts that cannot be placed in the\r\n	normal directory tree.</p>\r\n	<li/>\r\n<p class=\"western\">Unlinked and deleted: These are\r\n	pseudo-directories that are not in the directory tree. Placing\r\n	objects in these directories gives them a status of being unlinked\r\n	or deleted.</p>\r\n</ul>\r\n<p class=\"western\" align=\"left\">Each object has a name that is used\r\nto look up the object within the directory, Thus, each name within a\r\ndirectory must be unique. This rule does not apply to objects in the\r\nunlinked and deleted pseudo-directories since we never use names to\r\nlook up unlinked/deleted files and there may be many files of the\r\nsame name that have been deleted.</p>\r\n<p class=\"western\">Name resolution is sped up by two mechanisms:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">short_names\r\n	are stored directly in the yaffs_obj so that they don\'t have to be\r\n	loaded from flash.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Each\r\n	object has a “name sum”. This is a simple hashing of the name\r\n	which speeds up the matching process because it is cheaper to\r\n	compare the hash than compare the whole name string.</font></p>\r\n</ul>\r\n<p class=\"western\"><img src=\"data:image/png;base64,[encoded data, 22776 characters]\" name=\"Object2\" align=\"left\" width=\"412\" height=\"355\">\r\n  <br clear=\"left\"/>\r\n</img>\r\n<br/>\r\n<br/>\r\n\r\n</p>\r\n\r\n<p class=\"western\">The above directory structure represents the\r\nfollowing directory tree</p>\r\n<table width=\"605\" cellpadding=\"4\" cellspacing=\"0\">\r\n	<col width=\"119\">\r\n	<col width=\"468\">\r\n	<tr valign=\"top\">\r\n		<td width=\"119\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font face=\"Courier, monospace\"><font size=\"3\" style=\"font-size: 12pt\">/</font></font></p>\r\n		</td>\r\n		<td width=\"468\" style=\"border: 1px solid #000000; padding: 0.1cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">Root directory</font></p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"119\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font face=\"Courier, monospace\"><font size=\"3\" style=\"font-size: 12pt\">/a</font></font></p>\r\n		</td>\r\n		<td width=\"468\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">Directory containing c,d,e</font></p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"119\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font face=\"Courier, monospace\"><font size=\"3\" style=\"font-size: 12pt\">/b</font></font></p>\r\n		</td>\r\n		<td width=\"468\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">Empty directory</font></p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"119\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font face=\"Courier, monospace\"><font size=\"3\" style=\"font-size: 12pt\">/lost+found</font></font></p>\r\n		</td>\r\n		<td width=\"468\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">Empty directory</font></p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"119\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font face=\"Courier, monospace\"><font size=\"3\" style=\"font-size: 12pt\">/a/c</font></font></p>\r\n		</td>\r\n		<td width=\"468\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">Directory</font></p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"119\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font face=\"Courier, monospace\"><font size=\"3\" style=\"font-size: 12pt\">/a/d</font></font></p>\r\n		</td>\r\n		<td width=\"468\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">Data file</font></p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"119\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font face=\"Courier, monospace\"><font size=\"3\" style=\"font-size: 12pt\">/a/e</font></font></p>\r\n		</td>\r\n		<td width=\"468\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">Data file</font></p>\r\n		</td>\r\n	</tr>\r\n</table>\r\n<p class=\"western\" align=\"left\" style=\"margin-bottom: 0cm; orphans: 0; widows: 0; page-break-before: auto\">\r\n<br/>\r\n\r\n</p>\r\n<p class=\"western\">If a Yaffs partition has been somehow corrupted\r\nthen it is possible for an object to be created during scanning but\r\nwith no object header (which contains the object name) being found.\r\nThe object would then not have a name. In these cases, Yaffs creates\r\na pseudonym from the object number of the form objnnnn so that the\r\nobject can be placed in the directory structure. \r\n</p>\r\n\r\n<h2 class=\"western\" style=\"page-break-before: always\">12.4 Hard links</h2>\r\n<p class=\"western\">In POSIX file systems, the objects (inodes in\r\nLinux terminology, vnode in BSD-speak) and the object names (dentry\r\nin Linux terminology)  are independent in that an object can have\r\nzero, one or more names.</p>\r\n<p class=\"western\">Having files with zero links is caused by\r\nconstructs such as:</p>\r\n<p class=\"western\" align=\"left\" style=\"margin-left: 1.25cm; margin-bottom: 0cm; orphans: 0; widows: 0; page-break-before: auto\">\r\n<font face=\"Courier 10 Pitch\"><font size=\"1\" style=\"font-size: 8pt\"><code class=\"western\"><font size=\"2\" style=\"font-size: 10pt\">h\r\n= open(“foo”,O_CREAT | O_RDWR, S_IREAD | S_IWRITE); /* create\r\nfile “foo” */</font></code></font></font></p>\r\n<p class=\"western\" align=\"left\" style=\"margin-left: 1.25cm; margin-bottom: 0cm; orphans: 0; widows: 0; page-break-before: auto\">\r\n<font face=\"Courier 10 Pitch\"><font size=\"1\" style=\"font-size: 8pt\"><code class=\"western\"><font size=\"2\" style=\"font-size: 10pt\">unlink(“foo”);	/*\r\nunlink it </font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 10pt\">to\r\nremove</font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 10pt\">\r\ndirectory </font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 10pt\">entry\r\n</font></code><code class=\"western\"><font size=\"2\" style=\"font-size: 10pt\">*/</font></code></font></font></p>\r\n<p class=\"western\" align=\"left\" style=\"margin-left: 1.25cm; margin-bottom: 0cm; orphans: 0; widows: 0; page-break-before: auto\">\r\n<font face=\"Courier 10 Pitch\"><font size=\"1\" style=\"font-size: 8pt\"><code class=\"western\"><font size=\"2\" style=\"font-size: 10pt\">/*\r\nwe still have a handle to the file so can still access it via the\r\nhandle */</font></code></font></font></p>\r\n<p class=\"western\" align=\"left\" style=\"margin-left: 1.25cm; margin-bottom: 0cm; orphans: 0; widows: 0; page-break-before: auto\">\r\n<font face=\"Courier 10 Pitch\"><font size=\"1\" style=\"font-size: 8pt\"><code class=\"western\"><font size=\"2\" style=\"font-size: 10pt\">read(h,buffer,100);	</font></code></font></font></p>\r\n<p class=\"western\" align=\"left\" style=\"margin-left: 1.25cm; margin-bottom: 0cm; orphans: 0; widows: 0; page-break-before: auto\">\r\n<font face=\"Courier 10 Pitch\"><font size=\"1\" style=\"font-size: 8pt\"><code class=\"western\"><font size=\"2\" style=\"font-size: 10pt\">write(h,buffer,100);</font></code></font></font></p>\r\n<p class=\"western\" align=\"left\" style=\"margin-left: 1.25cm; margin-bottom: 0cm; orphans: 0; widows: 0; page-break-before: auto\">\r\n<font face=\"Courier 10 Pitch\"><font size=\"1\" style=\"font-size: 8pt\"><code class=\"western\"><font size=\"2\" style=\"font-size: 10pt\">close(h);\r\n/* as soon as the handle is closed the file is deleted */</font></code></font></font></p>\r\n<p class=\"western\" align=\"left\" style=\"margin-left: 1.25cm; margin-bottom: 0cm; orphans: 0; widows: 0; page-break-before: auto\">\r\n<br/>\r\n\r\n</p>\r\n<p class=\"western\">Yaffs does not store separate object and name\r\nrecords because that would waste space and incur extra\r\nreading/writing. Instead, Yaffs is optimised for the most typical\r\ncase of one name per object. That is, Yaffs stores one name per\r\nyaffs_obj and uses “cheats” to achieve other behavior:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">Objects that have zero names (ie unlinked\r\n	objects) are handled by renaming the object into a fake directory\r\n	that is used to designate unlinked objects.</p>\r\n	<li/>\r\n<p class=\"western\">Multiple names object are handled by\r\n	designating one of the objects the main object and having multiple\r\n	hard link pseudo-objects that refer to it.</p>\r\n	<li/>\r\n<p class=\"western\">The inode number (vnid in BSD-speak) is a\r\n	per-file system unique number that identifies the object. The Yaffs\r\n	obj_id of the main object is presented to the user. That is, if the\r\n	inode number is queried from a hardlink object then the obj_id of\r\n	the equivalent object is returned.</p>\r\n</ul>\r\n<p class=\"western\">The linkage between hard link pseudo-objects and\r\ntheir equivalent object is through two fields:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">Each object has a hard_links doubly linked\r\n	list node that links the list of hard links to that object.</p>\r\n	<li/>\r\n<p class=\"western\">Each hard link has a equiv_obj pointer to\r\n	the “equivalent object”.</p>\r\n</ul>\r\n\r\n<p class=\"western\" style=\"page-break-before: always\">The usage of\r\nthis structure is straight forward except for one interesting case\r\nwhen hard links are being deleted. Consider the following sequence of\r\nevents:</p>\r\n<table width=\"605\" cellpadding=\"4\" cellspacing=\"0\">\r\n	<col width=\"50\">\r\n	<col width=\"80\">\r\n	<col width=\"449\">\r\n	<tr valign=\"top\">\r\n		<td width=\"50\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">1</font></p>\r\n		</td>\r\n		<td width=\"80\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\"># touch a</font></p>\r\n		</td>\r\n		<td width=\"449\" style=\"border: 1px solid #000000; padding: 0.1cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">Create file a</font></p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"50\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">2</font></p>\r\n		</td>\r\n		<td width=\"80\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\"># ln a b</font></p>\r\n		</td>\r\n		<td width=\"449\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">Create a hard link b with\r\n			equivalent object a.</font></p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"50\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">3</font></p>\r\n		</td>\r\n		<td width=\"80\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\"># rm a</font></p>\r\n		</td>\r\n		<td width=\"449\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\" align=\"left\" style=\"orphans: 0; widows: 0; page-break-before: auto\">\r\n			<font size=\"3\" style=\"font-size: 12pt\">Remove a. The object must\r\n			still exist under the name b</font></p>\r\n		</td>\r\n	</tr>\r\n</table>\r\n<p class=\"western\" align=\"left\" style=\"margin-bottom: 0cm; orphans: 0; widows: 0; page-break-before: auto\">\r\n<br/>\r\n\r\n</p>\r\n<p class=\"western\">In step 3, Yaffs cannot just delete the equivalent\r\nobject since that would leave a “hanging” hard link with no\r\nequivalent object. \r\n</p>\r\n<p class=\"western\">We also cannot just change the type of one of the\r\nhardlink objects because that would cause the object\'s obj_id to\r\nchange. This would be unacceptable since it would break any mechanism\r\nthat use the obj_id (of which there are many within and outside of\r\nYaffs).</p>\r\n<p class=\"western\">Thus, if an object is deleted and it has hard\r\nlinks to it then we do the following:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">Select one of the object\'s hard links.</p>\r\n	<li/>\r\n<p class=\"western\">Rename the object to the name in the hard\r\n	link.</p>\r\n	<li/>\r\n<p class=\"western\">Delete the hard link pseudo-object.</p>\r\n</ul>\r\n<h2 class=\"western\">12.5 Symbolic links and special objects</h2>\r\n<p class=\"western\">These object types just store values that are\r\nneeded to provide a full POSIX file system.</p>\r\n<p class=\"western\">A symbolic link object saves a symbolic link\r\nstring that is used to provide the POSIX symbolic string mechanism.</p>\r\n<p class=\"western\">A special object is used to store entries for\r\ndevice numbers, pipes and other similar special objects.</p>\r\n<h2 class=\"western\">12.6 File objects</h2>\r\n<p class=\"western\">The yaffs_Objects have a type and a variant\r\nportion which is a union of different data required to hold the state\r\nof different object types.</p>\r\n<p class=\"western\">The file objects have type YAFFS_OBJECT_TYPE_FILE,\r\nand an associated file variant. This stores the following main\r\nvalues:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">file_size:\r\n	file size</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">top_level:\r\n	depth of the Tnode tree</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">top:\r\n	pointer to top of Tnode tree</font></p>\r\n</ul>\r\n<p class=\"western\">The meaning of the file size is quite obvious.\r\nThis is the current length of the file. Note that a file might have\r\nholes in it caused by seeking forward past the extents of the file.</p>\r\n<p class=\"western\">The top and top_level work together to control the\r\nTnode trees. \r\n</p>\r\n<h3 class=\"western\" style=\"page-break-before: always\">12.6.1 Tnode\r\ntree</h3>\r\n<p class=\"western\">Each file has a tnode tree to provide the mapping\r\nfrom file position to actual NAND chunk address. top is a pointer to\r\nthe top of the tnode tree</p>\r\n\r\n<p class=\"western\"><img src=\"data:image/png;base64,[encoded data, 20236 characters]\" name=\"Object1\" align=\"left\" width=\"385\" height=\"378\">\r\n  <br clear=\"left\"/>\r\n</img>\r\n<br/>\r\n<br/>\r\n\r\n</p>\r\n<p class=\"western\">The tnode tree is made up of tnodes (tree nodes)\r\narranged in levels, each of which holds either:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">At levels greater than 0, a tnode has 8\r\n	pointers to other tnodes in the next level down.</p>\r\n	<li/>\r\n<p class=\"western\">At level 0, a tnode has 16 NAND chunk Ids\r\n	which identify the chunk\'s location in RAM.</p>\r\n</ul>\r\n<p class=\"western\">These numbers are powers of 2 which makes for\r\nsimple look-ups by just applying bitmasks. The code that traverses\r\nthis tree is in yaffs_find_tnode_0().</p>\r\n<p class=\"western\">As the file size grows, more tnodes are added and\r\nas the levels fill, more levels are added. If the file is truncated\r\nor resized downwards, then the tree is pruned. If a chunk in a file\r\nis replaced (eg. data is overwritten or copied by garbage collection)\r\nthen the tnode tree must be updated to reflect the change.</p>\r\n<p class=\"western\">Tnodes typically make up the bulk of the Yaffs\'\r\nRAM usage.</p>\r\n<h1 class=\"western\">13 How various mechanisms work</h1>\r\n<p class=\"western\">Having looked at the Yaffs data structures, we now\r\nconsider how some of the mechanisms in Yaffs operates. This is most\r\neasily done by walking through some operations that Yaffs performs.</p>\r\n<h2 class=\"western\">13.1 Block and chunk management</h2>\r\n<h3 class=\"western\">13.1.1 Block states</h3>\r\n<p class=\"western\">Yaffs tracks the state of each block and chunk in\r\nthe partition. This information is first built up during scanning (or\r\nrecovered from a checkpoint). A block may be in one of the following\r\nstates (see definition of  enum yaffs_block_state):</p>\r\n\r\n<table width=\"605\" cellpadding=\"4\" cellspacing=\"0\">\r\n	<col width=\"146\">\r\n	<col width=\"441\">\r\n	<tr valign=\"top\">\r\n		<td width=\"146\" style=\"border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">UNKNOWN</p>\r\n		</td>\r\n		<td width=\"441\" style=\"border: 1px solid #000000; padding: 0.1cm\">\r\n			<p class=\"western\">The block state is not yet known.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"146\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">NEEDS_SCANNING</p>\r\n		</td>\r\n		<td width=\"441\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">During pre-scanning it has been determined that\r\n			this block has something on it and needs scanning.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"146\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">SCANNING</p>\r\n		</td>\r\n		<td width=\"441\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">This block is currently being scanned.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"146\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">EMPTY</p>\r\n		</td>\r\n		<td width=\"441\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">This block has nothing in it (is erased) and\r\n			may be used for allocation. The block can get to this state by\r\n			being erased.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"146\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">ALLOCATING</p>\r\n		</td>\r\n		<td width=\"441\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">This is the block currently being used for\r\n			allocation by the chunk allocator.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"146\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">FULL</p>\r\n		</td>\r\n		<td width=\"441\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">All the chunks in this block have been\r\n			allocated and at least one chunk contains useful information that\r\n			has not yet been deleted.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"146\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">DIRTY</p>\r\n		</td>\r\n		<td width=\"441\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">All the chunks in this block have been\r\n			allocated and all have been deleted. The block might have been in\r\n			the FULL or COLLECTING state before this. This block can now be\r\n			erased and returned to EMPTY state.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"146\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">CHECKPOINT</p>\r\n		</td>\r\n		<td width=\"441\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">This block has checkpoint data in it. When the\r\n			checkpoint is invalidated this block will be erased and returned\r\n			to the EMPTY state.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"146\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">COLLECTING</p>\r\n		</td>\r\n		<td width=\"441\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">This block is being garbage collected. As soon\r\n			as all live data has been inspected this block becomes DIRTY.</p>\r\n		</td>\r\n	</tr>\r\n	<tr valign=\"top\">\r\n		<td width=\"146\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm\">\r\n			<p class=\"western\">DEAD</p>\r\n		</td>\r\n		<td width=\"441\" style=\"border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm\">\r\n			<p class=\"western\">This block has been retired or was marked bad.\r\n			This is a terminal state.</p>\r\n		</td>\r\n	</tr>\r\n</table>\r\n<p class=\"western\"><img src=\"data:image/png;base64,[encoded data, 42088 characters]\" name=\"Object3\" align=\"left\" width=\"575\" height=\"510\">\r\n  <br clear=\"left\"/>\r\n</img>\r\n<br/>\r\n<br/>\r\n\r\n</p>\r\n<p class=\"western\">The regular runtime states are; EMPTY, ALLOCATING,\r\nFULL, COLLECTING and DIRTY.</p>\r\n<p class=\"western\">The checkpoint state is used for checkpoint\r\nblocks.</p>\r\n<p class=\"western\">The DEAD state is the terminal state for blocks\r\nthat were retired because they were either marked bad or an error was\r\ndetected.</p>\r\n<h3 class=\"western\">13.1.2 Block and chunk allocation</h3>\r\n<p class=\"western\">An available chunk must be allocated before it can\r\nbe written. The chunk allocation mechanism is provided by\r\nyaffs_alloc_chunk() and is very simple. Each yaffs_dev has a current\r\nblock that it is allocating from. This is termed the <i><b>allocation\r\nblock </b></i><i><b>(alloc_block)</b></i>. Chunks are allocated\r\nsequentially from the allocation block. As the chunks are allocated,\r\nblock and chunk management information is updated, including the\r\nblock\'s pages_in_use count and the chunk use bitmap.</p>\r\n<p class=\"western\">When the block is fully allocated, another empty\r\nblock is selected to become the allocation block. The blocks are\r\nselected by searching upwards from the previous allocation block.</p>\r\n<p class=\"western\">In older versions of Yaffs, the Yaffs scanning\r\nwould identify the allocation block being used when the file system\r\nwas last shut down and would continue allocation from that point.\r\nThis had the benefit of continuing to use the same block and slightly\r\nreduce garbage creation. However, doing this could potentially cause\r\nproblems due to attempting to write a block that had been in the\r\nmiddle of a write when power was lost. Thus Yaffs now always starts\r\nallocation on a new block after a mount. This slightly increases the\r\namount of garbage (typically by an insignificant amount) but improves\r\nrobustness.</p>\r\n<h3 class=\"western\">13.1.3 A word about wear leveling</h3>\r\n<p class=\"western\">Since flash memory blocks can only endure a\r\nlimited number of writes and erases ( termed the flash endurance), a\r\nflash file system needs to ensure that the same few blocks are not\r\noverwritten continuously causing those blocks to wear out while the\r\nother blocks are hardly used at all.. Instead it is important that\r\nthe file system spreads out the wear.</p>\r\n<p class=\"western\">This is extremely important in a file system such\r\nas FAT which uses a limited set of logical blocks to store the file\r\nallocation table entries which get modified frequently. If FAT is\r\nused with a static logical to physical block mapping then the file\r\nallocation table blocks will wear out far before other blocks causing\r\npremature device failure. Thus, for FAT, it is very important that\r\nthe logical to physical mapping gets stirred up a bit to cause the\r\nfile allocation tables to be written to different physical blocks,\r\nthus leveling out the wear.</p>\r\n<p class=\"western\">Wear leveling is far less of a concern in a log\r\nstructured file system such as Yaffs since we always write to the end\r\nof the log and thus don\'t keep on overwriting the same blocks.</p>\r\n<p class=\"western\">There are basically two ways to achieve wear\r\nleveling:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Use a\r\n	specifically written set of functions that actively perform wear\r\n	leveling.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Allow\r\n	a degree of wear leveling to happen as a side effect of other\r\n	activity.</font></p>\r\n</ul>\r\n<p class=\"western\">Yaffs takes the second approach.</p>\r\n<p class=\"western\">Firstly, being log structured, Yaffs inherently\r\nspreads out the wear by performing all writes in sequence. That means\r\nthat we don\'t single out a few blocks for a specific purpose and\r\nwrite them more than others.</p>\r\n<p class=\"western\">Secondly, blocks are allocated serially from the\r\nerased blocks in the partition. Thus the process of erasing (after\r\ndeletion of garbage collection) and then allocating blocks does tend\r\nto spread the block use and provides a level of wear leveling.</p>\r\n<p class=\"western\">Thus, even though there is no code to specifically\r\nperform wear leveling it does happen as a side effect of other\r\nactivity.</p>\r\n<p class=\"western\">This strategy performs well and has survived many\r\naccelerated lifetime tests in both simulations and on real NAND-based\r\nproducts.</p>\r\n<h3 class=\"western\">13.1.4 Management of yaffs_tnode and yaffs_obj\r\nstructures</h3>\r\n<p class=\"western\">yaffs_tnodes and yaffs_objs are dynamically\r\ncreated and released as they are needed. \r\n</p>\r\n<p class=\"western\">The allocation and management could be done by\r\njust using the standard memory allocator (malloc, kmalloc etc), but\r\nthis could cause performance problems, particularly in embedded\r\nsystems which tend to have rather simplistic memory allocators. \r\n</p>\r\n<p class=\"western\">The allocation and deletion of many small\r\nstructures can cause memory fragmentation causing out-of-memory and\r\nslowdown problems.</p>\r\n<p class=\"western\">To prevent these problems, Yaffs manages these\r\nobjects internally. Yaffs creates many structures (100 or so) at a\r\ntime and then allocates them singly from a free list. When structures\r\nare released they are placed on the free list for reuse.</p>\r\n<h2 class=\"western\">13.2 Internal cache</h2>\r\n<p class=\"western\">This describes the standard Yaffs internal cache\r\nimplementation. Alternative caches have been devised for other\r\npurposes and at some future point Yaffs might be extended to support\r\npluggable cache policies.</p>\r\n<p class=\"western\">The main purpose of the internal cache is to\r\nreduce NAND access for  badly behaved applications which perform many\r\nsmall reads and writes. Believe it or not, but there are applications\r\nout there that read or write files a few bytes at a time:</p>\r\n<p class=\"code-western\"><code class=\"western\">while(...)<br/>\r\n	write(h,buf,1);</code></p>\r\n<p class=\"western\" style=\"margin-left: 1.25cm\"><br/>\r\n<br/>\r\n\r\n</p>\r\n<p class=\"western\">This sort of behavior would be terrible for\r\nperformance and flash memory life if each read or write operation\r\nresulted in a flash access. Yaffs provides an internal cache to\r\nmitigate against this sort of behaviour.</p>\r\n<p class=\"western\">The Yaffs internal cache is called a “Short Op\r\nCache” (short operation cache) and only comes in to play for\r\noperations which are not chunk aligned. The caching mechanism is very\r\nsimple and was primarily written for less sophisticated OSs that lack\r\ntheir own file caching layer. The cache is still beneficial in OSs\r\nlike Linux, which provide a caching layer, because it caches both the\r\nread and write path. Thus, while short reads will be serviced by the\r\nLinux page cache, the short op cache does address non-chunk aligned\r\nwrites.</p>\r\n<p class=\"western\">Page aligned reads/writes bypass the cache unless\r\nthat chunk is already in the cache, except when inband tags are used.\r\nInband tags always require the cache because the cache is used to\r\nbuild up the buffer where the tags are attached to the data chunk\r\nbeing written.</p>\r\n<p class=\"western\">The cache is stored in an array of cache entries.\r\nThe number of cache entries is set in the yaffs_dev parameters\r\nn_caches and the cache is configured during initialisation. n_caches\r\nof zero disables the cache. The cache management algorithms are\r\nsimplistic and probably don\'t scale well to very large numbers. This\r\nmeans that it is probably best to stick with around 5 to 20 cache\r\nentries.</p>\r\n<p class=\"western\">Each cache entry holds:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">obj_id, chunk id, nbytes (the tag info of\r\n	the chunk being cached)</p>\r\n	<li/>\r\n<p class=\"western\">The actual data bytes</p>\r\n	<li/>\r\n<p class=\"western\">Cache slot status (last used counter,\r\n	dirty,...)</p>\r\n</ul>\r\n<p class=\"western\">Finding an unused cache entry is a simple\r\noperation. We just iterate through the cache entries searching for\r\none that is not assigned. If all cache entries are busy then a cache\r\npush-out is performed to free up a cahce entry.</p>\r\n<p class=\"western\">Whenever a cache entry is accessed (read or\r\nwritten) the last-use counter is is set to an incrementing number.\r\nThis counter value is used to drive the least-recently-used (LRU)\r\nalgorithm.</p>\r\n<p class=\"western\">Cache entries which have been modified and not yet\r\nwritten back to flash are marked with a dirty flag. This is tells us\r\nwhether we need to write out the data during a flush or push-out.</p>\r\n<p class=\"western\">A push-out happens whenever the cache is full and\r\nwe need to push an entry out of the cache to make space to load a new\r\nentry. Yaffs uses the LRU algorithm to select the LRU cache entry,\r\nwrite it out if needed and then assign that for use.</p>\r\n<p class=\"western\">Whenever a file is flushed (file flush or close),\r\nthe file\'s dirty entries are written out. At certain times (eg.\r\nbefore an unmount or at sync()) the entire cache is flushed.</p>\r\n<p class=\"western\">This caching policy is gives a useful performance\r\nimprovement with very simple algorithms (ie good bang-for-bucks).</p>\r\n<p class=\"western\">Apart from its normal caching function, the short\r\nop cache also does much of the heavy lifting for inband tags support\r\nsince all the inband tags accesses are not chunk aligned and must\r\ntypically be re-aligned. The cache  makes this easy.</p>\r\n<h2 class=\"western\">13.3 Scanning</h2>\r\n<p class=\"western\">Scanning is the process whereby file system state\r\nis rebuilt from scratch. This happens on mounting a Yaffs partition\r\nif no checkpoint data is available or if the mounting was told to\r\nignore the checkpoint data.</p>\r\n<p class=\"western\">Scanning involves reading the tags from all the\r\nactive chunks in the system so can take quite a while, but probably\r\nless time than you\'d expect.</p>\r\n<p class=\"western\">The scanning process is different for Yaffs1 vs\r\nYaffs2 because of the differences mentioned before.</p>\r\n<h3 class=\"western\">13.3.1 Yaffs1 scanning</h3>\r\n<p class=\"western\">Yaffs1 scanning is rather straight forward because\r\nYaffs1 uses deletion markers.</p>\r\n<p class=\"western\">All we really need to do is read the tags off all\r\nthe chunks in the partition and determine if the chunk is active.\r\nOrder is not important and blocks could be read in any order. If the\r\ndeletion marker has not been set then it is active and we need to add\r\nthe chunk to the file system state as follows:</p>\r\n<p class=\"western\">If the chunk is a data chunk (chunk_id &gt; 0)\r\nthen the chunk must be added to the relevant file\'s tnode tree. If\r\nthe object does not exist, then we create it in lost+found, although\r\nit has no name and other file details yet.</p>\r\n<p class=\"western\">If the chunk is an object header (chunk_id == 0)\r\nthen the object must be created (or it might already exist in lost +\r\nfound and we need to fix up its details and slot it into the correct\r\npart of the directory tree.</p>\r\n<p class=\"western\">If at any time during scanning we find that we are\r\nreading a second chunk with the same obj_id:chunk_id as a previously\r\nencountered chunk then the 2-bit serial number is used to resolve the\r\ndispute.</p>\r\n<p class=\"western\">Once the scanning is complete we still need to fix\r\nup a few things: \r\n</p>\r\n<p class=\"western\">Hard links must be connected up properly (it is\r\nmore efficient to defer this until after the scanning has completed).</p>\r\n<p class=\"western\">Also, objects which were marked as unlinked must\r\nbe deleted since there are no longer handles open to these objects.</p>\r\n<h3 class=\"western\">13.3.2 Yaffs2 scanning</h3>\r\n<p class=\"western\">Yaffs2 has no deletion markers which makes the\r\nscanning significantly more complex.</p>\r\n<p class=\"western\">The first thing that needs to be done is to\r\npre-scan the blocks to determine the sequence number for the blocks.\r\nThe list of blocks and sequence numbers is then sorted to make a\r\nchronologically ordered list.</p>\r\n<p class=\"western\">Yaffs then scans <i><b>backwards</b></i> through\r\nthese blocks (ie in reverse chronological order). Thus, the first\r\nencountered  obj_id:chunk_id pair is the current one and subsequent\r\nchunks with those tags are out of date.</p>\r\n<p class=\"western\" style=\"margin-left: 1.25cm\">We read the tags for\r\neach chunk in each block. \r\n</p>\r\n<p class=\"western\" style=\"margin-left: 1.25cm\">If it is a data chunk\r\n( ie. chunk_id &gt; 0) then:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">If a chunk with the same obj_id:chunk_id\r\n	has already been found then this is not the current chunk. Delete\r\n	this one.</p>\r\n	<li/>\r\n<p class=\"western\">Else if the object is marked as deleted, or\r\n	corrupted, then delete it.</p>\r\n	<li/>\r\n<p class=\"western\">Else if the object does not yet exist then\r\n	this chunk was written since the last object header write for this\r\n	object so this chunk must be the last written chunk in the file and\r\n	must have happened just before an unclean shutdown with the file\r\n	still open. We can create the file and use the chunk_id and nbytes\r\n	to set the file extents.</p>\r\n	<li/>\r\n<p class=\"western\">Else if the object does exist and the chunk\r\n	lies beyond the object\'s file scan size (extents) then it is a\r\n	truncated chunk and can be deleted.</p>\r\n	<li/>\r\n<p class=\"western\">Else it is placed into the file\'s tnode\r\n	tree.</p>\r\n</ul>\r\n<p class=\"western\" style=\"margin-left: 1.25cm\">If it is an object\r\nheader (ie. chunk_id == 0) then:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">If the object is in the deleted directory\r\n	then mark the object as deleted and set the object\'s shrink size to\r\n	zero.</p>\r\n	<li/>\r\n<p class=\"western\">Else if an object header has not yet been\r\n	found for this object, then this is the most current object header\r\n	and holds the most current name etc.  If no data chunks have yet\r\n	been found for this chunk then the size in the object header is also\r\n	the file extents. The file size is used to set the file scan size\r\n	since at the time it was written the file did not extend past that\r\n	point and we can safely ignore further data chunks for that file\r\n	that extend past that point.</p>\r\n	<li/>\r\n<p class=\"western\">Else just use the file size as the scan\r\n	size if it is smaller than the current file scan size.</p>\r\n	<li/>\r\n<p class=\"western\">Else this an obsolete object header. It is\r\n	deleted.</p>\r\n</ul>\r\n<p class=\"western\">A bit more explanation is probably needed to\r\ndescribe the file scan size. The whole purpose of this is to\r\ndetermine data chunks that should be ignored due to the file being\r\ntruncated.</p>\r\n<h2 class=\"western\">13.4 Checkpoint</h2>\r\n<p class=\"western\">Mount scanning takes quite a lot of time and slows\r\nmounting, though perhaps by less than you\'d think. Checkpointing is a\r\nmechanism to speed the mounting by taking a snapshot of the Yaffs\r\nruntime state at unmount or sync() and then reconstituting the\r\nruntime state on re-mounting. The speed up is dramatic.</p>\r\n<p class=\"western\">The actual checkpoint mechanism is quite simple. A\r\n“stream” of data is written to a set of blocks which are marked\r\nas holding checkpoint data and the important runtime state is written\r\nto the stream.</p>\r\n<p class=\"western\">Not all state needs to be saved, only the state\r\nneeded to reconstitute the structure of the runtime data. For\r\nexample, file metadata need not be saved since it is very easy to\r\nload that through lazy-loading.</p>\r\n<p class=\"western\">The checkpoint stores data in the following order:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Start\r\n	marker, including checkpoint format id.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">yaffs_dev\r\n	information</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Block\r\n	information</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Chunk\r\n	flags</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Objects,\r\n	including file structure</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">End\r\n	marker</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Checksum</font></p>\r\n</ul>\r\n<p class=\"western\">The checkpoint validity is ensured by the\r\nfollowing mechanisms:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">The\r\n	data is stored using whatever ECC mechanisms are in place.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">The\r\n	start marker includes a checkpoint version so that an obsolete\r\n	checkpoint will not be read if the checkpoint code changes.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Data\r\n	is written to the stream as structured records, each with a type and\r\n	size.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">The\r\n	end marker must be read when expected.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">Two\r\n	checksums are maintained across the whole checkpoint data set.</font></p>\r\n</ul>\r\n<p class=\"western\">If any checks fail, the checkpoint is ignored and\r\nthe state is re-scanned.</p>\r\n<p class=\"western\">The astute reader might notice that block state\r\nchanges as we\'re writing checkpoint blocks, so how do we manage to\r\nre-constitute the block states correctly? This is achieved by the\r\nfollowing:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">As we\r\n	write the checkpoint, the checkpoint block allocation selects EMPTY\r\n	blocks. We don\'t change the state as we\'re writing the checkpoint so\r\n	their state is written to the checkpoint as EMPTY or CHECKPOINT, it\r\n	does not really matter which.</font></p>\r\n	<li/>\r\n<p class=\"western\"><font face=\"Liberation Serif, serif\">After\r\n	reading the checkpoint, we know which blocks have been used to store\r\n	checkpoint data. We update those blocks to reflect the CHECKPOINT\r\n	state.</font></p>\r\n</ul>\r\n<p class=\"western\">A checkpoint is invalidated by any modifications\r\n(writes, erases,...) thus any modification path also checks to see if\r\nthere is a checkpoint and erases it.</p>\r\n<p class=\"western\">The regular Yaffs block allocator and garbage\r\ncollection logic also needs to be aware of the approximate size of\r\nthe checkpoint so that these can ensure enough spare space is\r\nreserved to store a checkpoint. There is a calculation that updates\r\nthe value whenever the number of objects etc changes.</p>\r\n<h2 class=\"western\">13.5 Extended tags and packed tags</h2>\r\n<p class=\"western\">Extended tags is an abstraction of a way to store\r\nmore information in the tags, allowing for faster scan times. Packed\r\nTags is a physical implementation of the storage of extended tags.</p>\r\n<p class=\"western\">When we\'re scanning we really only need to build\r\nup the structure of the file system. In other words, rebuild the\r\ndirectory relationships, tnode trees and such. Much of the detail\r\nsuch as file names, permissions etc can be lazy loaded if and when\r\nneeded.</p>\r\n<p class=\"western\">This required storing extra information, such as\r\nthe parent directory and object type, in the tags of object headers.\r\nBut how do we do this without enlarging the tags size?</p>\r\n<p class=\"western\">Object headers always have a chunk_id of zero and\r\nn_bytes has no meaning because it is not a data chunk. By using a\r\nsingle bit to identify object headers we suddenly open up a whole lot\r\nof space that we can stuff full of useful data. By being clever as to\r\nwhat data we use, we can pack in the important data in most\r\ncircumstances.</p>\r\n<p class=\"western\">Sometimes, for example very large files, the\r\npacking will not work because there are insufficient bits to hold the\r\nfield so we just write regular tags instead. That\'s OK since there\r\ncan only be few such files in the system so the performance reduction\r\nonly impacts very few files and the system level impact is\r\nunnoticeable. A simple, cheap, strategy that gives speed up 99% of\r\nthe time is a very handy one.</p>\r\n<p class=\"western\">Other details are lazy-loaded on demand. This will\r\nhappen when the object is looked up (eg. by a file open or searching\r\nfor the file in the directory).</p>\r\n<h2 class=\"western\">13.6 Block summaries</h2>\r\n<p class=\"western\">Scanning requires that the tags for each chunk are\r\nread so that they can be inspected. Reading the tags from each chunk\r\ncan be time consuming. Thus, block summaries were added in 2011.</p>\r\n<p class=\"western\">Block summaries write all the tags data for chunks\r\nin the block into the last few (typically only one) chunk in a block.\r\nThis allows all the tags for chunks in that block to be read in one\r\nhit. Depending on the system throughput (CPU, RAM and flash speeds),\r\nthis can speed up mount time dramatically.</p>\r\n<p class=\"western\">Note that the block summary does not replace the\r\ntags attached to each chunk. Both are written. Thus, if the whole\r\nblock is not written (and the block summary is thus not written), the\r\nchunk tags can still be read and used.</p>\r\n<p class=\"western\">If a block summary is not available for a block,\r\nthen the old mechanism is still used to scan the tags on each chunk.</p>\r\n<h2 class=\"western\">13.7 Inband tags</h2>\r\n<p class=\"western\">Thus far we have considered chunks where there are\r\nsufficient unallocated bytes in the spare (or out of band) area to\r\nstore the tags. \r\n</p>\r\n<p class=\"western\">But what happens if we don\'t have enough space in\r\nthe spare area to store the tags? Inband tags to the rescue! \r\n</p>\r\n<p class=\"western\">With inband tags we store the tags in the flash\r\ndata area alongside the data. This gives us far more flexibility in\r\nthe types of storage that Yaffs can support.</p>\r\n<p class=\"western\">There are three major penalties with inband tags:</p>\r\n<ul>\r\n	<li/>\r\n<p class=\"western\">Due to the loss of chunk alignment, all\r\n	transactions must pass through the short op cache. This costs an\r\n	extra memcpy().</p>\r\n	<li/>\r\n<p class=\"western\"></p>\r\n	<li/>\r\n<p class=\"western\">Reading tags during scanning etc can\r\n	involve reading the whole page, making this slower. The impact is\r\n	minimised by using checkpointing or block summaries.</p>\r\n</ul>\r\n<p class=\"western\">Thus, it is better, performance wise, to only use\r\ninband tags when regular tags will not work.</p>\r\n<h2 class=\"western\">13.8 Soft deletion</h2>\r\n<p class=\"western\">Soft deletion is a mechanism that was added to\r\nspeed up file deletion in Yaffs1 mode.</p>\r\n<p class=\"western\">Looking back to the description of how files are\r\nstored in Yaffs1, you can see that deleting a file involves writing\r\nthe deletion marker of every data chunk in the file. This can take\r\nquite some time for large files.</p>\r\n<p class=\"western\">The soft deletion mechanism was added to avoid\r\nwriting all those deletion markers. Instead of writing the deletion\r\nmarkers, soft deletion instead tracks the number of chunks in each\r\nblock that belong to deleted files and leaves the clean up to the\r\ngarbage collector.</p>\r\n<p class=\"western\">When the garbage collector looks at a block it can\r\nsee what current chunks (ie chunks not yet deleted) belong to deleted\r\nfiles and does not copy those, thus effectively deleting the chunk.\r\nOnce all the chunks associated with a deleted file have cleaned up by\r\nthe garbage collector the file header object can also be deleted.</p>\r\n<p class=\"western\">Yaffs2 mode does not write deletion markers and\r\nthus does not use soft deletion.</p>\r\n\";s:7:\"summary\";s:403:\"This document gives a reasonable explanation of most of the core mechanisms that make Yaffs work. As of the time of writing this, the Yaffs2 code base includes approximately 19,000 lines of code making a very detailed discussion impractical. This document should serve as a first port of call for understanding Yaffs. Further detailed questions and discussions are welcomed on the Yaffs discussion list.\";s:6:\"format\";s:8:\"raw_html\";}}}s:19:\"field_document_type\";a:1:{s:9:\"x-default\";a:1:{i:0;a:1:{s:9:\"target_id\";s:3:\"344\";}}}s:6:\"upload\";a:1:{s:9:\"x-default\";a:1:{i:0;a:3:{s:9:\"target_id\";s:2:\"76\";s:7:\"display\";s:1:\"1\";s:11:\"description\";s:0:\"\";}}}s:18:\"field_teaser_image\";a:1:{s:9:\"x-default\";a:1:{i:0;a:5:{s:9:\"target_id\";s:2:\"89\";s:3:\"alt\";s:28:\"Preview of HowYaffsWorks.pdf\";s:5:\"title\";N;s:5:\"width\";N;s:6:\"height\";N;}}}}s:9:\"\0*\0fields\";a:0:{}s:19:\"\0*\0fieldDefinitions\";N;s:12:\"\0*\0languages\";N;s:14:\"\0*\0langcodeKey\";s:8:\"langcode\";s:21:\"\0*\0defaultLangcodeKey\";s:16:\"default_langcode\";s:17:\"\0*\0activeLangcode\";s:9:\"x-default\";s:18:\"\0*\0defaultLangcode\";s:3:\"und\";s:15:\"\0*\0translations\";a:1:{s:9:\"x-default\";a:1:{s:6:\"status\";i:1;}}s:24:\"\0*\0translationInitialize\";b:0;s:14:\"\0*\0newRevision\";b:0;s:20:\"\0*\0isDefaultRevision\";s:1:\"1\";s:13:\"\0*\0entityKeys\";a:4:{s:6:\"bundle\";s:5:\"paper\";s:2:\"id\";s:3:\"409\";s:8:\"revision\";s:3:\"612\";s:4:\"uuid\";s:36:\"7ded725e-366e-4ad5-a9c4-4d97e16adac0\";}s:25:\"\0*\0translatableEntityKeys\";a:6:{s:5:\"label\";a:1:{s:9:\"x-default\";s:15:\"How Yaffs works\";}s:8:\"langcode\";a:1:{s:9:\"x-default\";s:3:\"und\";}s:6:\"status\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:9:\"published\";a:1:{s:9:\"x-default\";s:1:\"1\";}s:3:\"uid\";a:1:{s:9:\"x-default\";s:1:\"6\";}s:16:\"default_langcode\";a:1:{s:9:\"x-default\";s:1:\"1\";}}s:12:\"\0*\0validated\";b:0;s:21:\"\0*\0validationRequired\";b:0;s:19:\"\0*\0loadedRevisionId\";s:3:\"612\";s:15:\"\0*\0entityTypeId\";s:4:\"node\";s:15:\"\0*\0enforceIsNew\";N;s:12:\"\0*\0typedData\";N;s:16:\"\0*\0cacheContexts\";a:0:{}s:12:\"\0*\0cacheTags\";a:0:{}s:14:\"\0*\0cacheMaxAge\";i:-1;s:14:\"\0*\0_serviceIds\";a:0:{}}',-1,1498105488.845,1,'entity_field_info node_values','814'),