mast.jsp revision 271
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<%--
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCDDL HEADER START
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe contents of this file are subject to the terms of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCommon Development and Distribution License (the "License").
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncYou may not use this file except in compliance with the License.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSee LICENSE.txt included in this distribution for the specific
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynclanguage governing permissions and limitations under the License.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWhen distributing Covered Code, include this CDDL HEADER in each
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfile and include the License file at LICENSE.txt.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIf applicable, add the following below this CDDL HEADER, with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfields enclosed by brackets "[]" replaced with your own identifying
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncinformation: Portions Copyright [yyyy] [name of copyright owner]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCDDL HEADER END
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright 2005 Sun Microsystems, Inc. All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUse is subject to license terms.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--%><%@ page import = "javax.servlet.*,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncjava.lang.*,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncjavax.servlet.http.*,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncjava.util.*,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncjava.io.*,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncjava.net.URLDecoder,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncorg.opensolaris.opengrok.index.*,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncorg.opensolaris.opengrok.configuration.*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%><%@ page session="false" %><%@ page errorPage="error.jsp"%><%
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncString context = request.getContextPath();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncString servlet = request.getServletPath();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncString reqURI = request.getRequestURI();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncString path = request.getPathInfo();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncif (path == null) path = "";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncelse {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync try {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path = URLDecoder.decode(path, "ISO-8859-1");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } catch (UnsupportedEncodingException e) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRuntimeEnvironment environment = RuntimeEnvironment.getInstance();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncenvironment.setUrlPrefix(context + "/s?");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncenvironment.register();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncString rawSource = environment.getSourceRootPath();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncString resourcePath = rawSource + path;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFile resourceFile = new File(resourcePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncresourcePath = resourceFile.getAbsolutePath();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncboolean valid = true;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncboolean noHistory = true;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncboolean noAnnotation = true;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncboolean annotate = false;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncString basename = resourceFile.getName();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncboolean isDir = false;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEftarFileReader ef = null;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncString parent = null;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncString parentBasename = resourceFile.getParentFile().getName();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIgnoredNames ignoredNames = environment.getIgnoredNames();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncString uriEncodedName = Util.URIEncodePath(path);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncif(resourcePath.length() < rawSource.length()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|| ignoredNames.ignore(path)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|| ignoredNames.ignore(parentBasename)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync|| !resourcePath.startsWith(rawSource)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync valid = false;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync response.sendError(404);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} else if (!resourceFile.canRead() && resourcePath.startsWith(rawSource)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String newPath = rawSource + "/on/" + path;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File newFile = new File(newPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(newFile.canRead()) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(newFile.isDirectory() && servlet.startsWith("/xref") && !path.endsWith("/")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync response.sendRedirect(context + servlet + "/on" + path + "/");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync response.sendRedirect(context + servlet + "/on" + path);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync valid = false;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync response.sendError(404);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync valid = true;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path = resourcePath.substring(rawSource.length());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ("".equals(path)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path = "/";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (File.separatorChar == '\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path = path.replace('\\','/');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync isDir = resourceFile.isDirectory();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (isDir && !servlet.startsWith("/xref") && !servlet.startsWith("/hist")) { //if it is an existing directory perhaps people wanted directory xref
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(!reqURI.endsWith("/")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync response.sendRedirect(context + "/xref" + path + "/");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync response.sendRedirect(context + "/xref" + path);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } if (isDir && !reqURI.endsWith("/")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync response.sendRedirect(context + servlet + path +"/");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync long flast = resourceFile.lastModified();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String dtag = "";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (request.getDateHeader("If-Modified-Since") >= flast ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync valid = false;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync response.setDateHeader("Last-Modified", flast);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int lastSlash = path.lastIndexOf('/');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parent = (lastSlash != -1) ? path.substring(0, lastSlash) : "";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int pLastSlash = parent.lastIndexOf('/');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parentBasename = pLastSlash != -1 ? parent.substring(pLastSlash+1) : parent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync noHistory = !HistoryGuru.getInstance().hasHistory(resourceFile);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync noAnnotation = isDir ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync !HistoryGuru.getInstance().hasAnnotation(resourceFile);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync annotate = !noAnnotation &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Boolean.parseBoolean(request.getParameter("a"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync try{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ef = new EftarFileReader(environment.getDataRootPath() + "/index/dtags.eftar");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dtag = ef.get(path);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(servlet.startsWith("/xr")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(ef != null) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync try {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ef.close();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } catch (IOException e) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } finally {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ef = null;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } catch (Exception e) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dtag = "";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String pageTitle="Cross Reference: " + path;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%><%@ include file="httpheader.jspf" %>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<body><div id="page">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<form action="<%=context%>/search">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <div id="header"><%@ include file="pageheader.jspf" %>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <div id="pagetitle"><b id="filename">Cross Reference: <%=basename%></b><br/><%=dtag%></div>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </div>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<div id="Masthead"><tt><a href="<%=context%>/xref/">xref</a>: <%=org.opensolaris.opengrok.web.Util.breadcrumbPath(context + "/xref", path)%></tt></div>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<div id="bar"><a href="<%=context%>" id="home">Home</a> |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<%
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncif (noHistory || servlet.startsWith("/hi")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %> <span class="c" id="history">History</span><%
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %><a id="history" href="<%=context%>/history<%=path%>">History</a><%
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncif (noAnnotation) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%> | <span class="c" id="annotate">Annotate</span><%
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String rev = request.getParameter("r");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (rev == null) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rev = "";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (rev.length() > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rev = "&r=" + rev;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Boolean.parseBoolean(request.getParameter("a"))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %> | <span id="toggle-annotate-by-javascript" style="display: none">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<a href="#" onClick="javascript:toggle_annotations(); return false;">Annotate</a>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync</span>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<span id="toggle-annotate">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<a href="<%=context%>/xref<%=path%><%
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncif (rev.length() > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %>?<%=rev%><%
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} %>">Annotate</a></span>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<script type="text/javascript">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<!--
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvar toggle_js = document.getElementById('toggle-annotate-by-javascript');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvar toggle_ss = document.getElementById('toggle-annotate');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctoggle_js.style.display = 'inline';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctoggle_ss.style.display = 'none';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// -->
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync</script> <%
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %> | <a href="<%=context%>/xref<%=path%>?a=true<%=rev%>">Annotate</a><%
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!isDir) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String rev = request.getParameter("r");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (rev == null || rev.equals("")) {
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync%> | <a id="download" href="<%=context%>/raw<%=path%>">Download</a><%
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync } else {
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync%> | <a id="download" href="<%=context%>/raw<%=path%>?r=<%=rev%>">Download</a><%
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync }
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync }
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync Project proj = Project.getProject(resourceFile);
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync if (proj != null || !environment.hasProjects()) {
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync%> | <input id="search" name="q" class="q"/>
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync<input type="submit" value="Search" class="submit"/>
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync<%
4136ffde6159b375ef0fe72f862f8b84bf9b2e8bvboxsync if (proj != null) {
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync %><input type="hidden" name="project" value="<%=proj.getId()%>"/><%
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync }
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync if(isDir) {
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync if(path.length() > 0) {
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync %><input type="checkbox" name="path" value="<%=path%>"/> only in <b><%=path%></b><%
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync }
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync } else {
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync %><input type="checkbox" name="path" value="<%=parent%>"/> only in <b><%=parentBasename%></b><%
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync }
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync%></div></form><%
d28b9c036346e5ec0840a947f447e238a1e20ae4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} // date check
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } // not a directory redirect
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync