code: def load(self, data: bytes):
      assert len(data) == self._tree_conf.page_size
      end_used_page_length = NODE_TYPE_BYTES + USED_PAGE_LENGTH_BYTES
      used_page_length = int.from_bytes(
          data[NODE_TYPE_BYTES:end_used_page_length], ENDIAN
      )
      end_header = end_used_page_length + PAGE_REFERENCE_BYTES
      self.next_page = int.from_bytes(
          data[end_used_page_length:end_header], ENDIAN
      )
      if self.next_page == 0:
          self.next_page = None
  
      if self._entry_class is None:
          # For Nodes that cannot hold Entries
          return
  
      try:
          # For Nodes that can hold multiple sized Entries
          entry_length = self._entry_class(self._tree_conf).length
      except AttributeError:
          # For Nodes that can hold a single variable sized Entry
          entry_length = used_page_length - end_header
  
      for start_offset in range(
          end_header, used_page_length, entry_length
      ):
          entry_data = data[start_offset : start_offset + entry_length]
          entry = self._entry_class(self._tree_conf, data=entry_data)
          self.entries.append(entry)
  
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 2 for calling the Node obj's underlying member method code with example usage: obj.load(data) without return types