docs: void rbDelete(Entry z)
                      throws ObjectManagerException {
          AbstractTreeMap.Entry y = z.getLeft() == null || z.getRight() == null ? z : successor(z);
          AbstractTreeMap.Entry x = y.getLeft() != null ? y.getLeft() : y.getRight();
          // Splice out y. 
          boolean yWasLeftChild = false;
          boolean yWasRightChild = false;
          if (x != null)
              x.setParent(y.getParent());
          if (y.getParent() == null)
              setRoot(x);
          else if (y == y.getParent().getLeft()) {
              y.getParent().setLeft(x);
              yWasLeftChild = true;
          } else {
              y.getParent().setRight(x);
              yWasRightChild = true;
          }
          modCount++;
  
          boolean yOldColor = y.getColor();
          Entry yOldParent = (Entry) y.getParent();
          // Put y where z is.
          if (y != z) {
              move(y, z);
          }
  
          if (!yOldColor && root != null) {
              if (x == null) {
                  // Z has been replaced with y we can make use of it as a temporary placeholder
                  // for the deleted node and fixup based on that.
                  if (yOldParent == z)
                      z.setParent(y);
                  else
                      z.setParent(yOldParent);
                  z.setColor(false); /* BLACK */
                  if (yWasLeftChild)
                      yOldParent.setLeft(z);
                  if (yWasRightChild)
                      yOldParent.setRight(z);
                  fixup(z);
                  if (yWasLeftChild)
                      yOldParent.setLeft(null);
                  if (yWasRightChild)
                      yOldParent.setRight(null);
              } else
                  fixup(x);
          }
          size--;
      }