code: def from_page_data(
      cls, tree_conf: TreeConf, data: bytes, page: int = None
  ) -> "Node":
      node_type_byte = data[0:NODE_TYPE_BYTES]
      node_type_int = int.from_bytes(node_type_byte, ENDIAN)
      if node_type_int == 1:
          return LonelyRootNode(tree_conf, data, page)
      elif node_type_int == 2:
          return RootNode(tree_conf, data, page)
      elif node_type_int == 3:
          return InternalNode(tree_conf, data, page)
      elif node_type_int == 4:
          return LeafNode(tree_conf, data, page)
      elif node_type_int == 5:
          return OverflowNode(tree_conf, data, page)
      elif node_type_int == 6:
          return FreelistNode(tree_conf, data, page)
      else:
          assert False, "No Node with type {} exists".format(
              node_type_int
          )
  
imports: import abc
  import bisect
  import math
  from typing import Optional
  from .const import ENDIAN, NODE_TYPE_BYTES, USED_PAGE_LENGTH_BYTES, PAGE_REFERENCE_BYTES, TreeConf
  from .entry import Entry, Record, Reference, OpaqueData
label_desc: Use image node_id 19 for calling the Node obj's underlying member method code with example usage: obj.from_page_data(cls, tree_conf, data, page) and returns: LonelyRootNode, RootNode, InternalNode, LeafNode, OverflowNode, FreelistNode