forked from Mirrors/freeswitch
643 lines
16 KiB
HTML
643 lines
16 KiB
HTML
|
<html>
|
||
|
<head>
|
||
|
|
||
|
<meta http-equiv="Pragma" content="no-cache">
|
||
|
<meta http-equiv="Expires" content="-1">
|
||
|
<meta http-equiv="cache-control" content="no-store">
|
||
|
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
|
||
|
|
||
|
<script language="javascript" content-type="text/javascript" src="swfobject.js"></script>
|
||
|
<script language="javascript" content-type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
|
||
|
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.3/jquery-ui.min.js" ></script>
|
||
|
<script language="javascript" type="text/javascript" src="jquery.query-2.1.7.js"></script>
|
||
|
<script language="javascript" type="text/javascript" src="jquery.tmpl.js"></script>
|
||
|
|
||
|
<script language="javascript" content-type="text/javascript">
|
||
|
var flashvars = {
|
||
|
rtmp_url: 'rtmp://deathstar.freeswitch.org/phone'
|
||
|
};
|
||
|
|
||
|
var params = {
|
||
|
allowScriptAccess: 'always'
|
||
|
};
|
||
|
|
||
|
function makeCall(number, account, options) {
|
||
|
$("#flash")[0].makeCall(number, account, options);
|
||
|
}
|
||
|
|
||
|
function sendDTMF(digit, duration) {
|
||
|
$("#flash")[0].sendDTMF(digit, duration);
|
||
|
}
|
||
|
|
||
|
function onDisplayUpdate(uuid, name, number) {
|
||
|
var elm = $("#call_" + uuid);
|
||
|
elm.children(".callerid_name").text(name);
|
||
|
elm.children(".callerid_number").text(number);
|
||
|
elm.data("name", name);
|
||
|
elm.data("number", number);
|
||
|
|
||
|
if (uuid == $("#incoming_call").data("uuid")) {
|
||
|
$("#incoming_name").text(name);
|
||
|
$("#incoming_number").text(number);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function hangup(uuid) {
|
||
|
$("#flash")[0].hangup(uuid);
|
||
|
}
|
||
|
|
||
|
function answer(uuid) {
|
||
|
$("#flash")[0].answer(uuid);
|
||
|
}
|
||
|
|
||
|
function attach(uuid) {
|
||
|
$("#flash")[0].attach(uuid);
|
||
|
}
|
||
|
|
||
|
function transfer(uuid, dest) {
|
||
|
$("#flash")[0].transfer(uuid, dest);
|
||
|
}
|
||
|
|
||
|
function ui_transfer(uuid) {
|
||
|
$("#transfer").data("uuid", uuid);
|
||
|
$("#transfer").dialog('open');
|
||
|
}
|
||
|
|
||
|
function three_way(uuid1, uuid2) {
|
||
|
$("#flash")[0].three_way(uuid1, uuid2);
|
||
|
}
|
||
|
|
||
|
function do_three_way(uuid) {
|
||
|
var a = $(".active_call").data("uuid");
|
||
|
if (a != "") {
|
||
|
three_way(a, uuid);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function do_join(uuid) {
|
||
|
var a = $(".active_call").data("uuid");
|
||
|
if (a != "") {
|
||
|
join(a, uuid);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
function join(uuid1, uuid2) {
|
||
|
$("#flash")[0].join(uuid1, uuid2);
|
||
|
}
|
||
|
|
||
|
function onCallState(uuid, state) {
|
||
|
$("#call_"+uuid).children('.call_state').text(state);
|
||
|
}
|
||
|
|
||
|
function onIncomingCall(uuid, name, number, account, evt) {
|
||
|
if (name == "") {
|
||
|
name = "Unknown Name";
|
||
|
}
|
||
|
if (number == "") {
|
||
|
number = "Unknown Number";
|
||
|
}
|
||
|
|
||
|
add_call(uuid, name, number);
|
||
|
|
||
|
$("#incoming_call").data("uuid", uuid);
|
||
|
$("#incoming_name").text(name);
|
||
|
$("#incoming_number").text(number);
|
||
|
$("#incoming_account").text(account);
|
||
|
$("#incoming_call").dialog('open');
|
||
|
}
|
||
|
|
||
|
function onDisconnected() {
|
||
|
$("#status").text("Disconnected");
|
||
|
$("#sessionid").text("");
|
||
|
setTimeout(function() {
|
||
|
$("#status").text("Connecting...");
|
||
|
$("#flash")[0].connect();
|
||
|
}, 5000);
|
||
|
}
|
||
|
|
||
|
function onMakeCall(uuid, number, account) {
|
||
|
add_call(uuid, "", number, account);
|
||
|
}
|
||
|
|
||
|
function onHangup(uuid, cause) {
|
||
|
if ($("#incoming_call").data("uuid") == uuid) {
|
||
|
$("#incoming_call").dialog('close');
|
||
|
}
|
||
|
|
||
|
$("#call_" + uuid).children(".hangupcause").text(cause);
|
||
|
|
||
|
setTimeout(function() {
|
||
|
remove_call(uuid);
|
||
|
}, 1000);
|
||
|
}
|
||
|
|
||
|
function onDebug(message) {
|
||
|
$("#log").append(message + "<br/>");
|
||
|
}
|
||
|
|
||
|
function onAttach(uuid) {
|
||
|
$(".active_call").removeClass('active_call');
|
||
|
|
||
|
if (uuid == "") {
|
||
|
$("a", "#controls").button("option", "disabled", true);
|
||
|
} else {
|
||
|
$("a", "#controls").button("option", "disabled", false);
|
||
|
$("#call_" + uuid).addClass('active_call');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function checkMic() {
|
||
|
try {
|
||
|
if ($("#flash")[0].isMuted()) {
|
||
|
$("#no_mic").show();
|
||
|
$("#input_source").hide();
|
||
|
return false;
|
||
|
} else {
|
||
|
$("#no_mic").hide();
|
||
|
$("#input_source").show();
|
||
|
return true;
|
||
|
}
|
||
|
} catch(err) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function onConnected(sessionid) {
|
||
|
$("#sessionid").text(sessionid);
|
||
|
$(".call", "#call_container").remove();
|
||
|
$(".account", "#account_container").remove();
|
||
|
$("#status").text("Connected");
|
||
|
|
||
|
if (!checkMic()) {
|
||
|
$("#security").dialog('open');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function login(user,pass) {
|
||
|
$("#flash")[0].login(user,pass);
|
||
|
}
|
||
|
|
||
|
function logout(account) {
|
||
|
$("#flash")[0].logout(account);
|
||
|
}
|
||
|
|
||
|
function onLogin(status, user, domain) {
|
||
|
if (status != "success") {
|
||
|
softAlert("Authentication failed!", "onAuth");
|
||
|
} else {
|
||
|
//$("#status").html("Connected as <span class='user'>" + user + "</span>@<span class='domain'>" + domain + "</span>");
|
||
|
var u = user + '@' + domain;
|
||
|
$("#flash")[0].register(u, $.query.get('code'));
|
||
|
add_account(user, domain);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function onLogout(user,domain) {
|
||
|
remove_account(user, domain);
|
||
|
}
|
||
|
|
||
|
function onInit() {
|
||
|
var mics = eval($("#flash")[0].micList());
|
||
|
var sources = $("#input_source");
|
||
|
var current_mic = $("#flash")[0].getMic();
|
||
|
sources.children().remove();
|
||
|
|
||
|
$("#status").text("Connecting...");
|
||
|
|
||
|
for (i = 0; i < mics.length; i++) {
|
||
|
var a = (i == current_mic) ? "selected" : "";
|
||
|
sources.append("<option value='"+ i + "' " + a + " >" + mics[i] + "</option");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function onEvent(data) {
|
||
|
onDebug("Got event: " + data);
|
||
|
}
|
||
|
|
||
|
function softAlert(message,title) {
|
||
|
$("#message_text").text(message);
|
||
|
$("#message").dialog('option', 'title', title);
|
||
|
$("#message").dialog('open');
|
||
|
}
|
||
|
|
||
|
function get_uuid(object) {
|
||
|
return object.parent(".call").data("uuid");
|
||
|
}
|
||
|
|
||
|
function add_call(uuid, name, number, account) {
|
||
|
var c = [ {uuid: uuid, name: name, number: number, account: account } ];
|
||
|
|
||
|
var elm = $("#call_template").render(c);
|
||
|
|
||
|
elm.data("uuid", uuid);
|
||
|
elm.data("name", name);
|
||
|
elm.data("number", number);
|
||
|
elm.data("account", account);
|
||
|
|
||
|
elm.appendTo("#call_container");
|
||
|
}
|
||
|
|
||
|
function remove_call(uuid) {
|
||
|
var c = $('#call_'+ uuid);
|
||
|
c.fadeOut("slow", function() { c.remove() } );
|
||
|
}
|
||
|
|
||
|
function get_user(object) {
|
||
|
return object.parent(".account").data("user");
|
||
|
}
|
||
|
|
||
|
function add_account(suser, domain) {
|
||
|
var u = suser + "@" + domain;
|
||
|
var sid = u.replace("@", "_").replace(/\./g, "_");
|
||
|
var c = [ { id: sid, user: u} ];
|
||
|
var elm = $("#account_template").render(c);
|
||
|
elm.data("user", u);
|
||
|
elm.appendTo("#account_container");
|
||
|
$("a", "#account_" + sid).button();
|
||
|
}
|
||
|
|
||
|
function remove_account(suser,domain) {
|
||
|
var u = suser + "_" + domain;
|
||
|
var sid = u.replace(/\./g, "_")
|
||
|
|
||
|
var c = $('#account_'+ sid);
|
||
|
c.fadeOut("slow", function() { c.remove() } );
|
||
|
}
|
||
|
|
||
|
function showSecurity() {
|
||
|
$("#security").dialog('open');
|
||
|
}
|
||
|
|
||
|
|
||
|
function newcall(account) {
|
||
|
$("#callout").data('account', account);
|
||
|
$("#callout").dialog('open');
|
||
|
}
|
||
|
|
||
|
$(document).ready(function() {
|
||
|
swfobject.embedSWF("freeswitch.swf", "flash", "250", "150", "9.0.0", "expressInstall.swf", flashvars, params, []);
|
||
|
|
||
|
if (swfobject.ua.ie) {
|
||
|
$("#flash").css("top", "-500px");
|
||
|
$("#flash").css("left", "-500px");
|
||
|
} else {
|
||
|
$("#flash").css("visibility", "hidden");
|
||
|
}
|
||
|
|
||
|
$("#incoming_call").dialog({
|
||
|
autoOpen: false,
|
||
|
resizable: false,
|
||
|
buttons: {
|
||
|
"Answer": function() {
|
||
|
answer($(this).data("uuid"));
|
||
|
$(this).dialog("close");
|
||
|
},
|
||
|
"Decline": function() {
|
||
|
hangup($(this).data("uuid"));
|
||
|
$(this).dialog("close");
|
||
|
}
|
||
|
}});
|
||
|
|
||
|
$("#callout").dialog({
|
||
|
autoOpen: false,
|
||
|
resizable: false,
|
||
|
width: 600,
|
||
|
buttons: {
|
||
|
"Call": function() {
|
||
|
makeCall($("#number").val(), $(this).data('account'), []);
|
||
|
$(this).dialog("close");
|
||
|
},
|
||
|
"Cancel": function() {
|
||
|
$(this).dialog("close"); }
|
||
|
}
|
||
|
});
|
||
|
$("#message").dialog({
|
||
|
autoOpen: false,
|
||
|
resizable: false,
|
||
|
buttons: {
|
||
|
"Ok": function() {
|
||
|
$(this).dialog("close");
|
||
|
}
|
||
|
}});
|
||
|
|
||
|
$("#controls").dialog({
|
||
|
title: "Keypad",
|
||
|
autoOpen: false,
|
||
|
resizable: false,
|
||
|
width: 200,
|
||
|
height: 220
|
||
|
});
|
||
|
|
||
|
$("#auth").dialog({
|
||
|
modal: true,
|
||
|
autoOpen: false,
|
||
|
resizable: false,
|
||
|
buttons: {
|
||
|
"Ok": function() {
|
||
|
login($("#username").val(), $("#password").val());
|
||
|
$("#password").val('');
|
||
|
$(this).dialog('close');
|
||
|
},
|
||
|
"Cancel": function() {
|
||
|
$(this).dialog('close');
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
$("#transfer").dialog({
|
||
|
autoOpen: false,
|
||
|
resizable: false,
|
||
|
width: 600,
|
||
|
buttons: {
|
||
|
"Ok": function() {
|
||
|
transfer($(this).data("uuid"), $("#transfer_number").val());
|
||
|
$(this).dialog('close');
|
||
|
},
|
||
|
"Cancel": function() {
|
||
|
$(this).dialog('close');
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
$("#security").dialog({
|
||
|
autoOpen: false,
|
||
|
modal: true,
|
||
|
resizable: false,
|
||
|
buttons: {
|
||
|
"Ok": function() {
|
||
|
$(this).dialog("close");
|
||
|
}
|
||
|
},
|
||
|
minWidth: 300,
|
||
|
minHeight: 170,
|
||
|
drag: function () {
|
||
|
var flash = $("#flash");
|
||
|
var fake_flash = $("#fake_flash");
|
||
|
var offset = fake_flash.offset();
|
||
|
|
||
|
flash.css("left", offset.left);
|
||
|
flash.css("top", offset.top + 20);
|
||
|
},
|
||
|
open: function () {
|
||
|
var flash = $("#flash");
|
||
|
var fake_flash = $("#fake_flash");
|
||
|
var offset = fake_flash.offset();
|
||
|
|
||
|
fake_flash.css("width", flash.width())
|
||
|
fake_flash.css("height", flash.height() + 20)
|
||
|
|
||
|
flash.css("left", offset.left);
|
||
|
flash.css("top", offset.top + 20);
|
||
|
flash.css("visibility", "visible");
|
||
|
flash.css("z-index", $("#security").parent(".ui-dialog").css("z-index") + 1);
|
||
|
flash[0].showPrivacy();
|
||
|
},
|
||
|
close: function() {
|
||
|
var flash = $("#flash");
|
||
|
flash.css("visibility", "hidden");
|
||
|
flash.css("left", 0);
|
||
|
flash.css("top", 0);
|
||
|
flash.css("z-index", "auto");
|
||
|
|
||
|
checkMic();
|
||
|
}
|
||
|
});
|
||
|
$("a", "#controls").button({ disabled: true });
|
||
|
$("a", "#call_container").button();
|
||
|
$("a", "#guest_account").button();
|
||
|
});
|
||
|
|
||
|
function testevent() {
|
||
|
var evt = {
|
||
|
test1: "hello",
|
||
|
test2: "hallo",
|
||
|
test3: "allo"
|
||
|
};
|
||
|
$("#flash")[0].sendevent(evt);
|
||
|
}
|
||
|
|
||
|
</script>
|
||
|
<style type="text/css">
|
||
|
.dtmfrow {
|
||
|
min-width: 50px;
|
||
|
width: 20px;
|
||
|
height: 20px;
|
||
|
text-align: center;
|
||
|
vertical-align: center;
|
||
|
}
|
||
|
|
||
|
#call_container {
|
||
|
float: right;
|
||
|
}
|
||
|
|
||
|
#account_container {
|
||
|
float: left;
|
||
|
}
|
||
|
|
||
|
.call {
|
||
|
border: 1px solid #181469;
|
||
|
width: 400px;
|
||
|
height: 120px;
|
||
|
}
|
||
|
|
||
|
.account, #guest_account {
|
||
|
border: 1px solid #181469;
|
||
|
height: 100px;
|
||
|
width: 300px;
|
||
|
padding-left: 20px;
|
||
|
}
|
||
|
|
||
|
#call_add {
|
||
|
width: 400px;
|
||
|
text-align: right;
|
||
|
}
|
||
|
|
||
|
.active_call {
|
||
|
background-color: #DBF2C2;
|
||
|
}
|
||
|
|
||
|
.three_way {
|
||
|
background-color: #C0DAF2;
|
||
|
}
|
||
|
|
||
|
#controls {
|
||
|
float: left;
|
||
|
}
|
||
|
|
||
|
#flash {
|
||
|
float: left;
|
||
|
visibility: hidden;
|
||
|
position: absolute;
|
||
|
top: 0;
|
||
|
left: 0;
|
||
|
}
|
||
|
|
||
|
#log {
|
||
|
font-size: 13px;
|
||
|
}
|
||
|
|
||
|
#header {
|
||
|
background-color: #003366;
|
||
|
color: white;
|
||
|
height: 30px;
|
||
|
width: 100%;
|
||
|
padding-top: 10px;
|
||
|
padding-left: 5px;
|
||
|
}
|
||
|
|
||
|
#input_source_container {
|
||
|
|
||
|
}
|
||
|
|
||
|
#status {
|
||
|
|
||
|
}
|
||
|
|
||
|
#sessionid {
|
||
|
margin-left: 20px;
|
||
|
}
|
||
|
|
||
|
#header a, #header a:visited, #header a:hover {
|
||
|
color: #white;
|
||
|
text-decoration: underline;
|
||
|
}
|
||
|
|
||
|
#no_mic {
|
||
|
float: right;
|
||
|
padding-right: 10px;
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
#input_source {
|
||
|
float: right;
|
||
|
padding-right: 10px;
|
||
|
}
|
||
|
</style>
|
||
|
<script id="call_template" type="text/html">
|
||
|
<div class="call" id="call_{{= uuid}}">
|
||
|
<p class="callerid">
|
||
|
Account: {{= account}}<br/>
|
||
|
<span class="callerid_name">{{= name}}</span> <span class="callerid_number">{{= number}}</span>
|
||
|
</p>
|
||
|
Call state: <span class="call_state"></span> <span class="hangupcause"></span><br/>
|
||
|
<a href="#" onClick="attach(get_uuid($(this)))">Switch</a>
|
||
|
<a href="#" onClick="hangup(get_uuid($(this)))">Hangup</a>
|
||
|
<a href="#" onClick="do_three_way(get_uuid($(this)))">3-way</a>
|
||
|
<a href="#" onClick="do_join(get_uuid($(this)))">Join</a>
|
||
|
<a href="#" onClick="ui_transfer(get_uuid($(this)))">Transfer</a>
|
||
|
</div>
|
||
|
</script>
|
||
|
<script id="account_template" type="text/html">
|
||
|
<div class="account" id="account_{{= id}}">
|
||
|
<p>User: {{= user}}</p>
|
||
|
<a href="#" onClick="logout(get_user($(this)))">Logout</a>
|
||
|
<a href="#" onClick="newcall(get_user($(this)));">+ New Call</a>
|
||
|
</div>
|
||
|
</script>
|
||
|
</head>
|
||
|
<body>
|
||
|
|
||
|
<!-- Dialogs -->
|
||
|
<div id="incoming_call" title="Incoming call">
|
||
|
Account: <span id="incoming_account"></span><br/>
|
||
|
<h3><span id="incoming_name"></span></h3>
|
||
|
<h3><span id="incoming_number"></span></h3>
|
||
|
</div>
|
||
|
|
||
|
<div id="callout" title="Call out">
|
||
|
<input type="text" id="number" value="sip:888@conference.freeswitch.org" size="58" />
|
||
|
</div>
|
||
|
|
||
|
<div id="message">
|
||
|
<span id="message_text"></span>
|
||
|
</div>
|
||
|
|
||
|
<div id="transfer" title="Transfer call">
|
||
|
<input type="text" id="transfer_number" value="sip:888@conference.freeswitch.org" size="58" />
|
||
|
</div>
|
||
|
|
||
|
<div id="security" title="Permissions required">
|
||
|
You must accept to use your microphone on this site in order to be able to make phone calls
|
||
|
<div id="fake_flash" width="300" height="170"></div>
|
||
|
</div>
|
||
|
|
||
|
<div id="auth" title="Login">
|
||
|
Username: <input type="text" name="username" value="" id="username" />
|
||
|
Password: <input type="password" name="password" value="" id="password" />
|
||
|
</div>
|
||
|
|
||
|
<!-- End Dialogs -->
|
||
|
|
||
|
<div id="header">
|
||
|
<span id="status">Waiting for flash...</span>
|
||
|
<span id="sessionid"></span>
|
||
|
<span id="no_mic">
|
||
|
<img src="warning-icon.png" width="21" height="20" />
|
||
|
<a href="#" onClick="showSecurity();">Microphone not allowed</a>
|
||
|
</span>
|
||
|
|
||
|
<select id="input_source" onChange="$('#flash')[0].setMic($(this).val())" >
|
||
|
</select>
|
||
|
|
||
|
</div>
|
||
|
|
||
|
<div id="flash">
|
||
|
<h1>Alternative content</h1>
|
||
|
<p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
|
||
|
</div>
|
||
|
|
||
|
<div id="call_container">
|
||
|
<div id="call_add" class="button">
|
||
|
<a href="#" onClick="attach('');">Hold</a>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div>
|
||
|
<a href="#" onClick="showSecurity();">Privacy</a>
|
||
|
<a href="#" onClick="$('#log').html('')" >Clear log</a>
|
||
|
<a href="#" onClick="$('#controls').dialog('open');">Show Keypad</a>
|
||
|
<a href="#" onClick="$('#auth').dialog('open');">Login</a>
|
||
|
</div>
|
||
|
|
||
|
<div id="controls" class="button">
|
||
|
<table cols=3 border=0>
|
||
|
<tr>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('1', 2000)">1</a></td>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('2', 2000)">2</a></td>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('3', 2000)">3</a></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('4', 2000)">4</a></td>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('5', 2000)">5</a></td>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('6', 2000)">6</a></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('7', 2000)">7</a></td>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('8', 2000)">8</a></td>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('9', 2000)">9</a></td>
|
||
|
</tr>
|
||
|
<tr>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('*', 2000)">*</a></td>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('0', 2000)">0</a></td>
|
||
|
<td class="dtmfrow"><a href="#" onClick="sendDTMF('#', 2000)">#</a></td>
|
||
|
</tr>
|
||
|
</table>
|
||
|
|
||
|
<div id="#input_device">
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div id="account_container">
|
||
|
<div class="guest_account" id="guest_account">
|
||
|
<p>Guest account</p>
|
||
|
<a href="#" onClick="newcall('');">+ New Call</a>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div id="log">
|
||
|
</div>
|
||
|
|
||
|
</body>
|
||
|
</html>
|