
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xml:lang="en" lang="en">
    <!-- this is a JXR report set (jdk8) -->
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <title>Archiva Base :: Mocks 3.0.0-SNAPSHOT Reference</title>
        <script type="text/javascript">
            tmpTargetPage = "" + window.location.search;
            if (tmpTargetPage != "" && tmpTargetPage != "undefined")
                tmpTargetPage = tmpTargetPage.substring(1);
            if (tmpTargetPage.indexOf(":") != -1 || (tmpTargetPage != "" && !validURL(tmpTargetPage)))
                tmpTargetPage = "undefined";
            targetPage = tmpTargetPage;
            function validURL(url) {
                try {
                    url = decodeURIComponent(url);
                }
                catch (error) {
                    return false;
                }
                var pos = url.indexOf(".html");
                if (pos == -1 || pos != url.length - 5)
                    return false;
                var allowNumber = false;
                var allowSep = false;
                var seenDot = false;
                for (var i = 0; i < url.length - 5; i++) {
                    var ch = url.charAt(i);
                    if ('a' <= ch && ch <= 'z' ||
                            'A' <= ch && ch <= 'Z' ||
                            ch == '$' ||
                            ch == '_' ||
                            ch.charCodeAt(0) > 127) {
                        allowNumber = true;
                        allowSep = true;
                    } else if ('0' <= ch && ch <= '9'
                            || ch == '-') {
                        if (!allowNumber)
                            return false;
                    } else if (ch == '/' || ch == '.') {
                        if (!allowSep)
                            return false;
                        allowNumber = false;
                        allowSep = false;
                        if (ch == '.')
                            seenDot = true;
                        if (ch == '/' && seenDot)
                            return false;
                    } else {
                        return false;
                    }
                }
                return true;
            }
            function loadFrames() {
                if (targetPage != "" && targetPage != "undefined")
                    top.classFrame.location = top.targetPage;
            }
        </script>
    </head>
    <frameset cols="20%,80%" title="Documentation frame" onload="top.loadFrames()">
        <frameset rows="30%,70%" title="Left frames" onload="top.loadFrames()">
            <frame src="overview-frame.html" name="packageListFrame" title="All Packages"/>
            <frame src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)"/>
        </frameset>
        <frame src="overview-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes"/>
        <noframes>
            <h1>Frame Alert</h1>
            <p>
                You don't have frames. Go <a href="overview-summary.html">here</a>
            </p>
        </noframes>
    </frameset>
</html>