import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

import java.util.List;
public class __2F_INCLUDES_5F_TESTS_2F_xml_2D_jsp_2F_most_2D_tags_2D_xml_2D_jsp_2E_jsp extends javax.servlet.http.HttpServlet{
public String myFunc() { return "myfunc"; }

public String myFunc2() { return "myfunc"; }

public void _jspService(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
		throws java.io.IOException, javax.servlet.ServletException {
javax.servlet.jsp.PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, JspWriter.DEFAULT_BUFFER, true);
javax.servlet.ServletContext application = pageContext.getServletContext();
javax.servlet.ServletConfig config = pageContext.getServletConfig();
javax.servlet.jsp.JspWriter out = pageContext.getOut();
Object page = this;
javax.servlet.http.HttpSession session = pageContext.getSession();

try {
{out.print("");} //markup
{out.print("");} //markup
String consec1 = "test";
String consec2 = "two";
{out.print("");} //markup
out.print(myFunc());
out.print(myFunc2());
{out.print("");} //markup
javax.swing.AbstractButton jb = new javax.swing.JButton();
{out.print("");} //markup
String includedString = "incd";
{out.print("");} //markup
   jb. 
{out.print("");} //markup
{ // <logic:iterate>
} // </logic:iterate>
{out.print("");} //markup
 } catch (java.lang.Exception e) {} 
}}