docs: private N split(N node, int[] splitAxis) {
      if(splitAxis.length != 1) {
        throw new IllegalArgumentException("Expecting integer container for returning the split axis");
      }
      // choose the split dimension and the split point
  
      XSplitter<N, AbstractXTree<N>> splitter = new XSplitter<>(this, node);
      XSplitter.SplitSorting split = splitter.topologicalSplit();
      double minOv = splitter.getPastOverlap();
      if(split == null) { // topological split failed
        if(node.isLeaf()) {
          throw new IllegalStateException("The topological split must be successful in leaves.");
        }
        split = splitter.minimumOverlapSplit();
        if(splitter.getPastOverlap() < minOv) {
          minOv = splitter.getPastOverlap(); // only used for logging
        }
      }
      if(split != null) {// do the split
        N newNode;
        if(node.isLeaf()) {
          newNode = createNewLeafNode();
        }
        else {
          newNode = createNewDirectoryNode();
        }
        node.splitTo(newNode, split.getSortedEntries(), split.getSplitPoint());
        // write changes to file
        writeNode(node);
        writeNode(newNode);
  
        splitAxis[0] = split.getSplitAxis();
        if(getLogger().isDebugging()) {
          StringBuilder msg = new StringBuilder(1000) //
              .append("Split Node ").append(node.getPageID()).append(" (").append(getClass()).append(")\n") //
              .append("      splitAxis ").append(splitAxis[0]).append('\n') //
              .append("      splitPoint ").append(split.getSplitPoint()).append('\n') //
              .append("      newNode ").append(newNode.getPageID()).append('\n'); //
          if(getLogger().isVerbose()) {
            msg.append("      first: ").append(newNode.getChildren()).append('\n') //
                .append("      second: ").append(node.getChildren()).append('\n');
          }
          getLogger().debugFine(msg.toString());
        }
        return newNode;
      }
      else { // create supernode
        node.makeSuperNode();
        supernodes.put((long) node.getPageID(), node);
        writeNode(node);
        splitAxis[0] = -1;
        if(getLogger().isDebugging()) {
          getLogger().debugFine(new StringBuilder(1000) //
              .append("Created Supernode ").append(node.getPageID()).append(" (").append(getClass()).append(")\n") //
              .append("      new capacity ").append(node.getCapacity()).append('\n') //
              .append("      minimum overlap: ").append(minOv).append('\n').toString());
        }
        return null;
      }
    }