위젯 검출 정규 표현식을 수정

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@2892 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2007-11-01 10:28:42 +00:00
parent f9896fe51a
commit 90aa62a6ac
993 changed files with 9190 additions and 10457 deletions

View file

@ -11,7 +11,7 @@
<div id="popBody">
<table cellspacing="0" class="tableType5">
<table cellspacing="0" class="adminTable">
<col width="120" />
<col />
<tr>

View file

@ -70,7 +70,7 @@
if($width) $style_output[] = "width:".$width."px";
if($height) $style_output[] = "height:".$height."px";
if(!$align) $style_output[] = "display:block";
//if(!$align) $style_output[] = "display:block";
if($border) $style_output[] = "border:".$border."px";
$code = sprintf("<img %s style=\"%s\" />", implode(" ",$attr_output), implode(";",$style_output));

View file

@ -9,7 +9,7 @@
<form action="./" method="get" onSubmit="return false" id="fo">
<div id="popBody">
<table cellspacing="0" class="tableType5">
<table cellspacing="0" class="adminTable">
<col width="100" />
<col />

View file

@ -8,7 +8,7 @@
<form action="./" method="get" onSubmit="return false" id="fo">
<div id="popBody">
<table cellspacing="0" class="tableType5">
<table cellspacing="0" class="adminTable">
<col width="150" />
<col />
<tr>

View file

@ -19,7 +19,7 @@
<div id="popBody">
<table cellspacing="0" class="tableType5">
<table cellspacing="0" class="adminTable">
<col width="100" />
<col />
<tr>
@ -47,46 +47,46 @@
<!--@end-->
</select>
</li>
<li><a href="#" onclick="doPollAdd(); return false;"><span>{$lang->cmd_add_poll}</span></a></li>
<li><a href="#" onclick="doPollAdd(); return false;">{$lang->cmd_add_poll}</a></li>
</ul>
</td>
</tr>
</table>
<div id="poll_source" class="clear" style="display:none">
<div class="clear"></div>
<table cellspacing="0" class="tableType5 gap1 clear">
<table cellspacing="0" class="adminTable gap1">
<col width="100" />
<col />
<tr>
<th scope="row">{$lang->poll_title}</th>
<td><input type="text" name="title_tidx" class="inputTypeText w100" /></td>
<td><input type="text" name="title_tidx" class="inputTypeText w400" /></td>
</tr>
<tr>
<th scope="row">{$lang->poll_item} 1</th>
<td><input type="text" name="item_tidx_1" class="inputTypeText w100" /></td>
<td><input type="text" name="item_tidx_1" class="inputTypeText w400" /></td>
</tr>
<tr>
<th scope="row">{$lang->poll_item} 2</th>
<td><input type="text" name="item_tidx_2" class="inputTypeText w100" /></td>
<td><input type="text" name="item_tidx_2" class="inputTypeText w400" /></td>
</tr>
</table>
<div class="pollButton clear">
<ul class="fl">
<li><a href="#" onclick="doPollAddItem(this); return false;" >{$lang->cmd_add_item}</a></li>
<li><a href="#" onclick="doPollAddItem(this); return false;">{$lang->cmd_add_item}</a></li>
</ul>
<ul class="fr">
<li><a href="#" onclick="doPollDelete(this); return false;" >{$lang->cmd_del_poll}</a></li>
<li><a href="#" onclick="doPollDelete(this); return false;">{$lang->cmd_del_poll}</a></li>
</ul>
<ul class="fr">
<li><label>{$lang->poll_chk_count}</label></li>
<li><input type="text" name="checkcount_tidx" value="1" size="1" class="inputTypeText" /></li>
</ul>
</div>
</div>
</div>

View file

@ -8,7 +8,7 @@
<form action="./" method="get" onSubmit="return false" id="fo">
<div id="popBody">
<table cellspacing="0" class="tableType5">
<table cellspacing="0" class="adminTable">
<col width="120" />
<col />
<col />
@ -21,7 +21,9 @@
<input type="checkbox" id="quotation_use" value="Y" onclick="toggle_folder(this)" />
<div id="folder_area" style="display:none">
<table>
<table cellspacing="0" class="adminTable gap1">
<col width="150" />
<col />
<tr>
<th scope="row">{$lang->quotation_opener}</th>
<td><input type="text" class="inputTypeText" id="quotation_opener" value="{$lang->quotation_cmd_opener}" /></td>

View file

@ -14,10 +14,11 @@
<input name="attr" type="radio" value="table" id="table_attribute_select" onclick="doSelectOption('table');"/> <label for="table_attribute_select">{$lang->table_attribute}</label>
<input name="attr" type="radio" value="cell" id="cell_attribute_select" onclick="doSelectOption('cell');"/> <label for="cell_attribute_select">{$lang->cell_attribute}</label>
</div>
<div class="gap1"></div>
<div id="table_attribute" style="display:none">
<div class="" id="col_row_area" style="display:none" >
<table cellspacing="0" class="tableType5 gap1">
<table cellspacing="0" class="adminTable">
<col width="25%" />
<col width="25%" />
<col width="25%" />
@ -31,7 +32,7 @@
</table>
</div>
<table cellspacing="0" class="tableType5 gap1">
<table cellspacing="0" class="adminTable">
<col width="25%" />
<col />
<tr>
@ -46,7 +47,7 @@
</div>
<table cellspacing="0" class="tableType5 gap1">
<table cellspacing="0" class="adminTable">
<col width="25%" />
<col width="25%" />
<col width="25%" />
@ -66,7 +67,7 @@
</table>
<div id="cell_attribute" style="display:none">
<table cellspacing="0" class="tableType5 gap1">
<table cellspacing="0" class="adminTable">
<col width="25%" />
<col width="25%" />
<col width="25%" />
@ -85,7 +86,7 @@
</div>
<div id="border_color_area" style="display:none">
<table cellspacing="0" class="tableType5 gap1">
<table cellspacing="0" class="adminTable">
<col width="25%" />
<col />
<tr>
@ -107,7 +108,7 @@
</div>
<div id="bg_color_area" style="display:none">
<table cellspacing="0" class="tableType5 gap1">
<table cellspacing="0" class="adminTable">
<col width="25%" />
<col />
<tr>

View file

@ -9,7 +9,7 @@
<form action="./" method="get" id="fo_component" onSubmit="return false">
<div id="popBody">
<table cellspacing="0" class="tableType5">
<table cellspacing="0" class="adminTable">
<col width="100" />
<col />

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<module version="0.1">
<module version="0.1" category="utility">
<title xml:lang="ko">위지윅 에디터 </title>
<title xml:lang="en">WYSIWYG Editor </title>
<title xml:lang="es">Editor WYSIWYG </title>

View file

@ -12,6 +12,7 @@
<action name="procEditorRemoveSavedDoc" type="controller" standalone="true" />
<action name="procEditorCall" type="controller" standalone="true" />
<action name="procEditorAdminInsertModuleConfig" type="controller" standalone="true" />
<action name="procEditorAdminEnableComponent" type="controller" standalone="true" />
<action name="procEditorAdminDisableComponent" type="controller" standalone="true" />
<action name="procEditorAdminMoveListOrder" type="controller" standalone="true" />

View file

@ -95,6 +95,26 @@
$this->setMessage('success_updated');
}
/**
* @brief 에디터의 모듈별 추가 확장 폼을 저장
**/
function procEditorAdminInsertModuleConfig() {
// 필요한 변수를 받아옴
$module_srl = Context::get('target_module_srl');
$editor_skin = Context::get('editor_skin');
// 기존 설정을 가져옴
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('editor');
$config->module_config[$module_srl] = $editor_skin;
// module Controller 객체 생성하여 입력
$oModuleController = &getController('module');
$output = $oModuleController->insertModuleConfig('editor',$config);
return $output;
}
/**
* @brief 컴포넌트를 DB에 추가
**/

View file

@ -32,6 +32,13 @@
// 에디터 모듈에서 사용할 디렉토리 생성
FileHandler::makeDir('./files/cache/editor');
// 2007. 10. 17 글의 입력(신규 or 수정)이 일어날때마다 자동 저장된 문서를 삭제하는 trigger 추가
$oModuleController->insertTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after');
$oModuleController->insertTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after');
// 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가
$oModuleController->insertTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before');
return new Object();
}
@ -39,6 +46,15 @@
* @brief 설치가 이상이 없는지 체크하는 method
**/
function checkUpdate() {
$oModuleModel = &getModel('module');
// 2007. 10. 17 글의 입력(신규 or 수정)이 일어날때마다 자동 저장된 문서를 삭제하는 trigger 추가
if(!$oModuleModel->getTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after')) return true;
if(!$oModuleModel->getTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after')) return true;
// 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가
if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before')) return true;
return false;
}
@ -46,7 +62,20 @@
* @brief 업데이트 실행
**/
function moduleUpdate() {
return new Object();
$oModuleModel = &getModel('module');
$oModuleController = &getController('module');
// 2007. 10. 17 글의 입력(신규 or 수정)이 일어날때마다 자동 저장된 문서를 삭제하는 trigger 추가
if(!$oModuleModel->getTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after'))
$oModuleController->insertTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after');
if(!$oModuleModel->getTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after'))
$oModuleController->insertTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after');
// 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가
if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before'))
$oModuleController->insertTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before');
return new Object(0, 'success_updated');
}
/**

View file

@ -71,6 +71,14 @@
}
}
/**
* @brief 게시글의 입력/수정이 일어났을 경우 자동 저장문서를 제거하는 trigger
**/
function triggerDeleteSavedDoc(&$obj) {
$this->deleteSavedDoc();
return new Object();
}
/**
* @brief 자동 저장된 글을 삭제
* 현재 접속한 사용자를 기준
@ -84,7 +92,7 @@
}
// 일단 이전 저장본 삭제
executeQuery('editor.deleteSavedDoc', $args);
return executeQuery('editor.deleteSavedDoc', $args);
}
}
?>

View file

@ -22,7 +22,21 @@
**/
/**
* 에디터 template을 return
* @brief 모듈별 에디터 설정을 return
**/
function getEditorConfig($module_srl) {
// 선택된 모듈의 trackback설정을 가져옴
$oModuleModel = &getModel('module');
$config = $oModuleModel->getModuleConfig('editor');
$editor_skin = $config->module_config[$module_srl];
if(!$editor_skin) $editor_skin = "default";
return $editor_skin;
}
/**
* @brief 에디터 template을 return
* upload_target_srl은 글의 수정시 호출하면 .
* upload_target_srl은 첨부파일의 유무를 체크하기 위한 루틴을 구현하는데 사용됨.
**/
@ -55,8 +69,11 @@
else $editor_height = $option->height;
// 스킨 설정
if(!$option->skin) $skin = 'default';
else $skin = $option->skin;
if(!$option->skin) {
$module_srl = Context::get('module_srl');
$skin = $this->getEditorConfig($module_srl);
} else $skin = $option->skin;
/**
* 자동백업 기능 체크 ( 수정일 경우는 사용하지 않음)
@ -87,8 +104,9 @@
// SWFUploader에 세팅할 업로드 설정 구함
$file_config = $oFileModel->getUploadConfig();
$file_config->attached_size = FileHandler::filesize($file_config->allowed_attach_size*1024*1024);
$file_config->allowed_filesize = FileHandler::filesize($file_config->allowed_filesize*1024*1024);
$file_config->attached_size = $file_config->allowed_attach_size*1024;
$file_config->allowed_filesize = $file_config->allowed_filesize*1024;
Context::set('file_config',$file_config);
// 업로드 가능 용량등에 대한 정보를 세팅

View file

@ -60,5 +60,36 @@
$this->setTemplateFile('view_component');
$this->setLayoutFile("popup_layout");
}
/**
* @brief 모듈의 추가 설정에서 에디터 설정을 하는 form 추가
**/
function triggerDispEditorAdditionSetup(&$obj) {
$current_module_srl = Context::get('module_srl');
if(!$current_module_srl) {
// 선택된 모듈의 정보를 가져옴
$current_module_info = Context::get('current_module_info');
$current_module_srl = $current_module_info->module_srl;
}
if(!$current_module_srl) return new Object();
// 에디터 설정을 구함
$oEditorModel = &getModel('editor');
$editor_skin = $oEditorModel->getEditorConfig($current_module_srl);
Context::set('editor_skin', $editor_skin);
// 에디터 스킨 목록을 구함
$editor_skin_list = FileHandler::readDir('./modules/editor/skins');
Context::set('editor_skin_list', $editor_skin_list);
// 템플릿 파일 지정
$oTemplate = &TemplateHandler::getInstance();
$tpl = $oTemplate->compile($this->module_path.'tpl', 'editor_module_config');
$obj .= $tpl;
return new Object();
}
}
?>

View file

@ -156,7 +156,7 @@
<!-- 파일 업로드 영역 -->
<div class="fileListArea">
<select id="uploaded_file_list_{$editor_sequence}" multiple="multiple" size="7" class="fileList" onclick="editor_preview(this, '{$editor_sequence}');"></select>
<select id="uploaded_file_list_{$editor_sequence}" multiple="multiple" size="8" class="fileList" onclick="editor_preview(this, '{$editor_sequence}');"></select>
<span class="file_attach_info" id="uploader_status_{$editor_sequence}">{$upload_status}</span>
</div>

View file

@ -1,29 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<skin>
<title xml:lang="ko">제로보드XE 게시판 기본 스킨(목록형)</title>
<title xml:lang="jp">ゼロボードXE掲示板のデフォルトスキンリストスタイル</title>
<title xml:lang="zh-CN">Zeroboard XE Board 基本皮肤(目录型)</title>
<title xml:lang="en">ZeroboardXE Basic Board Skin (List Style)</title>
<title xml:lang="ko">제로보드XE 기본 에디터</title>
<maker email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">(주)NHN</name>
<name xml:lang="jp">NHN</name>
<name xml:lang="zh-CN">(株)NHN</name>
<name xml:lang="en">NHN Corp</name>
<name xml:lang="ko">zero</name>
<description xml:lang="ko">
디자인 : 서기정 (http://blog.naver.com/addcozy)
HTML/CSS : 정찬명 (http://naradesign.net)
</description>
<description xml:lang="jp">
デザイン:ソギジョン (http://blog.naver.com/addcozy)
HTML/CSSジョンチャンミョン (http://naradesign.net)
</description>
<description xml:lang="zh-CN">
设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy)
HTML/CSS : Chan-Myung Jeong (http://naradesign.net)
</description>
<description xml:lang="en">
Design : Ki-Jeong Seo (http://blog.naver.com/addcozy)
HTML/CSS : Chan-Myung Jeong (http://naradesign.net)
개발 : zero (http://www.zeroboard.com)
</description>
</maker>
</skin>

View file

@ -2,13 +2,19 @@
<h3>{$lang->editor} <span class="gray">{$lang->cmd_management}</span></h3>
<table cellspacing="0" class="tableType3">
<table cellspacing="0" class="adminTable gap1">
<col />
<col width="40"/>
<col width="120"/>
<col width="70"/>
<col width="50"/>
<col width="50"/>
<col width="50"/>
<thead>
<tr>
<th scope="col">{$lang->component_name}</th>
<th scope="col">{$lang->component_version}</th>
<th scope="col">{$lang->component_author}</th>
<th scope="col">{$lang->component_link}</th>
<th scope="col">{$lang->component_date}</th>
<th scope="col">{$lang->cmd_setup}</th>
<th scope="col">{$lang->use}</th>
@ -20,8 +26,7 @@
<tr>
<th scope="row" rowspan="2"><a href="{getUrl('module','editor','act','dispEditorComponentInfo','component_name',$component_name)}" onclick="popopen(this.href);return false;" class="blue">{$xml_info->title}</a><br />({$component_name})</th>
<td class="tahoam">{$xml_info->version}</td>
<td><a href="mailto:{$xml_info->author->email_address}">{$xml_info->author->name}</a></td>
<td class="blue"><a href="{$xml_info->author->link}" onclick="window.open(this.href);return false;">{$xml_info->author->link}</a></td>
<td class="blue"><a href="{$xml_info->author->link}" onclick="window.open(this.href);return false;">{$xml_info->author->name}</a></td>
<td class="tahoma">{$xml_info->author->date}</td>
<td class="tahoma">
<!--@if($xml_info->extra_vars)-->
@ -43,7 +48,7 @@
</td>
</tr>
<tr>
<td colspan="7" class="left">
<td colspan="6" class="left">
{nl2br($xml_info->description)}
</td>
</tr>

View file

@ -0,0 +1,28 @@
<!--%import("filter/insert_editor_module_config.xml")-->
<form action="./" method="post" onsubmit="return procFilter(this, insert_editor_module_config)">
<input type="hidden" name="target_module_srl" value="{$module_info->module_srl}" />
<table cellspacing="0" class="adminTable">
<col width="150" />
<col />
<col width="100" />
<caption>{$lang->editor}</caption>
<tr>
<th scope="row">{$lang->editor}</th>
<td>
<select name="editor_skin">
<!--@foreach($editor_skin_list as $editor)-->
<option value="{$editor}" <!--@if($editor==$editor_skin)-->selected="selected"<!--@end-->>{$editor}</option>
<!--@end-->
</select>
</td>
<th class="centerButton">
<span class="button"><input type="submit" value="{$lang->cmd_save}"/></span>
</th>
</tr>
</table>
</form>
<div class="gap1"></div>

View file

@ -0,0 +1,7 @@
<filter name="insert_editor_module_config" module="editor" act="procEditorAdminInsertModuleConfig" confirm_msg_code="confirm_submit">
<form />
<response>
<tag name="error" />
<tag name="message" />
</response>
</filter>

View file

@ -103,7 +103,7 @@ function editorStart(editor_sequence, primary_key, content_key, resizable, edito
// iframe obj를 찾음
var iframe_obj = editorGetIFrame(editor_sequence);
if(!iframe_obj) return;
xWidth(iframe_obj, xWidth(iframe_obj.parentNode)-20);
xWidth(iframe_obj, xWidth(iframe_obj.parentNode)-30);
// 현 에디터를 감싸고 있는 form문을 찾음
var fo_obj = editorGetForm(editor_sequence);
@ -140,9 +140,6 @@ function editorStart(editor_sequence, primary_key, content_key, resizable, edito
// IE가 아니고 내용이 없으면 <br /> 추가 (FF등에서 iframe 선택시 focus를 주기 위한 꽁수)
if(!content && !xIE4Up) content = "<br />";
// iframe내의 document element를 구함
var contentDocument = iframe_obj.contentWindow.document;
// 크기 변경 불가일 경우 드래그바 숨김
var dragObj = xGetElementById("editor_drag_bar_"+editor_sequence);
if(dragObj) {
@ -172,38 +169,42 @@ function editorStart(editor_sequence, primary_key, content_key, resizable, edito
content+
'</body></html>'+
'';
contentDocument.open("text/html","replace");
contentDocument.write(contentHtml);
contentDocument.close();
iframe_obj.contentWindow.document.open("text/html","replace");
iframe_obj.contentWindow.document.write(contentHtml);
iframe_obj.contentWindow.document.close();
// editorMode를 기본으로 설정
editorMode[editor_sequence] = null;
// 에디터를 시작 시킴
try {
contentDocument.designMode = 'On';
iframe_obj.contentWindow.document.designMode = 'On';
} catch(e) {
}
try {
contentDocument.execCommand("undo", false, null);
contentDocument.execCommand("useCSS", false, true);
iframe_obj.contentWindow.document.execCommand("undo", false, null);
iframe_obj.contentWindow.document.execCommand("useCSS", false, true);
} catch (e) {
}
/**
* 더블클릭이나 키눌림등의 각종 이벤트에 대해 listener 추가
* 작성시 필요한 이벤트 체크
* 이벤트의 경우 윈도우 sp1 (NT or xp sp1) 에서 contentDocument에 대한 권한이 없기에 try 문으로 감싸서
* 이벤트의 경우 윈도우 sp1 (NT or xp sp1) 에서 iframe_obj.contentWindow.document에 대한 권한이 없기에 try 문으로 감싸서
* 에러를 무시하도록 해야 .
**/
try {
// 에디터에서 키가 눌러질때마다 이벤트를 체크함 (enter키의 처리나 FF에서 alt-s등을 처리)
if(xIE4Up) xAddEventListener(contentDocument, 'keydown',editorKeyPress);
else xAddEventListener(contentDocument, 'keypress',editorKeyPress);
// 위젯 감시를 위한 더블클릭 이벤트 걸기
xAddEventListener(contentDocument,'dblclick',editorSearchComponent);
// 위젯 감시를 위한 더블클릭 이벤트 걸기
try {
xAddEventListener(iframe_obj.contentWindow.document,'dblclick',editorSearchComponent);
} catch(e) {
}
// 에디터에서 키가 눌러질때마다 이벤트를 체크함 (enter키의 처리나 FF에서 alt-s등을 처리)
try {
if(xIE4Up) xAddEventListener(iframe_obj.contentWindow.document, 'keydown',editorKeyPress);
else xAddEventListener(iframe_obj.contentWindow.document, 'keypress',editorKeyPress);
} catch(e) {
}
@ -300,15 +301,19 @@ function editorReplaceHTML(iframe_obj, html) {
} else {
if(iframe_obj.contentWindow.getSelection().focusNode.tagName == "HTML") {
var range = iframe_obj.contentDocument.createRange();
range.setStart(iframe_obj.contentDocument.body,0);
range.setEnd(iframe_obj.contentDocument.body,0);
range.insertNode(range.createContextualFragment(html));
} else {
var range = iframe_obj.contentWindow.getSelection().getRangeAt(0);
range.deleteContents();
range.insertNode(range.createContextualFragment(html));
try {
if(iframe_obj.contentWindow.getSelection().focusNode.tagName == "HTML") {
var range = iframe_obj.contentDocument.createRange();
range.setStart(iframe_obj.contentDocument.body,0);
range.setEnd(iframe_obj.contentDocument.body,0);
range.insertNode(range.createContextualFragment(html));
} else {
var range = iframe_obj.contentWindow.getSelection().getRangeAt(0);
range.deleteContents();
range.insertNode(range.createContextualFragment(html));
}
} catch(e) {
xInnerHtml(iframe_obj.contentWindow.document.body, html+xInnerHtml(iframe_obj.contentWindow.document.body));
}
}

View file

@ -9,7 +9,7 @@
<input type="hidden" name="component_name" value="{$component_name}" />
<div id="popBody">
<table cellspacing="0" class="tableType5">
<table cellspacing="0" class="adminTable">
<col width="100" />
<col />
<tr>

View file

@ -6,7 +6,7 @@
</div>
<div id="popBody">
<table cellspacing="0" class="tableType5">
<table cellspacing="0" class="adminTable">
<col width="100" />
<col />
<tr>
@ -19,7 +19,7 @@
</tr>
<tr>
<th scope="row">{$lang->component_description}</th>
<td>{nl2br($component->description)}</td>
<td>{nl2br(trim($component->description))}</td>
</tr>
</table>
</div>