public @Nullable VirtualFile findFileByRelativePath(@NotNull @NonNls String relPath) {
    VirtualFile child = this;

    int off = CharArrayUtil.shiftForward(relPath, 0, "/");
    while (child != null && off < relPath.length()) {
      int nextOff = relPath.indexOf('/', off);
      if (nextOff < 0) nextOff = relPath.length();
      String name = relPath.substring(off, nextOff);

      if (name.equals("..")) {
        if (child.is(VFileProperty.SYMLINK)) {
          VirtualFile canonicalFile = child.getCanonicalFile();
          child = canonicalFile != null ? canonicalFile.getParent() : null;
        }
        else {
          child = child.getParent();
        }
      }
      else if (!name.equals(".")) {
        child = child.findChild(name);
      }

      off = CharArrayUtil.shiftForward(relPath, nextOff, "/");
    }

    return child;
  }
public @Nullable VirtualFile findFileByRelativePath(@NotNull @NonNls String relPath)