<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDatabase_SQL_JDBC%2FJDBC_EJB</id>
		<title>Java/Database SQL JDBC/JDBC EJB - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDatabase_SQL_JDBC%2FJDBC_EJB"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Database_SQL_JDBC/JDBC_EJB&amp;action=history"/>
		<updated>2026-04-21T12:10:57Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Database_SQL_JDBC/JDBC_EJB&amp;diff=6977&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Database_SQL_JDBC/JDBC_EJB&amp;diff=6977&amp;oldid=prev"/>
				<updated>2010-06-01T06:35:00Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:35, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Database_SQL_JDBC/JDBC_EJB&amp;diff=6976&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Database_SQL_JDBC/JDBC_EJB&amp;diff=6976&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:44Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Ejb and JDBC ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
MySQL and Java Developer&amp;quot;s Guide&lt;br /&gt;
Mark Matthews, Jim Cole, Joseph D. Gradecki&lt;br /&gt;
Publisher Wiley,&lt;br /&gt;
Published February 2003, &lt;br /&gt;
ISBN 0471269239&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.GridLayout;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.sql.Connection;&lt;br /&gt;
import java.sql.DriverManager;&lt;br /&gt;
import java.sql.SQLException;&lt;br /&gt;
import java.util.Enumeration;&lt;br /&gt;
import java.util.StringTokenizer;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JMenu;&lt;br /&gt;
import javax.swing.JMenuBar;&lt;br /&gt;
import javax.swing.JMenuItem;&lt;br /&gt;
import javax.swing.JOptionPane;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JPasswordField;&lt;br /&gt;
import javax.swing.JTextField;&lt;br /&gt;
import javax.swing.border.TitledBorder;&lt;br /&gt;
public class TaskManager extends JFrame {&lt;br /&gt;
  TaskManager(Tasks taskList) {&lt;br /&gt;
    super(&amp;quot;MySQL-Java Task Manager&amp;quot;);&lt;br /&gt;
    this.taskList = taskList;&lt;br /&gt;
    buildGui();&lt;br /&gt;
    pack();&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  private void buildGui() {&lt;br /&gt;
    fileMenu.add(fileExit);&lt;br /&gt;
    menuBar.add(fileMenu);&lt;br /&gt;
    setJMenuBar(menuBar);&lt;br /&gt;
    frameContainer.setLayout(new BorderLayout());&lt;br /&gt;
    frameContainer.add(new TaskPanel(taskList));&lt;br /&gt;
    setContentPane(frameContainer);&lt;br /&gt;
    addWindowListener(new WindowHandler());&lt;br /&gt;
    fileExit.addActionListener(new MenuHandler());&lt;br /&gt;
  }&lt;br /&gt;
  private JPanel frameContainer = new JPanel();&lt;br /&gt;
  private JMenuBar menuBar = new JMenuBar();&lt;br /&gt;
  private JMenu fileMenu = new JMenu(&amp;quot;File&amp;quot;);&lt;br /&gt;
  private JMenuItem fileExit = new JMenuItem(&amp;quot;Exit&amp;quot;);&lt;br /&gt;
  private Tasks taskList;&lt;br /&gt;
  class WindowHandler extends WindowAdapter {&lt;br /&gt;
    public void windowClosing(WindowEvent we) {&lt;br /&gt;
      System.exit(0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  class MenuHandler implements ActionListener {&lt;br /&gt;
    public void actionPerformed(ActionEvent ae) {&lt;br /&gt;
      if (ae.getActionCommand().equals(&amp;quot;Exit&amp;quot;)) {&lt;br /&gt;
        System.exit(0);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    String configFileName = &amp;quot;tasks.conf&amp;quot;;&lt;br /&gt;
    if (args.length == 1) {&lt;br /&gt;
      configFileName = args[0];&lt;br /&gt;
    }&lt;br /&gt;
    File configFile = new File(configFileName);&lt;br /&gt;
    if (!configFile.exists() || !configFile.canRead()) {&lt;br /&gt;
      System.err.println(&amp;quot;Can&amp;quot;t read config file &amp;quot;&amp;quot; + configFileName&lt;br /&gt;
          + &amp;quot;&amp;quot;&amp;quot;);&lt;br /&gt;
      System.exit(1);&lt;br /&gt;
    }&lt;br /&gt;
    FileReader configReader = null;&lt;br /&gt;
    try {&lt;br /&gt;
      configReader = new FileReader(configFile);&lt;br /&gt;
    } catch (FileNotFoundException fnfX) {&lt;br /&gt;
    }&lt;br /&gt;
    Tasks taskList = new Tasks(configReader);&lt;br /&gt;
    try {&lt;br /&gt;
      configReader.close();&lt;br /&gt;
    } catch (IOException ioX) {&lt;br /&gt;
    }&lt;br /&gt;
    TaskManager ex = new TaskManager(taskList);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface TaskDelegate {&lt;br /&gt;
  public boolean execute(Connection conn);&lt;br /&gt;
}&lt;br /&gt;
class TaskPanel extends JPanel {&lt;br /&gt;
  public TaskPanel(Tasks taskList) {&lt;br /&gt;
    this.taskList = taskList;&lt;br /&gt;
    setLayout(new BorderLayout());&lt;br /&gt;
    connPane = new ConnectionPane();&lt;br /&gt;
    connPane.setBorder(new TitledBorder(&amp;quot;Connection Data&amp;quot;));&lt;br /&gt;
    taskPane = new TaskPane();&lt;br /&gt;
    taskPane.setBorder(new TitledBorder(&amp;quot;Tasks&amp;quot;));&lt;br /&gt;
    add(connPane, BorderLayout.NORTH);&lt;br /&gt;
    add(taskPane, BorderLayout.SOUTH);&lt;br /&gt;
  }&lt;br /&gt;
  private Tasks taskList;&lt;br /&gt;
  private ConnectionPane connPane;&lt;br /&gt;
  private TaskPane taskPane;&lt;br /&gt;
  class ConnectionPane extends JPanel {&lt;br /&gt;
    ConnectionPane() {&lt;br /&gt;
      setLayout(new GridLayout(5, 2));&lt;br /&gt;
      add(hostNameLabel);&lt;br /&gt;
      add(hostNameField);&lt;br /&gt;
      add(dbNameLabel);&lt;br /&gt;
      add(dbNameField);&lt;br /&gt;
      add(portNumberLabel);&lt;br /&gt;
      add(portNumberField);&lt;br /&gt;
      add(usernameLabel);&lt;br /&gt;
      add(usernameField);&lt;br /&gt;
      add(passwordLabel);&lt;br /&gt;
      add(passwordField);&lt;br /&gt;
    }&lt;br /&gt;
    ConnectionData getConnectionData() {&lt;br /&gt;
      String password = new String(passwordField.getPassword());&lt;br /&gt;
      ConnectionData data = new ConnectionData(hostNameField.getText(),&lt;br /&gt;
          dbNameField.getText(), portNumberField.getText(),&lt;br /&gt;
          usernameField.getText(), password);&lt;br /&gt;
      return (data);&lt;br /&gt;
    }&lt;br /&gt;
    private JLabel hostNameLabel = new JLabel(&amp;quot;Host Name:&amp;quot;);&lt;br /&gt;
    private JLabel dbNameLabel = new JLabel(&amp;quot;Database Name:&amp;quot;);&lt;br /&gt;
    private JLabel portNumberLabel = new JLabel(&amp;quot;Port Number:&amp;quot;);&lt;br /&gt;
    private JLabel usernameLabel = new JLabel(&amp;quot;Username:&amp;quot;);&lt;br /&gt;
    private JLabel passwordLabel = new JLabel(&amp;quot;Password:&amp;quot;);&lt;br /&gt;
    private JTextField hostNameField = new JTextField(20);&lt;br /&gt;
    private JTextField dbNameField = new JTextField(20);&lt;br /&gt;
    private JTextField portNumberField = new JTextField(&amp;quot;3306&amp;quot;, 6);&lt;br /&gt;
    private JTextField usernameField = new JTextField(20);&lt;br /&gt;
    private JPasswordField passwordField = new JPasswordField(20);&lt;br /&gt;
  }&lt;br /&gt;
  class TaskPane extends JPanel {&lt;br /&gt;
    TaskPane() {&lt;br /&gt;
      int taskCount = TaskPanel.this.taskList.getTaskCount();&lt;br /&gt;
      int rows = ((taskCount % COLS) == 0) ? (taskCount / COLS)&lt;br /&gt;
          : ((taskCount / COLS) + 1);&lt;br /&gt;
      setLayout(new GridLayout(rows, COLS));&lt;br /&gt;
      taskButtons = new JButton[taskCount];&lt;br /&gt;
      TaskHandler handler = new TaskHandler();&lt;br /&gt;
      Enumeration tasks = taskList.getTasks();&lt;br /&gt;
      int task = 0;&lt;br /&gt;
      while (tasks.hasMoreElements()) {&lt;br /&gt;
        TaskDefinition taskDef = (TaskDefinition) (tasks.nextElement());&lt;br /&gt;
        if (!taskDef.isEnabled()) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        String taskName = taskDef.getName();&lt;br /&gt;
        taskButtons[task] = new JButton(taskName);&lt;br /&gt;
        taskButtons[task].addActionListener(handler);&lt;br /&gt;
        add(taskButtons[task++]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    private JButton[] taskButtons;&lt;br /&gt;
    final static int COLS = 2;&lt;br /&gt;
  }&lt;br /&gt;
  class TaskHandler implements ActionListener {&lt;br /&gt;
    public void actionPerformed(ActionEvent ae) {&lt;br /&gt;
      ConnectionData connData = connPane.getConnectionData();&lt;br /&gt;
      Connection conn = connData.buildConnection();&lt;br /&gt;
      if (conn == null) {&lt;br /&gt;
        String msg = &amp;quot;Could not build connection. Check provided\n&amp;quot;&lt;br /&gt;
            + &amp;quot;connection data and verify server availability.&amp;quot;;&lt;br /&gt;
        JOptionPane.showMessageDialog(TaskPanel.this, msg,&lt;br /&gt;
            &amp;quot;Connection Failure&amp;quot;, JOptionPane.ERROR_MESSAGE);&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      String taskName = ae.getActionCommand();&lt;br /&gt;
      Enumeration tasks = taskList.getTasks();&lt;br /&gt;
      boolean dispatched = false;&lt;br /&gt;
      while (tasks.hasMoreElements()) {&lt;br /&gt;
        TaskDefinition taskDef = (TaskDefinition) (tasks.nextElement());&lt;br /&gt;
        if (!taskDef.isEnabled()) {&lt;br /&gt;
          continue;&lt;br /&gt;
        }&lt;br /&gt;
        if (taskName.equals(taskDef.getName())) {&lt;br /&gt;
          try {&lt;br /&gt;
            Class delegateClass = taskDef.getDelegate();&lt;br /&gt;
            Object delegateObject = delegateClass.newInstance();&lt;br /&gt;
            TaskDelegate delegate = (TaskDelegate) delegateObject;&lt;br /&gt;
            dispatched = delegate.execute(conn);&lt;br /&gt;
            if (!dispatched) {&lt;br /&gt;
              String msg = &amp;quot;Could not execute task: &amp;quot;&lt;br /&gt;
                  + taskDef.getName();&lt;br /&gt;
              JOptionPane.showMessageDialog(TaskPanel.this, msg,&lt;br /&gt;
                  &amp;quot;Task Failure&amp;quot;, JOptionPane.ERROR_MESSAGE);&lt;br /&gt;
            }&lt;br /&gt;
          } catch (InstantiationException iX) {&lt;br /&gt;
            String msg = &amp;quot;Failed to instantiate delegate for task: &amp;quot;&lt;br /&gt;
                + taskDef.getName();&lt;br /&gt;
            JOptionPane.showMessageDialog(TaskPanel.this, msg,&lt;br /&gt;
                &amp;quot;Task Failure&amp;quot;, JOptionPane.ERROR_MESSAGE);&lt;br /&gt;
          } catch (IllegalAccessException iaX) {&lt;br /&gt;
            String msg = &amp;quot;Cound not access delegate for task: &amp;quot;&lt;br /&gt;
                + taskDef.getName();&lt;br /&gt;
            JOptionPane.showMessageDialog(TaskPanel.this, msg,&lt;br /&gt;
                &amp;quot;Task Failure&amp;quot;, JOptionPane.ERROR_MESSAGE);&lt;br /&gt;
          }&lt;br /&gt;
          break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      if (!dispatched) {&lt;br /&gt;
        try {&lt;br /&gt;
          conn.close();&lt;br /&gt;
        } catch (SQLException sqlX) {&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class ConnectionData {&lt;br /&gt;
  public ConnectionData(String hostName, String dbName, String port,&lt;br /&gt;
      String username, String password) {&lt;br /&gt;
    this.hostName = hostName;&lt;br /&gt;
    this.dbName = dbName;&lt;br /&gt;
    this.port = port;&lt;br /&gt;
    this.username = username;&lt;br /&gt;
    this.password = password;&lt;br /&gt;
  }&lt;br /&gt;
  public String getUsername() {&lt;br /&gt;
    return (username);&lt;br /&gt;
  }&lt;br /&gt;
  public String getPassword() {&lt;br /&gt;
    return (password);&lt;br /&gt;
  }&lt;br /&gt;
  public String getUrl() {&lt;br /&gt;
    String url = &amp;quot;jdbc:mysql://&amp;quot; + hostName + &amp;quot;:&amp;quot; + port + &amp;quot;/&amp;quot; + dbName;&lt;br /&gt;
    return (url);&lt;br /&gt;
  }&lt;br /&gt;
  public Connection buildConnection() {&lt;br /&gt;
    try {&lt;br /&gt;
      Class.forName(&amp;quot;com.mysql.jdbc.Driver&amp;quot;);&lt;br /&gt;
    } catch (ClassNotFoundException cnfX) {&lt;br /&gt;
      cnfX.printStackTrace(System.err);&lt;br /&gt;
      return (null);&lt;br /&gt;
    }&lt;br /&gt;
    try {&lt;br /&gt;
      Connection conn = DriverManager.getConnection(getUrl(),&lt;br /&gt;
          getUsername(), getPassword());&lt;br /&gt;
      return (conn);&lt;br /&gt;
    } catch (SQLException sqlX) {&lt;br /&gt;
      System.out.println(SqlExceptionReader.readException(sqlX));&lt;br /&gt;
      return (null);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private String hostName;&lt;br /&gt;
  private String dbName;&lt;br /&gt;
  private String port;&lt;br /&gt;
  private String username;&lt;br /&gt;
  private String password;&lt;br /&gt;
}&lt;br /&gt;
class SqlExceptionReader {&lt;br /&gt;
  public static String readException(SQLException sqlX) {&lt;br /&gt;
    StringBuffer msg = new StringBuffer(1024);&lt;br /&gt;
    SQLException nextX;&lt;br /&gt;
    int exceptionNumber = 0;&lt;br /&gt;
    do {&lt;br /&gt;
      ++exceptionNumber;&lt;br /&gt;
      msg.append(&amp;quot;Exception &amp;quot; + exceptionNumber + &amp;quot;: \n&amp;quot;);&lt;br /&gt;
      msg.append(&amp;quot;  Message: &amp;quot; + sqlX.getMessage() + &amp;quot;\n&amp;quot;);&lt;br /&gt;
      msg.append(&amp;quot;  State  : &amp;quot; + sqlX.getSQLState() + &amp;quot;\n&amp;quot;);&lt;br /&gt;
      msg.append(&amp;quot;  Code   : &amp;quot; + sqlX.getErrorCode() + &amp;quot;\n&amp;quot;);&lt;br /&gt;
    } while ((nextX = sqlX.getNextException()) != null);&lt;br /&gt;
    return (msg.toString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Tasks {&lt;br /&gt;
  public Tasks(InputStreamReader taskS) {&lt;br /&gt;
    readTasks(taskS);&lt;br /&gt;
  }&lt;br /&gt;
  public int getTaskCount() {&lt;br /&gt;
    return (taskDefs.size());&lt;br /&gt;
  }&lt;br /&gt;
  public Enumeration getTasks() {&lt;br /&gt;
    return (taskDefs.elements());&lt;br /&gt;
  }&lt;br /&gt;
  private void readTasks(InputStreamReader taskS) {&lt;br /&gt;
    try {&lt;br /&gt;
      BufferedReader reader = new BufferedReader(taskS);&lt;br /&gt;
      String taskLine;&lt;br /&gt;
      while ((taskLine = reader.readLine()) != null) {&lt;br /&gt;
        addTaskDefinition(taskLine);&lt;br /&gt;
      }&lt;br /&gt;
    } catch (IOException ioX) {&lt;br /&gt;
      System.err.println(&amp;quot;Failed to fully parse task file: &amp;quot; + ioX);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private void addTaskDefinition(String taskLine) {&lt;br /&gt;
    StringTokenizer taskTok = new StringTokenizer(taskLine, DELIM);&lt;br /&gt;
    if (taskTok.countTokens() != TOKEN_NUM) {&lt;br /&gt;
      System.err.println(&amp;quot;Invalid task definition: &amp;quot; + taskLine);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    Class taskClass = null;&lt;br /&gt;
    String taskClassName = taskTok.nextToken();&lt;br /&gt;
    try {&lt;br /&gt;
      taskClass = Class.forName(taskClassName);&lt;br /&gt;
    } catch (ClassNotFoundException cnfX) {&lt;br /&gt;
      System.err.println(&amp;quot;Class &amp;quot;&amp;quot; + taskClassName + &amp;quot;&amp;quot; not found: &amp;quot;&lt;br /&gt;
          + cnfX);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    boolean taskEnabled = false;&lt;br /&gt;
    if (taskTok.nextToken().equalsIgnoreCase(&amp;quot;enabled&amp;quot;)) {&lt;br /&gt;
      taskEnabled = true;&lt;br /&gt;
    }&lt;br /&gt;
    String taskName = taskTok.nextToken();&lt;br /&gt;
    TaskDefinition def = new TaskDefinition(taskName, taskClass,&lt;br /&gt;
        taskEnabled);&lt;br /&gt;
    taskDefs.add(def);&lt;br /&gt;
  }&lt;br /&gt;
  private Vector taskDefs = new Vector();&lt;br /&gt;
  final static int TOKEN_NUM = 3;&lt;br /&gt;
  final static String DELIM = &amp;quot;:&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
class TaskDefinition {&lt;br /&gt;
  public TaskDefinition(String name, Class delegate, boolean enabled) {&lt;br /&gt;
    this.name = name;&lt;br /&gt;
    this.delegate = delegate;&lt;br /&gt;
    this.enabled = enabled;&lt;br /&gt;
  }&lt;br /&gt;
  public String getName() {&lt;br /&gt;
    return (name);&lt;br /&gt;
  }&lt;br /&gt;
  public Class getDelegate() {&lt;br /&gt;
    return (delegate);&lt;br /&gt;
  }&lt;br /&gt;
  public boolean isEnabled() {&lt;br /&gt;
    return (enabled);&lt;br /&gt;
  }&lt;br /&gt;
  private String name;&lt;br /&gt;
  private Class delegate;&lt;br /&gt;
  private boolean enabled;&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>