Get rid of old code
parent
6a6d41af20
commit
6599ae02e8
@ -1,13 +0,0 @@
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
@ -1,31 +0,0 @@
|
||||
== LICENSE ==
|
||||
|
||||
All parts of CVM are licensed under the WTFPL. Other licenses may apply to libraries or components that were incorporated from other projects.
|
||||
Please read the LICENSE file for the full license text.
|
||||
|
||||
|
||||
== USING SHADOW SOURCE FILES ==
|
||||
|
||||
Shadow source files are saved JSON objects from the multi-layer CSS3 shadow generator at http://haless.cryto.net/shadow/. To edit a shadow, simply load the string in the applicable text file into the shadow generator, and after editing save the shadow configuration and generate new CSS code.
|
||||
|
||||
|
||||
== DIRECTORY STRUCTURE ==
|
||||
|
||||
repository root
|
||||
|- design/ The first design proposal for the user frontend
|
||||
| |- css/ CSS files for the design proposal
|
||||
| `- images/ Images for the design proposal
|
||||
`- graphics/ Original source files for images (.xcf, .svg, ...) and CSS3 shadows (.txt).
|
||||
`- frontend/ Code for the frontend (this is the actual panel)
|
||||
| |- classes/ Contains all class definitions
|
||||
| |- cphp/ Contains the CPHP framework
|
||||
| | ` components/ Contains additional CPHP components
|
||||
| |- includes/ Contains all included/required files for the frontend
|
||||
| |- locales/ Contains all CPHP locale files
|
||||
| `- templates/ Contains all CPHP template files
|
||||
`- runhelper/ This directory contains the runhelper script for the slave nodes
|
||||
|
||||
== DEPENDENCIES ==
|
||||
|
||||
* autossh
|
||||
* ...
|
@ -1,28 +0,0 @@
|
||||
import sys, os, subprocess
|
||||
|
||||
stfu = open("/dev/null", "w")
|
||||
|
||||
def run_command(args):
|
||||
pr = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
data = pr.communicate()
|
||||
pr.wait()
|
||||
return pr.returncode
|
||||
|
||||
host = sys.argv[1]
|
||||
user = sys.argv[2]
|
||||
port = int(sys.argv[3])
|
||||
keyfile = sys.argv[4]
|
||||
session_key = sys.argv[5]
|
||||
|
||||
if run_command(["ssh", "%s@%s" % (user, host), "-o", "UserKnownHostsFile=/etc/cvm/knownhosts", "-o", "StrictHostKeyChecking=no", "-i", keyfile, "cd /etc/cvm/command_daemon; echo '%s' > session_key && ./command_daemon" % session_key]) == 0:
|
||||
# Make autossh verify the connection is still alive every 10 seconds.
|
||||
os.environ["AUTOSSH_POLL"] = "10"
|
||||
os.environ["AUTOSSH_FIRST_POLL"] = "10"
|
||||
|
||||
if run_command(["autossh", "-f", "-i", keyfile, "-M", str(port + 1), "-o", "UserKnownHostsFile=/etc/cvm/knownhosts", "-o", "StrictHostKeyChecking=no", "%s@%s" % (user, host), "-L", "%s:localhost:3434" % port, "-N"]) == 0:
|
||||
sys.stdout.write("Tunnel established.\n");
|
||||
exit(0)
|
||||
else:
|
||||
sys.stderr.write("Failed to establish tunnel.\n")
|
||||
else:
|
||||
sys.stderr.write("Failed to start daemon.\n")
|
@ -1,37 +0,0 @@
|
||||
{
|
||||
"database": {
|
||||
"driver": "mysql",
|
||||
"pdo": "true",
|
||||
"hostname": "localhost",
|
||||
"username": "root",
|
||||
"password": "",
|
||||
"database": "cvm"
|
||||
},
|
||||
"locale": {
|
||||
"path": "locales",
|
||||
"extension": "lng",
|
||||
"default_locale": "english",
|
||||
"default_timezone": "Europe/Amsterdam"
|
||||
},
|
||||
"memcache": {
|
||||
"enabled": true,
|
||||
"compressed": true,
|
||||
"hostname": "localhost",
|
||||
"port": 11211
|
||||
},
|
||||
"class_map": {
|
||||
"user": "User",
|
||||
"node": "Node",
|
||||
"container": "Container",
|
||||
"template": "Template"
|
||||
},
|
||||
"components": [
|
||||
"router",
|
||||
"errorhandler"
|
||||
],
|
||||
"authentication": {
|
||||
"salt": "abcdef",
|
||||
"session_length": 2592000
|
||||
},
|
||||
"theme": "pure"
|
||||
}
|
@ -1,150 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import socket, sys, termios, tty, select, urllib, urllib2, json, warnings, getpass
|
||||
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter("ignore")
|
||||
import paramiko
|
||||
|
||||
key = "abcde"
|
||||
endpoint = "http://cvm.local/api.local.php"
|
||||
|
||||
def posix_shell(chan, ctid):
|
||||
oldtty = termios.tcgetattr(sys.stdin)
|
||||
|
||||
enable_input = False
|
||||
|
||||
try:
|
||||
tty.setraw(sys.stdin.fileno())
|
||||
tty.setcbreak(sys.stdin.fileno())
|
||||
chan.settimeout(0.0)
|
||||
|
||||
chan.send('%s\n' % ctid)
|
||||
|
||||
while True:
|
||||
r, w, e = select.select([chan, sys.stdin], [], [])
|
||||
if chan in r:
|
||||
try:
|
||||
buff = chan.recv(1024)
|
||||
|
||||
if len(buff) == 0:
|
||||
print '\r\nYou have been logged out of your container. Goodbye!\r\n',
|
||||
break
|
||||
|
||||
if "entered into" in buff:
|
||||
# Successfully entered into the container, we can enable user input now.
|
||||
enable_input = True
|
||||
|
||||
sys.stdout.write(buff)
|
||||
sys.stdout.flush()
|
||||
except socket.timeout:
|
||||
pass
|
||||
if sys.stdin in r:
|
||||
if enable_input == True:
|
||||
buff = sys.stdin.read(1)
|
||||
|
||||
if len(buff) == 0:
|
||||
break
|
||||
|
||||
chan.send(buff)
|
||||
|
||||
finally:
|
||||
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
|
||||
|
||||
def open_shell(hostname, user, container):
|
||||
ssh = paramiko.SSHClient()
|
||||
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
|
||||
sshkey = paramiko.RSAKey.from_private_key_file('/etc/cvm/key')
|
||||
|
||||
ssh.connect(hostname, username=user, pkey=sshkey)
|
||||
|
||||
chan = ssh.invoke_shell()
|
||||
posix_shell(chan, container)
|
||||
|
||||
chan.close()
|
||||
ssh.close()
|
||||
|
||||
def api_request(parameters, method="GET"):
|
||||
if method == "GET":
|
||||
querystring = urllib.urlencode(parameters)
|
||||
req = urllib2.Request(endpoint + "?" + querystring)
|
||||
response = urllib2.urlopen(req)
|
||||
result = response.read()
|
||||
return json.loads(result)
|
||||
|
||||
def show_list():
|
||||
print ""
|
||||
for key, vps in vpsmap.items():
|
||||
node = nodemap[vps['node_id']]
|
||||
print "%s. %s (%s [%s], %s)" % (key, vps['hostname'], node['name'], node['hostname'], node['physical_location'])
|
||||
|
||||
print ""
|
||||
choice = raw_input("Make your choice: ")
|
||||
|
||||
try:
|
||||
current_vps = vpsmap[int(choice)]
|
||||
current_node = nodemap[current_vps['node_id']]
|
||||
|
||||
open_shell(current_node['hostname'], "vz", current_vps['internal_id'])
|
||||
except KeyError, ValueError:
|
||||
print "That was not a valid option. Try again. "
|
||||
show_list()
|
||||
except paramiko.AuthenticationException:
|
||||
print "Could not connect to the node."
|
||||
exit(1)
|
||||
|
||||
print "#############################################################"
|
||||
print "### CVM OpenVZ shell dropper ###"
|
||||
print "#############################################################"
|
||||
print ""
|
||||
print "Please enter your VPS panel login details to continue."
|
||||
print ""
|
||||
username = raw_input("Username: ")
|
||||
password = getpass.getpass("Password: ")
|
||||
print ""
|
||||
|
||||
auth_result = api_request({
|
||||
'key': key,
|
||||
'action': "verify_user",
|
||||
'username': username,
|
||||
'password': password
|
||||
})
|
||||
|
||||
if auth_result['data']['correct'] == True:
|
||||
vpslist = api_request({
|
||||
'key': key,
|
||||
'action': "list_vps",
|
||||
'userid': auth_result["data"]["userid"]
|
||||
})
|
||||
|
||||
print "Select the container you wish to log in to."
|
||||
print ""
|
||||
|
||||
i = 1
|
||||
vpsmap = {}
|
||||
nodelist = []
|
||||
nodemap = {}
|
||||
|
||||
for vps in vpslist["data"]:
|
||||
vpsmap[i] = vps
|
||||
|
||||
if vps["node_id"] not in nodelist:
|
||||
nodelist.append(vps["node_id"])
|
||||
|
||||
i += 1
|
||||
|
||||
for node in nodelist:
|
||||
nodemap[node] = api_request({
|
||||
'key': key,
|
||||
'action': "node_info",
|
||||
'nodeid': node
|
||||
})['data']
|
||||
|
||||
show_list()
|
||||
|
||||
exit(0)
|
||||
else:
|
||||
print "The supplied login details are invalid."
|
||||
print "Your session will now be closed."
|
||||
exit(1)
|
@ -1,6 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
import sys, subprocess
|
||||
|
||||
ctid = raw_input()
|
||||
subprocess.call('clear')
|
||||
subprocess.call(['sudo', 'vzctl', 'enter', ctid])
|
@ -1,221 +0,0 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
body {
|
||||
background-color: #F5F5F5;
|
||||
font-family: sans-serif;
|
||||
margin-right: 40px;
|
||||
}
|
||||
|
||||
h2, h3, h4, h5, h6, h7
|
||||
{
|
||||
margin-top: 16px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.children { padding-left: 40px; }
|
||||
|
||||
.definition
|
||||
{
|
||||
font-weight: bold;
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.example
|
||||
{
|
||||
padding: 5px 6px;
|
||||
font-weight: bold;
|
||||
font-size: 15px;
|
||||
background-color: #E6E6E6;
|
||||
margin-top: 11px;
|
||||
}
|
||||
|
||||
.example > .children
|
||||
{
|
||||
padding-top: 11px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.example > .children > h7
|
||||
{
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
h7
|
||||
{
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
pre
|
||||
{
|
||||
margin-top: 0px;
|
||||
padding: 6px 7px;
|
||||
background-color: #D9D9D9;
|
||||
font-weight: normal;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
dl
|
||||
{
|
||||
margin: 5px 0px;
|
||||
}
|
||||
|
||||
dt
|
||||
{
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
dd
|
||||
{
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
dd > .children
|
||||
{
|
||||
font-size: 95%;
|
||||
}
|
||||
|
||||
dd > .children > dl > dd
|
||||
{
|
||||
margin-left: 13px;
|
||||
}
|
||||
|
||||
.exclamation
|
||||
{
|
||||
padding: 7px 8px;
|
||||
margin: 11px 0px;
|
||||
background-color: #FFE9AA;
|
||||
border: 1px solid yellow;
|
||||
font-size: 15px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.text
|
||||
{
|
||||
font-size: 15px;
|
||||
font-weight: normal;
|
||||
margin-bottom: 14px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.toc
|
||||
{
|
||||
border: 1px solid gray;
|
||||
background-color: #E6E6E6;
|
||||
padding: 8px 9px;
|
||||
font-size: 15px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.toc h2
|
||||
{
|
||||
margin: 0px 0px 3px 0px;
|
||||
font-size: 19px;
|
||||
}
|
||||
|
||||
.toc ul
|
||||
{
|
||||
margin-top: 0px;
|
||||
margin-bottom: 0px;
|
||||
padding-left: 25px;
|
||||
}
|
||||
|
||||
.toc li
|
||||
{
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.toc .alternatives
|
||||
{
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.toc a
|
||||
{
|
||||
color: #292722;
|
||||
}
|
||||
|
||||
.toc a:hover
|
||||
{
|
||||
color: black;
|
||||
}
|
||||
|
||||
.fixed
|
||||
{
|
||||
font-family: monospace;
|
||||
background-color: white;
|
||||
padding: 1px 4px;
|
||||
border: 1px solid silver;
|
||||
border-radius: 4px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="children"><h1>CVM Client API Documentation</h1><div class="toc"><h2>Table of contents</h2><ul><li><a href="#GETapiclientvpslist">GET /api/client/vps/list</a> This call will return a list of VPSes associated with the currently... </li><li><a href="#GETapiclientvpsidstatus">GET /api/client/vps/id/status</a> This returns the current status and metrics for the specified VPS. The response... </li><li><a href="#POSTapiclientvpsidstart">POST /api/client/vps/id/start</a> Starts the specified VPS. Returns either a <span class="fixed">200</span> status code with an empty... </li><li><a href="#POSTapiclientvpsidstop">POST /api/client/vps/id/stop</a> Shuts down the specified VPS. Returns either a <span class="fixed">200</span> status code with an empty... </li><li><a href="#POSTapiclientvpsidrestart">POST /api/client/vps/id/restart</a> Restarts the specified VPS. Returns either a <span class="fixed">200</span> status code with an empty... </li></ul></div><h2>Overview</h2><div class="text">The CVM Client API is a more or less RESTful API. That means it uses the standard HTTP 'verbs' like GET, POST, DELETE, etc. to execute certain commands. Authentication takes place per request (there is no concept of 'sessions') through the use of custom HTTP headers. Each API token pair is linked to a particular user, and can only be used for that user. A user can have multiple token pairs. Token pairs can be revoked at any time via the panel.</div><h2>Authentication</h2><div class="text">The CVM Client API expects two custom HTTP headers as authentication.</div><dl><dt>API-Public-Token</dt><dd>This is the public part of your API token pair. It's used to identify who you are.<div class="children"></div></dd></dl><dl><dt>API-Private-Token</dt><dd>This is the private part of your API token pair. It's used to verify your access.<div class="children"></div></dd></dl><div class="text">If no valid token pair is passed on with your request, the server will return a <span class="fixed">401 Not Authorized</span> status code.</div><div class="text">If your token pair does not have access to the client API, the server will return a <span class="fixed">403 Forbidden</span> status code.</div><h2>Response format</h2><div class="text">The API responses will always be in JSON format. If errors occurred, an <span class="fixed">errors</span> key will be present containing an array of errors. If there is a response, a <span class="fixed">response</span> key will be present containing the response.</div><div class="example">Example: Valid API call <div class="children"><h7>Code:</h7><pre class="code">/api/client/vps/list</pre><h7>Output:</h7><pre class="output">{
|
||||
"response": {
|
||||
"vpses": [{
|
||||
"id": "1",
|
||||
"virtualization_type": "1",
|
||||
"hostname": "test-vz.cryto.net",
|
||||
"guaranteed_ram": "128",
|
||||
"burstable_ram": "256",
|
||||
"disk_space": "5000",
|
||||
"cpu_count": "1",
|
||||
"traffic_in_limit": "500000000000",
|
||||
"traffic_out_limit": "500000000000",
|
||||
"traffic_in_used": "912727849",
|
||||
"traffic_out_used": "16923948"
|
||||
}, {
|
||||
"id": "2",
|
||||
"virtualization_type": "1",
|
||||
"hostname": "test2.cryto.net",
|
||||
"guaranteed_ram": "512",
|
||||
"burstable_ram": "768",
|
||||
"disk_space": "40000",
|
||||
"cpu_count": "240",
|
||||
"traffic_in_limit": "500000000000",
|
||||
"traffic_out_limit": "500000000000",
|
||||
"traffic_in_used": "0",
|
||||
"traffic_out_used": "0"
|
||||
}]
|
||||
}
|
||||
}</pre></div></div><div class="example">Example: API call with invalid token pair <div class="children"><h7>Code:</h7><pre class="code">/api/client/vps/list</pre><h7>Output:</h7><pre class="output">{
|
||||
"errors": ["No valid API token pair was specified."]
|
||||
}</pre></div></div><h2>API Calls</h2><div class="definition"><a name="GETapiclientvpslist">GET /api/client/vps/list <div class="children"><div class="text">This call will return a list of VPSes associated with the currently authenticated user. It takes no arguments.</div><h3>Keys in the response objects</h3><dl><dt>id</dt><dd>The numeric ID of this VPS. You will need this in further API calls.<div class="children"></div></dd></dl><dl><dt>node</dt><dd>The host node that this VPS exists on. You will need this in further node-related API calls.<div class="children"></div></dd></dl><dl><dt>virtualization_type</dt><dd>The virtualization platform used for this VPS. Right now the only supported value is <span class="fixed">1</span> (OpenVZ).<div class="children"></div></dd></dl><dl><dt>hostname</dt><dd>The configured hostname of the VPS.<div class="children"></div></dd></dl><dl><dt>guaranteed_ram</dt><dd>The configured amount of guaranteed RAM, in <strong>megabytes</strong>.<div class="children"></div></dd></dl><dl><dt>burstable_ram</dt><dd>The configured amount of burstable RAM, in <strong>megabytes</strong>. <em>This key may not be present if vSwap is used.</em><div class="children"></div></dd></dl><dl><dt>disk_space</dt><dd>The configured amount of disk space, in <strong>megabytes</strong>.<div class="children"></div></dd></dl><dl><dt>cpu_count</dt><dd>The amount of configured CPUs (or rather, CPU units) that this VPS has access to.<div class="children"></div></dd></dl><dl><dt>traffic_limit</dt><dd>The total traffic limit, in <strong>bytes</strong>. <em>This may not be present, depending on the method of traffic measuring. See the explanation below.</em><div class="children"></div></dd></dl><dl><dt>traffic_used</dt><dd>The total amount of traffic used, in <strong>bytes</strong>. <em>This may not be present, depending on the method of traffic measuring. See the explanation below.</em><div class="children"></div></dd></dl><dl><dt>traffic_in_limit</dt><dd>The total incoming traffic limit, in <strong>bytes</strong>. <em>This may not be present, depending on the method of traffic measuring. See the explanation below.</em><div class="children"></div></dd></dl><dl><dt>traffic_in_used</dt><dd>The total amount of incoming traffic used, in <strong>bytes</strong>. <em>This may not be present, depending on the method of traffic measuring. See the explanation below.</em><div class="children"></div></dd></dl><dl><dt>traffic_out_limit</dt><dd>The total outgoing traffic limit, in <strong>bytes</strong>. <em>This may not be present, depending on the method of traffic measuring. See the explanation below.</em><div class="children"></div></dd></dl><dl><dt>traffic_out_used</dt><dd>The total amount of outgoing traffic used, in <strong>bytes</strong>. <em>This may not be present, depending on the method of traffic measuring. See the explanation below.</em><div class="children"></div></dd></dl><div class="exclamation"><strong>Important:</strong> If traffic accounting for the VPS is combined (incoming + outgoing), a <span class="fixed">traffic_limit</span> and <span class="fixed">traffic_used</span> key will be present. If traffic accounting for the VPS is split, the keys <span class="fixed">traffic_in_limit</span>, <span class="fixed">traffic_in_used</span>, <span class="fixed">traffic_out_limit</span>, and <span class="fixed">traffic_out_used</span> will be present. <div class="children"></div></div><div class="example">Example: Valid call to /api/client/vps/list <div class="children"><h7>Output:</h7><pre class="output">{
|
||||
"response": {
|
||||
"vpses": [{
|
||||
"id": "1",
|
||||
"node": "1",
|
||||
"virtualization_type": "1",
|
||||
"hostname": "test-vz.cryto.net",
|
||||
"guaranteed_ram": "128",
|
||||
"burstable_ram": "256",
|
||||
"disk_space": "5000",
|
||||
"cpu_count": "1",
|
||||
"traffic_in_limit": "500000000000",
|
||||
"traffic_out_limit": "500000000000",
|
||||
"traffic_in_used": "912727849",
|
||||
"traffic_out_used": "16923948"
|
||||
}, {
|
||||
"id": "2",
|
||||
"node": "1",
|
||||
"virtualization_type": "1",
|
||||
"hostname": "test2.cryto.net",
|
||||
"guaranteed_ram": "512",
|
||||
"burstable_ram": "768",
|
||||
"disk_space": "40000",
|
||||
"cpu_count": "2",
|
||||
"traffic_in_limit": "500000000000",
|
||||
"traffic_out_limit": "500000000000",
|
||||
"traffic_in_used": "0",
|
||||
"traffic_out_used": "0"
|
||||
}]
|
||||
}
|
||||
}</pre></div></div></div></a></div><div class="definition"><a name="GETapiclientvpsidstatus">GET /api/client/vps/<em>id</em>/status <div class="children"><div class="text">This returns the current status and metrics for the specified VPS. The response will be a single object.</div><h3>Arguments</h3><dl><dt>id</dt><dd>The ID of the VPS you wish to retrieve the status for.<div class="children"></div></dd></dl><h3>Keys in the response object</h3><dl><dt>traffic_used</dt><dd>The total amount of traffic used, in <strong>bytes</strong>. <em>This may not be present, depending on the method of traffic measuring.</em><div class="children"></div></dd></dl><dl><dt>traffic_in_used</dt><dd>The total amount of incoming traffic used, in <strong>bytes</strong>. <em>This may not be present, depending on the method of traffic measuring.</em><div class="children"></div></dd></dl><dl><dt>traffic_out_used</dt><dd>The total amount of outgoing traffic used, in <strong>bytes</strong>. <em>This may not be present, depending on the method of traffic measuring.</em><div class="children"></div></dd></dl><dl><dt>ram_used</dt><dd>The amount of RAM that is currently in use for the VPS, in <strong>bytes</strong>.<div class="children"></div></dd></dl><dl><dt>disk_used</dt><dd>The amount of disk space currently used by the VPS, in <strong>bytes</strong>.<div class="children"></div></dd></dl><dl><dt>status</dt><dd>The current status of the VPS.<div class="children"><dl><dt>running</dt><dd>The VPS is active and booted.<div class="children"></div></dd></dl><dl><dt>stopped</dt><dd>The VPS is active and shut down.<div class="children"></div></dd></dl><dl><dt>suspended</dt><dd>The VPS is suspended.<div class="children"></div></dd></dl><dl><dt>terminated</dt><dd>The VPS is terminated.<div class="children"></div></dd></dl><dl><dt>unknown</dt><dd>The status of the VPS is unknown. This can happen when, for example, the host node can't be reached.<div class="children"></div></dd></dl></div></dd></dl></div></a></div><div class="definition"><a name="POSTapiclientvpsidstart">POST /api/client/vps/<em>id</em>/start <div class="children"><div class="text">Starts the specified VPS. Returns either a <span class="fixed">200</span> status code with an empty response if successful, a <span class="fixed">500</span> status code with an error message if the VPS fails to start, or a <span class="fixed">503</span> status code with an error message if the host node is unreachable.</div><h3>Arguments</h3><dl><dt>id</dt><dd>The ID of the VPS you wish to start.<div class="children"></div></dd></dl></div></a></div><div class="definition"><a name="POSTapiclientvpsidstop">POST /api/client/vps/<em>id</em>/stop <div class="children"><div class="text">Shuts down the specified VPS. Returns either a <span class="fixed">200</span> status code with an empty response if successful, a <span class="fixed">500</span> status code with an error message if the VPS fails to shut down, or a <span class="fixed">503</span> status code with an error message if the host node is unreachable.</div><h3>Arguments</h3><dl><dt>id</dt><dd>The ID of the VPS you wish to stop.<div class="children"></div></dd></dl></div></a></div><div class="definition"><a name="POSTapiclientvpsidrestart">POST /api/client/vps/<em>id</em>/restart <div class="children"><div class="text">Restarts the specified VPS. Returns either a <span class="fixed">200</span> status code with an empty response if successful, a <span class="fixed">500</span> status code with an error message if the VPS fails to restart, or a <span class="fixed">503</span> status code with an error message if the host node is unreachable.</div><h3>Arguments</h3><dl><dt>id</dt><dd>The ID of the VPS you wish to restart.<div class="children"></div></dd></dl></div></a></div></div>
|
||||
</body>
|
||||
</html>
|
@ -1,230 +0,0 @@
|
||||
# CVM Client API Documentation
|
||||
|
||||
{TOC}
|
||||
|
||||
## Overview
|
||||
|
||||
The CVM Client API is a more or less RESTful API. That means it uses the standard HTTP 'verbs' like GET, POST, DELETE, etc. to execute certain commands.
|
||||
Authentication takes place per request (there is no concept of 'sessions') through the use of custom HTTP headers. Each API token pair is linked to a particular
|
||||
user, and can only be used for that user. A user can have multiple token pairs. Token pairs can be revoked at any time via the panel.
|
||||
|
||||
## Authentication
|
||||
|
||||
The CVM Client API expects two custom HTTP headers as authentication.
|
||||
|
||||
API-Public-Token::
|
||||
This is the public part of your API token pair. It's used to identify who you are.
|
||||
|
||||
API-Private-Token::
|
||||
This is the private part of your API token pair. It's used to verify your access.
|
||||
|
||||
If no valid token pair is passed on with your request, the server will return a `401 Not Authorized` status code.
|
||||
|
||||
If your token pair does not have access to the client API, the server will return a `403 Forbidden` status code.
|
||||
|
||||
## Response format
|
||||
|
||||
The API responses will always be in JSON format. If errors occurred, an `errors` key will be present containing an array of errors. If there is a response, a `response` key will
|
||||
be present containing the response.
|
||||
|
||||
@ Valid API call
|
||||
|
||||
$ /api/client/vps/list
|
||||
|
||||
> {
|
||||
"response": {
|
||||
"vpses": [{
|
||||
"id": "1",
|
||||
"virtualization_type": "1",
|
||||
"hostname": "test-vz.cryto.net",
|
||||
"guaranteed_ram": "128",
|
||||
"burstable_ram": "256",
|
||||
"disk_space": "5000",
|
||||
"cpu_count": "1",
|
||||
"traffic_in_limit": "500000000000",
|
||||
"traffic_out_limit": "500000000000",
|
||||
"traffic_in_used": "912727849",
|
||||
"traffic_out_used": "16923948"
|
||||
}, {
|
||||
"id": "2",
|
||||
"virtualization_type": "1",
|
||||
"hostname": "test2.cryto.net",
|
||||
"guaranteed_ram": "512",
|
||||
"burstable_ram": "768",
|
||||
"disk_space": "40000",
|
||||
"cpu_count": "240",
|
||||
"traffic_in_limit": "500000000000",
|
||||
"traffic_out_limit": "500000000000",
|
||||
"traffic_in_used": "0",
|
||||
"traffic_out_used": "0"
|
||||
}]
|
||||
}
|
||||
}
|
||||
|
||||
@ API call with invalid token pair
|
||||
|
||||
$ /api/client/vps/list
|
||||
|
||||
> {
|
||||
"errors": ["No valid API token pair was specified."]
|
||||
}
|
||||
|
||||
## API Calls
|
||||
|
||||
^ GET /api/client/vps/list
|
||||
|
||||
This call will return a list of VPSes associated with the currently authenticated user. It takes no arguments.
|
||||
|
||||
### Keys in the response objects
|
||||
|
||||
id::
|
||||
The numeric ID of this VPS. You will need this in further API calls.
|
||||
|
||||
node::
|
||||
The host node that this VPS exists on. You will need this in further node-related API calls.
|
||||
|
||||
virtualization_type::
|
||||
The virtualization platform used for this VPS. Right now the only supported value is `1` (OpenVZ).
|
||||
|
||||
hostname::
|
||||
The configured hostname of the VPS.
|
||||
|
||||
guaranteed_ram::
|
||||
The configured amount of guaranteed RAM, in __megabytes__.
|
||||
|
||||
burstable_ram::
|
||||
The configured amount of burstable RAM, in __megabytes__. **This key may not be present if vSwap is used.**
|
||||
|
||||
disk_space::
|
||||
The configured amount of disk space, in __megabytes__.
|
||||
|
||||
cpu_count::
|
||||
The amount of configured CPUs (or rather, CPU units) that this VPS has access to.
|
||||
|
||||
traffic_limit::
|
||||
The total traffic limit, in __bytes__. **This may not be present, depending on the method of traffic measuring. See the explanation below.**
|
||||
|
||||
traffic_used::
|
||||
The total amount of traffic used, in __bytes__. **This may not be present, depending on the method of traffic measuring. See the explanation below.**
|
||||
|
||||
traffic_in_limit::
|
||||
The total incoming traffic limit, in __bytes__. **This may not be present, depending on the method of traffic measuring. See the explanation below.**
|
||||
|
||||
traffic_in_used::
|
||||
The total amount of incoming traffic used, in __bytes__. **This may not be present, depending on the method of traffic measuring. See the explanation below.**
|
||||
|
||||
traffic_out_limit::
|
||||
The total outgoing traffic limit, in __bytes__. **This may not be present, depending on the method of traffic measuring. See the explanation below.**
|
||||
|
||||
traffic_out_used::
|
||||
The total amount of outgoing traffic used, in __bytes__. **This may not be present, depending on the method of traffic measuring. See the explanation below.**
|
||||
|
||||
! If traffic accounting for the VPS is combined (incoming + outgoing), a `traffic_limit` and `traffic_used` key will be present. If traffic accounting for the VPS is split, the keys `traffic_in_limit`, `traffic_in_used`, `traffic_out_limit`, and `traffic_out_used` will be present.
|
||||
|
||||
@ Valid call to /api/client/vps/list
|
||||
|
||||
> {
|
||||
"response": {
|
||||
"vpses": [{
|
||||
"id": "1",
|
||||
"node": "1",
|
||||
"virtualization_type": "1",
|
||||
"hostname": "test-vz.cryto.net",
|
||||
"guaranteed_ram": "128",
|
||||
"burstable_ram": "256",
|
||||
"disk_space": "5000",
|
||||
"cpu_count": "1",
|
||||
"traffic_in_limit": "500000000000",
|
||||
"traffic_out_limit": "500000000000",
|
||||
"traffic_in_used": "912727849",
|
||||
"traffic_out_used": "16923948"
|
||||
}, {
|
||||
"id": "2",
|
||||
"node": "1",
|
||||
"virtualization_type": "1",
|
||||
"hostname": "test2.cryto.net",
|
||||
"guaranteed_ram": "512",
|
||||
"burstable_ram": "768",
|
||||
"disk_space": "40000",
|
||||
"cpu_count": "2",
|
||||
"traffic_in_limit": "500000000000",
|
||||
"traffic_out_limit": "500000000000",
|
||||
"traffic_in_used": "0",
|
||||
"traffic_out_used": "0"
|
||||
}]
|
||||
}
|
||||
}
|
||||
|
||||
^ GET /api/client/vps/**id**/status
|
||||
|
||||
This returns the current status and metrics for the specified VPS. The response will be a single object.
|
||||
|
||||
### Arguments
|
||||
|
||||
id::
|
||||
The ID of the VPS you wish to retrieve the status for.
|
||||
|
||||
### Keys in the response object
|
||||
|
||||
traffic_used::
|
||||
The total amount of traffic used, in __bytes__. **This may not be present, depending on the method of traffic measuring.**
|
||||
|
||||
traffic_in_used::
|
||||
The total amount of incoming traffic used, in __bytes__. **This may not be present, depending on the method of traffic measuring.**
|
||||
|
||||
traffic_out_used::
|
||||
The total amount of outgoing traffic used, in __bytes__. **This may not be present, depending on the method of traffic measuring.**
|
||||
|
||||
ram_used::
|
||||
The amount of RAM that is currently in use for the VPS, in __bytes__.
|
||||
|
||||
disk_used::
|
||||
The amount of disk space currently used by the VPS, in __bytes__.
|
||||
|
||||
status::
|
||||
The current status of the VPS.
|
||||
|
||||
running::
|
||||
The VPS is active and booted.
|
||||
|
||||
stopped::
|
||||
The VPS is active and shut down.
|
||||
|
||||
suspended::
|
||||
The VPS is suspended.
|
||||
|
||||
terminated::
|
||||
The VPS is terminated.
|
||||
|
||||
unknown::
|
||||
The status of the VPS is unknown. This can happen when, for example, the host node can't be reached.
|
||||
|
||||
^ POST /api/client/vps/**id**/start
|
||||
|
||||
Starts the specified VPS. Returns either a `200` status code with an empty response if successful, a `500` status code with an error message if the VPS fails to start, or
|
||||
a `503` status code with an error message if the host node is unreachable.
|
||||
|
||||
### Arguments
|
||||
|
||||
id::
|
||||
The ID of the VPS you wish to start.
|
||||
|
||||
^ POST /api/client/vps/**id**/stop
|
||||
|
||||
Shuts down the specified VPS. Returns either a `200` status code with an empty response if successful, a `500` status code with an error message if the VPS fails to shut down,
|
||||
or a `503` status code with an error message if the host node is unreachable.
|
||||
|
||||
### Arguments
|
||||
|
||||
id::
|
||||
The ID of the VPS you wish to stop.
|
||||
|
||||
^ POST /api/client/vps/**id**/restart
|
||||
|
||||
Restarts the specified VPS. Returns either a `200` status code with an empty response if successful, a `500` status code with an error message if the VPS fails to restart, or
|
||||
a `503` status code with an error message if the host node is unreachable.
|
||||
|
||||
### Arguments
|
||||
|
||||
id::
|
||||
The ID of the VPS you wish to restart.
|
@ -1,119 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
$_APP = true;
|
||||
require("includes/include.base.php");
|
||||
|
||||
$return_object = array();
|
||||
$return_success = false;
|
||||
|
||||
if(isset($_GET['key']) && $_GET['key'] == $settings['local_api_key'])
|
||||
{
|
||||
switch($_GET['action'])
|
||||
{
|
||||
case "verify_user":
|
||||
if($result = $database->CachedQuery("SELECT * FROM users WHERE `Username` = :Username", array(":Username" => $_GET['username'])))
|
||||
{
|
||||
$sUser = new User($result);
|
||||
|
||||
if($sUser->VerifyPassword($_GET['password']) === true)
|
||||
{
|
||||
$return_object = array(
|
||||
'correct' => true,
|
||||
'userid' => $sUser->sId
|
||||
);
|
||||
$return_success = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$return_object = array(
|
||||
'correct' => false,
|
||||
'userid' => 0
|
||||
);
|
||||
$return_success = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$return_object = array(
|
||||
'correct' => false,
|
||||
'userid' => 0
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case "list_vps":
|
||||
if(!empty($_GET['userid']))
|
||||
{
|
||||
$result = $database->CachedQuery("SELECT * FROM containers WHERE `UserId` = :UserId", array(":UserId" => $_GET['userid']));
|
||||
}
|
||||
else
|
||||
{
|
||||
$result = $database->CachedQuery("SELECT * FROM containers");
|
||||
}
|
||||
|
||||
if($result)
|
||||
{
|
||||
$sVpses = array();
|
||||
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sVps = new Vps($row);
|
||||
$sVpses[] = array(
|
||||
'hostname' => $sVps->sHostname,
|
||||
'internal_id' => $sVps->sInternalId,
|
||||
'node_id' => $sVps->sNodeId,
|
||||
'status' => $sVps->sStatus
|
||||
);
|
||||
}
|
||||
|
||||
$return_object = $sVpses;
|
||||
$return_success = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case "vps_info":
|
||||
// TODO: return VPS info
|
||||
break;
|
||||
|
||||
case "node_info":
|
||||
try
|
||||
{
|
||||
$sNode = new Node($_GET['nodeid']);
|
||||
$return_object = array(
|
||||
'name' => $sNode->sName,
|
||||
'hostname' => $sNode->sHostname,
|
||||
'port' => $sNode->sPort,
|
||||
'user' => $sNode->sUser,
|
||||
'physical_location' => $sNode->sPhysicalLocation,
|
||||
'private_key' => $sNode->sPrivateKey,
|
||||
'public_key' => $sNode->sPublicKey,
|
||||
'has_custom_key' => $sNode->sHasCustomKey
|
||||
);
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
// Silently pass.
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$return_object = "Authentication failure.";
|
||||
}
|
||||
|
||||
echo(json_encode(array(
|
||||
'status' => $return_success,
|
||||
'data' => $return_object
|
||||
)));
|
@ -1,34 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$router->uVariables['display_menu'] = true;
|
||||
|
||||
try
|
||||
{
|
||||
$sUser->RequireAccessLevel(20);
|
||||
|
||||
$sRouterAuthenticated = true;
|
||||
}
|
||||
catch (InsufficientAccessLevelException $e)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-unauthorized-title'],
|
||||
'message' => $locale->strings['error-unauthorized-text']
|
||||
));
|
||||
|
||||
$sRouterAuthenticated = false;
|
||||
|
||||
$router->uVariables['display_menu'] = false;
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$public_token = $_SERVER['HTTP_API_PUBLIC_TOKEN'];
|
||||
$private_token = $_SERVER['HTTP_API_PRIVATE_TOKEN'];
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM api_keys WHERE `PublicToken` = :Token", array(":Token" => $public_token)))
|
||||
{
|
||||
$sApiKey = new ApiKey($result);
|
||||
|
||||
if($sApiKey->VerifyToken($private_token))
|
||||
{
|
||||
if($sApiKey->sKeyType >= API_CLIENT)
|
||||
{
|
||||
$sRouterAuthenticated = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResponseCode = 403;
|
||||
$sResponse = array(
|
||||
"errors" => array(
|
||||
"The specified API token pair does not have access to this API."
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResponseCode = 401;
|
||||
$sResponse = array(
|
||||
"errors" => array(
|
||||
"No valid API token pair was specified."
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResponseCode = 401;
|
||||
$sResponse = array(
|
||||
"errors" => array(
|
||||
"No valid API token pair was specified."
|
||||
)
|
||||
);
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$router->uVariables['display_menu'] = true;
|
||||
|
||||
try
|
||||
{
|
||||
$sVps = new Vps($router->uParameters[1]);
|
||||
|
||||
if($sVps->sUserId != $sUser->sId && $sUser->sAccessLevel < 20)
|
||||
{
|
||||
throw new UnauthorizedException("You are not authorized to control this VPS.");
|
||||
}
|
||||
|
||||
$sRouterAuthenticated = true;
|
||||
|
||||
try
|
||||
{
|
||||
$sVps->CheckAllowed();
|
||||
}
|
||||
catch (VpsSuspendedException $e)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/warning", $locale->strings, array(
|
||||
'title' => $locale->strings['warning-suspended-title'],
|
||||
'message' => $locale->strings['warning-suspended-text']
|
||||
));
|
||||
}
|
||||
catch (VpsTerminatedException $e)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/warning", $locale->strings, array(
|
||||
'title' => $locale->strings['warning-terminated-title'],
|
||||
'message' => $locale->strings['warning-terminated-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
catch(NotFoundException $e)
|
||||
{
|
||||
$router->uVariables['display_menu'] = false;
|
||||
$sMainContents = NewTemplater::Render("{$sTheme}/client/vps/error/notfound", $locale->strings, array());
|
||||
$sRouterAuthenticated = false;
|
||||
}
|
||||
catch(UnauthorizedException $e)
|
||||
{
|
||||
$router->uVariables['display_menu'] = false;
|
||||
$sRouterAuthenticated = false;
|
||||
}
|
||||
|
@ -1,86 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
class ApiKey extends CPHPDatabaseRecordClass
|
||||
{
|
||||
public $table_name = "api_keys";
|
||||
public $fill_query = "SELECT * FROM api_keys WHERE `Id` = :Id";
|
||||
public $verify_query = "SELECT * FROM api_keys WHERE `Id` = :Id";
|
||||
|
||||
public $prototype = array(
|
||||
'string' => array(
|
||||
'PublicToken' => "PublicToken",
|
||||
'PrivateToken' => "PrivateToken",
|
||||
'Salt' => "Salt"
|
||||
),
|
||||
'numeric' => array(
|
||||
'UserId' => "UserId",
|
||||
'KeyType' => "KeyType"
|
||||
),
|
||||
'user' => array(
|
||||
'User' => "UserId"
|
||||
)
|
||||
);
|
||||
|
||||
public function GenerateSalt()
|
||||
{
|
||||
$this->uSalt = random_string(10);
|
||||
}
|
||||
|
||||
public function GenerateHash()
|
||||
{
|
||||
if(!empty($this->uSalt))
|
||||
{
|
||||
if(!empty($this->uToken))
|
||||
{
|
||||
$this->uPrivateToken = $this->CreateHash($this->uToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new MissingDataException("ApiKey object is missing a token.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new MissingDataException("ApiKey object is missing a salt.");
|
||||
}
|
||||
}
|
||||
|
||||
public function CreateHash($input)
|
||||
{
|
||||
global $settings;
|
||||
$hash = crypt($input, "$5\$rounds=50000\${$this->uSalt}{$settings['salt']}$");
|
||||
$parts = explode("$", $hash);
|
||||
return $parts[4];
|
||||
}
|
||||
|
||||
public function VerifyToken($token)
|
||||
{
|
||||
if($this->CreateHash($token) == $this->sPrivateToken)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function SetPrivateToken($token)
|
||||
{
|
||||
$this->uToken = $token;
|
||||
$this->GenerateHash();
|
||||
}
|
||||
}
|
@ -1,261 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
define("IP_TYPE_NONE", 0);
|
||||
define("IP_TYPE_IPV4", 4);
|
||||
define("IP_TYPE_IPV6", 6);
|
||||
define("INPUT_TYPE_IP", 1);
|
||||
define("INPUT_TYPE_RANGE", 2);
|
||||
define("SEGMENT_BITS_IPV4", 8);
|
||||
define("SEGMENT_BITS_IPV6", 16);
|
||||
|
||||
class IpRange
|
||||
{
|
||||
public $sCidrNotation = "";
|
||||
public $sType = 0;
|
||||
public $sInputType = 0;
|
||||
public $sInput = "";
|
||||
public $sStart = "";
|
||||
public $sEnd = "";
|
||||
public $sCount = "";
|
||||
|
||||
public function __construct($input)
|
||||
{
|
||||
$this->sInput = $input;
|
||||
|
||||
$slashcount = substr_count($input, "/");
|
||||
|
||||
if($slashcount == 1)
|
||||
{
|
||||
/* The input is probably a CIDR range. */
|
||||
$this->sInputType = INPUT_TYPE_RANGE;
|
||||
$this->ValidateRangeFormat();
|
||||
|
||||
}
|
||||
elseif($slashcount == 0)
|
||||
{
|
||||
/* The input is probably an IP. */
|
||||
$this->sInputType = INPUT_TYPE_IP;
|
||||
$this->ValidateIpFormat();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException("The given input is not a valid IP or IP range.");
|
||||
}
|
||||
|
||||
if($this->sInputType == INPUT_TYPE_RANGE)
|
||||
{
|
||||
if($this->sType == IP_TYPE_IPV6)
|
||||
{
|
||||
$this->ExpandIpv6();
|
||||
$result = IpRange::ParseRange($this->sIp, $this->sSize, ":", SEGMENT_BITS_IPV6, true);
|
||||
}
|
||||
elseif($this->sType == IP_TYPE_IPV4)
|
||||
{
|
||||
$result = IpRange::ParseRange($this->sIp, $this->sSize);
|
||||
}
|
||||
|
||||
$this->sStart = $result['start'];
|
||||
$this->sEnd = $result['end'];
|
||||
$this->sCount = $result['count'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->sStart = $this->sIp;
|
||||
$this->sEnd = $this->sIp;
|
||||
$this->sCount = 1;
|
||||
}
|
||||
}
|
||||
|
||||
private function ValidateRangeFormat()
|
||||
{
|
||||
list($ip, $size) = explode("/", $this->sInput, 2);
|
||||
|
||||
if($this->ValidateIpFormat($ip) === true)
|
||||
{
|
||||
if(is_numeric($size))
|
||||
{
|
||||
if($this->sType == IP_TYPE_IPV4 && (int)$size >= 0 && (int)$size <= 32)
|
||||
{
|
||||
$this->sSize = $size;
|
||||
return true;
|
||||
}
|
||||
elseif($this->sType == IP_TYPE_IPV6 && (int)$size >= 0 && (int)$size <= 128)
|
||||
{
|
||||
$this->sSize = $size;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Fallback case. */
|
||||
throw new InvalidArgumentException("The given input is not a valid IP or IP range.");
|
||||
}
|
||||
|
||||
private function ValidateIpFormat($ip = null)
|
||||
{
|
||||
if(is_null($ip))
|
||||
{
|
||||
$ip = $this->sInput;
|
||||
}
|
||||
|
||||
if(strpos($ip, ".") !== false)
|
||||
{
|
||||
// Probably an IPv4 address.
|
||||
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
|
||||
{
|
||||
$this->sType = IP_TYPE_IPV4;
|
||||
$this->sIp = $ip;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
elseif(strpos($ip, ":") !== false)
|
||||
{
|
||||
// Probably an IPv6 address.
|
||||
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6))
|
||||
{
|
||||
$this->sType = IP_TYPE_IPV6;
|
||||
$this->sIp = $ip;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fallback case. */
|
||||
throw new InvalidArgumentException("The given input is not a valid IP or IP range.");
|
||||
}
|
||||
|
||||
private function ExpandIpv6()
|
||||
{
|
||||
// Note: this function does NOT do any validation!
|
||||
$ip = $this->sIp;
|
||||
$parts = explode(":", $ip);
|
||||
$empty_part = false;
|
||||
$missing = 0;
|
||||
|
||||
foreach($parts as $part)
|
||||
{
|
||||
if($part == "")
|
||||
{
|
||||
$empty_part = true;
|
||||
$missing = 1;
|
||||
}
|
||||
}
|
||||
|
||||
$available_parts = count($parts) - $missing;
|
||||
|
||||
if($available_parts < 8 || $empty_part === true)
|
||||
{
|
||||
$needed = 8 - $available_parts;
|
||||
|
||||
$abbrev_position = strpos($ip, "::");
|
||||
|
||||
$left = substr($ip, 0, $abbrev_position);
|
||||
$right = substr($ip, $abbrev_position + 2);
|
||||
|
||||
$left_parts = explode(":", $left);
|
||||
$right_parts = explode(":", $right);
|
||||
$filler_parts = array_fill(0, $needed, "0000");
|
||||
|
||||
$final_array = array_merge($left_parts, $filler_parts);
|
||||
$final_array = array_merge($final_array, $right_parts);
|
||||
}
|
||||
else
|
||||
{
|
||||
$final_array = $parts;
|
||||
}
|
||||
|
||||
foreach($final_array as &$part)
|
||||
{
|
||||
$part = str_pad($part, 4, "0", STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
$this->sIp = implode(":", $final_array);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function ParseRange($start, $size, $delimiter = ".", $segment_bits = 8, $hex = false)
|
||||
{
|
||||
$segments = explode($delimiter, $start);
|
||||
|
||||
/* Determine the maximum size of one segment */
|
||||
$segment_size = pow(2, $segment_bits);
|
||||
|
||||
/* Calculate the amount of bits in the entire IP address */
|
||||
$ip_bits = count($segments) * $segment_bits;
|
||||
|
||||
/* Calculate the total amount of IPs possible for this IP format */
|
||||
$total_ips = pow(2, $ip_bits - $size);
|
||||
|
||||
if($hex === true)
|
||||
{
|
||||
$segments = array_map("hexdec", $segments);
|
||||
}
|
||||
|
||||
/* Calculate the maximum size (in IPs) of the currently used IP format */
|
||||
$max_size = count($segments) * $segment_bits;
|
||||
|
||||
/* Determine what segment we are going to modify */
|
||||
$applicable_segment = floor($size / $segment_bits) + 1;
|
||||
|
||||
/* Ensure that the specified size is possible */
|
||||
if($size > $max_size)
|
||||
{
|
||||
/* The size exceeds the total space for this type of IP */
|
||||
return false;
|
||||
}
|
||||
elseif($size == $max_size)
|
||||
{
|
||||
/* Only 1 IP. */
|
||||
$start_segments = $segments;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Determine the amount of IPs for the given size */
|
||||
$class_size = pow(2, ($applicable_segment * $segment_bits) - $size);
|
||||
|
||||
/* Round down the applicable segment if necessary to ensure the starting point is valid */
|
||||
$segments[$applicable_segment - 1] = floor($segments[$applicable_segment - 1] / $class_size) * $class_size;
|
||||
|
||||
$start_segments = $segments;
|
||||
|
||||
/* Add the amount of IPs (inclusive) to the applicable segment */
|
||||
$segments[$applicable_segment - 1] += $class_size - 1;
|
||||
|
||||
/* Set all segments to the right of the applicable segment to the right value. */
|
||||
if(count($segments) > $applicable_segment - 1)
|
||||
{
|
||||
for($i = $applicable_segment + 1; $i <= count($segments); $i++)
|
||||
{
|
||||
$segments[$i - 1] = $segment_size - 1;
|
||||
$start_segments[$i - 1] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($hex === true)
|
||||
{
|
||||
$segments = array_map("dechex", $segments);
|
||||
$start_segments = array_map("dechex", $start_segments);
|
||||
}
|
||||
|
||||
return array(
|
||||
'start' => implode($delimiter, $start_segments),
|
||||
'end' => implode($delimiter, $segments),
|
||||
'count' => $total_ips
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -1,133 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
class Node extends CPHPDatabaseRecordClass
|
||||
{
|
||||
public $table_name = "nodes";
|
||||
public $fill_query = "SELECT * FROM nodes WHERE `Id` = :Id";
|
||||
public $verify_query = "SELECT * FROM nodes WHERE `Id` = :Id";
|
||||
|
||||
public $prototype = array(
|
||||
'string' => array(
|
||||
'Name' => "Name",
|
||||
'Hostname' => "Hostname",
|
||||
'PhysicalLocation' => "PhysicalLocation",
|
||||
'PrivateKey' => "CustomPrivateKey",
|
||||
'PublicKey' => "CustomPublicKey",
|
||||
'User' => "User",
|
||||
'TunnelKey' => "TunnelKey"
|
||||
),
|
||||
'numeric' => array(
|
||||
'Port' => "Port",
|
||||
'TunnelPort' => "TunnelPort"
|
||||
),
|
||||
'boolean' => array(
|
||||
'HasCustomKey' => "HasCustomKey"
|
||||
)
|
||||
);
|
||||
|
||||
public $ssh = null;
|
||||
|
||||
protected function EventConstructed()
|
||||
{
|
||||
global $settings;
|
||||
|
||||
$this->ssh = new SshConnector();
|
||||
|
||||
$this->ssh->host = $this->sHostname;
|
||||
$this->ssh->port = $this->sPort;
|
||||
$this->ssh->user = $this->sUser;
|
||||
$this->ssh->tunnel_port = $this->sTunnelPort;
|
||||
$this->ssh->tunnel_key = $this->sTunnelKey;
|
||||
$this->ssh->node = $this;
|
||||
|
||||
if($this->HasCustomKey === true)
|
||||
{
|
||||
$this->ssh->key = $this->sPrivateKey;
|
||||
$this->ssh->pubkey = $this->sPublicKey;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->ssh->key = $settings['master_privkey'];
|
||||
$this->ssh->pubkey = $settings['master_pubkey'];
|
||||
}
|
||||
}
|
||||
|
||||
public function __get($name)
|
||||
{
|
||||
switch($name)
|
||||
{
|
||||
case "sRealHostname":
|
||||
return $this->GetHostname();
|
||||
break;
|
||||
case "sDiskFree":
|
||||
return $this->GetDiskFree();
|
||||
break;
|
||||
case "sDiskUsed":
|
||||
return $this->GetDiskUsed();
|
||||
break;
|
||||
default:
|
||||
return parent::__get($name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public function GetHostname()
|
||||
{
|
||||
return $this->ssh->RunCommandCached("hostname", true)->stdout;
|
||||
}
|
||||
|
||||
public function GetDiskFree()
|
||||
{
|
||||
$disk = $this->GetDisk();
|
||||
return $disk['free'];
|
||||
}
|
||||
|
||||
public function GetDiskUsed()
|
||||
{
|
||||
$disk = $this->GetDisk();
|
||||
return $disk['used'];
|
||||
}
|
||||
|
||||
public function GetDisk()
|
||||
{
|
||||
$result = $this->ssh->RunCommandCached("df -l -x tmpfs", true);
|
||||
$lines = explode("\n", $result->stdout);
|
||||
array_shift($lines);
|
||||
|
||||
$total_free = 0;
|
||||
$total_used = 0;
|
||||
$total_total = 0;
|
||||
|
||||
foreach($lines as $disk)
|
||||
{
|
||||
$disk = trim($disk);
|
||||
|
||||
if(!empty($disk))
|
||||
{
|
||||
$values = split_whitespace($disk);
|
||||
$total_free += (int)$values[3] / 1024;
|
||||
$total_used += (int)$values[2] / 1024;
|
||||
$total_total += ((int)$values[2] + (int)$values[3]) / 1024;
|
||||
}
|
||||
}
|
||||
|
||||
return array(
|
||||
'free' => $total_free,
|
||||
'used' => $total_used,
|
||||
'total' => $total_total
|
||||
);
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
class Setting extends CPHPDatabaseRecordClass
|
||||
{
|
||||
public $table_name = "settings";
|
||||
public $fill_query = "SELECT * FROM settings WHERE `Id` = :Id";
|
||||
public $verify_query = "SELECT * FROM settings WHERE `Id` = :Id";
|
||||
|
||||
public $prototype = array(
|
||||
'string' => array(
|
||||
"Key" => "Key",
|
||||
"Value" => "Value"
|
||||
),
|
||||
'timestamp' => array(
|
||||
"LastChanged" => "LastChanged"
|
||||
)
|
||||
);
|
||||
|
||||
public static function ByKey($key, $cache_duration = 60)
|
||||
{
|
||||
return Setting::CreateFromQuery("SELECT * FROM settings WHERE `Key` = :Key", array(":Key" => $key), $cache_duration, true);
|
||||
}
|
||||
|
||||
public function ChangeValue($value)
|
||||
{
|
||||
$this->uValue = $value;
|
||||
$this->uLastChanged = time();
|
||||
$this->InsertIntoDatabase();
|
||||
}
|
||||
}
|
@ -1,345 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
class SshConnector extends CPHPBaseClass
|
||||
{
|
||||
public $connected = false;
|
||||
public $authenticated = false;
|
||||
public $connection = null;
|
||||
public $failed = false;
|
||||
|
||||
public $host = "localhost";
|
||||
public $port = 22;
|
||||
public $user = "root";
|
||||
public $key = "";
|
||||
public $pubkey = "";
|
||||
public $keytype = "ssh-rsa";
|
||||
|
||||
public $helper = "~/runhelper";
|
||||
|
||||
private $cache = "";
|
||||
|
||||
public function RunCommand($command, $throw_exception = false)
|
||||
{
|
||||
try
|
||||
{
|
||||
return $this->DoCommand($command, $throw_exception);
|
||||
}
|
||||
catch (SshConnectException $e)
|
||||
{
|
||||
$error = $e->getMessage();
|
||||
$command = implode(" ", $command);
|
||||
$this->failed = true;
|
||||
throw new SshConnectException("Could not run command {$command}: Failed to connect: {$error}");
|
||||
}
|
||||
catch (SshAuthException $e)
|
||||
{
|
||||
$error = $e->getMessage();
|
||||
$command = implode(" ", $command);
|
||||
$this->failed = true;
|
||||
throw new SshConnectException("Could not run command {$command}: Failed to authenticate: {$error}");
|
||||
}
|
||||
}
|
||||
|
||||
public function RunCommandCached($command, $throw_exception = false)
|
||||
{
|
||||
if(!isset($this->cache[serialize($command)]))
|
||||
{
|
||||
$result = $this->RunCommand($command, $throw_exception);
|
||||
$this->cache[serialize($command)] = $result;
|
||||
return $result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this->cache[serialize($command)];
|
||||
}
|
||||
}
|
||||
|
||||
public function Connect()
|
||||
{
|
||||
/* TODO: TIME_WAIT status for a previous socket on the same port may cause issues
|
||||
* when attempting to restart the command daemon. There is currently no way
|
||||
* to detect this from the code, and it makes all subsequent requests fail
|
||||
* (silently?) because the tunnel is available but nothing is listening on
|
||||
* the other end. This kind of edge case should be detected and dealt with.
|
||||
* A browser displays a 'no data received' error in this case. */
|
||||
if($this->failed)
|
||||
{
|
||||
throw new SshConnectException("A previous connection attempt failed.");
|
||||
}
|
||||
|
||||
$sHost = escapeshellarg($this->host);
|
||||
$sUser = escapeshellarg($this->user);
|
||||
$sPort = $this->tunnel_port = $this->node->uTunnelPort = $this->ChoosePort();
|
||||
$sKeyFile = escapeshellarg($this->key);
|
||||
$this->node->uTunnelKey = $this->tunnel_key = random_string(16);
|
||||
$sSessionKey = escapeshellarg($this->node->uTunnelKey);
|
||||
|
||||
$command = "python /etc/cvm/start_tunnel.py {$sHost} {$sUser} {$sPort} {$sKeyFile} {$sSessionKey}";
|
||||
|
||||
cphp_debug_snapshot(array(
|
||||
"action" => "start tunnel",
|
||||
"db-tunnelkey" => $this->node->sTunnelKey,
|
||||
"db-utunnelkey" => $this->node->uTunnelKey,
|
||||
"ssh-tunnelkey" => $this->tunnel_key,
|
||||
"arg-tunnelkey" => $sSessionKey
|
||||
));
|
||||
|
||||
exec($command, $output, $returncode);
|
||||
|
||||
if($returncode === 0)
|
||||
{
|
||||
/* autossh returns before the SSH connection has actually been established. We'll make the
|
||||
* script sleep until a connection has been established, with a timeout of 10 seconds, after
|
||||
* which an exception is raised. The polling interval is 100ms. */
|
||||
|
||||
$start_time = time();
|
||||
|
||||
while(true)
|
||||
{
|
||||
if(time() > $start_time + 10)
|
||||
{
|
||||
throw new SshConnectException("The SSH tunnel could not be fully established within the timeout period.");
|
||||
}
|
||||
|
||||
if($pollsock = @fsockopen("localhost", $this->tunnel_port, $errno, $errstr, 1))
|
||||
{
|
||||
/* The tunnel has been fully established. */
|
||||
|
||||
fclose($pollsock);
|
||||
break;
|
||||
}
|
||||
|
||||
usleep(100000);
|
||||
}
|
||||
|
||||
cphp_debug_snapshot(array(
|
||||
"action" => "pre insert db",
|
||||
"db-tunnelkey" => $this->node->sTunnelKey,
|
||||
"db-utunnelkey" => $this->node->uTunnelKey,
|
||||
"ssh-tunnelkey" => $this->tunnel_key,
|
||||
"arg-tunnelkey" => $sSessionKey
|
||||
));
|
||||
|
||||
$this->node->InsertIntoDatabase();
|
||||
|
||||
cphp_debug_snapshot(array(
|
||||
"action" => "inserted db",
|
||||
"db-tunnelkey" => $this->node->sTunnelKey,
|
||||
"db-utunnelkey" => $this->node->uTunnelKey,
|
||||
"ssh-tunnelkey" => $this->tunnel_key,
|
||||
"arg-tunnelkey" => $sSessionKey
|
||||
));
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new SshConnectException("Could not establish tunnel to {$this->host}:{$this->port}.");
|
||||
}
|
||||
}
|
||||
|
||||
private function ChoosePort()
|
||||
{
|
||||
try
|
||||
{
|
||||
$sPorts = array();
|
||||
|
||||
foreach(Node::CreateFromQuery("SELECT * FROM nodes WHERE `TunnelPort` != 0") as $node)
|
||||
{
|
||||
$sPorts[] = $node->sTunnelPort;
|
||||
$sPorts[] = $node->sTunnelPort + 1;
|
||||
$sPorts[] = $node->sTunnelPort + 2;
|
||||
}
|
||||
|
||||
/* TODO: Figure out a more intelligent way of choosing ports. */
|
||||
$start = max($sPorts) + 1;
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
$start = 2000;
|
||||
}
|
||||
|
||||
$current = $start;
|
||||
|
||||
while(true)
|
||||
{
|
||||
if($current > 65534)
|
||||
{
|
||||
/* TODO: We really need to deal with this properly... */
|
||||
throw new SshConnectException("No free tunnel ports left.");
|
||||
}
|
||||
|
||||
if(!$this->TestPort($current))
|
||||
{
|
||||
if(!$this->TestPort($current + 1))
|
||||
{
|
||||
if(!$this->TestPort($current + 2))
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
$current = $current + 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$current = $current + 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$current = $current + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $current;
|
||||
}
|
||||
|
||||
private function TestPort($port)
|
||||
{
|
||||
if($testsock = @fsockopen("localhost", $port, $errno, $errstr, 1))
|
||||
{
|
||||
fclose($testsock);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private function DoCommand($command, $throw_exception, $allow_retry = true)
|
||||
{
|
||||
cphp_debug_snapshot(array(
|
||||
"action" => "pre run command",
|
||||
"db-tunnelkey" => $this->node->sTunnelKey,
|
||||
"db-utunnelkey" => $this->node->uTunnelKey,
|
||||
"ssh-tunnelkey" => $this->tunnel_key,
|
||||
"command" => $command,
|
||||
"allow-retry" => $allow_retry
|
||||
));
|
||||
|
||||
$cmd = urlencode(json_encode($command));
|
||||
$url = "http://localhost:{$this->tunnel_port}/?key={$this->tunnel_key}&command={$cmd}";
|
||||
|
||||
/* Setting a HTTP timeout is going to break long-running requests.
|
||||
* What the hell was I thinking?!
|
||||
$context = stream_context_create(array(
|
||||
'http' => array(
|
||||
'timeout' => 2.0
|
||||
)
|
||||
));*/
|
||||
|
||||
$response = @file($url, 0, $context);
|
||||
|
||||
cphp_debug_snapshot(array(
|
||||
"action" => "post run command",
|
||||
"db-tunnelkey" => $this->node->sTunnelKey,
|
||||
"db-utunnelkey" => $this->node->uTunnelKey,
|
||||
"ssh-tunnelkey" => $this->tunnel_key,
|
||||
"command" => $command,
|
||||
"allow-retry" => $allow_retry,
|
||||
"response" => $response
|
||||
));
|
||||
|
||||
if($response === false)
|
||||
{
|
||||
/* Determine why the connection failed, and what we need to do to fix it. */
|
||||
if($testsock = @fsockopen("localhost", $this->tunnel_port, $errno, $errstr, 1))
|
||||
{
|
||||
/* The socket works fine. */
|
||||
fclose($testsock);
|
||||
|
||||
/* Since the socket works but we can't make a request, there is most
|
||||
* likely a serious problem with the command daemon (stuck, crashed,
|
||||
* etc.) We'll throw an exception. TODO: Log error. */
|
||||
$this->failed = true;
|
||||
throw new SshCommandException("The command daemon is unavailable.");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The tunnel is gone for some reason. Either the connection broke
|
||||
* and autossh is busy reconnecting, or autossh broke entirely. We
|
||||
* will attempt to connect to the monitoring port to see if autossh
|
||||
* is still running or not. */
|
||||
if($testsock = @fsockopen("localhost", ($this->tunnel_port + 2), $errno, $errstr, 1))
|
||||
{
|
||||
/* The socket works fine. */
|
||||
fclose($testsock);
|
||||
|
||||
/* Most likely autossh is very busy trying to reconnect to the node. We'll throw a
|
||||
* connection exception for now. TODO: Consider waiting with a specified timeout. */
|
||||
$this->failed = true;
|
||||
throw new SshConnectException("The SSH connection to this node is currently unavailable.");
|
||||
}
|
||||
else
|
||||
{
|
||||
if($allow_retry)
|
||||
{
|
||||
$this->Connect();
|
||||
$res = $this->DoCommand($command, $throw_exception, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->failed = true;
|
||||
throw new SshConnectException("Could not connect to node.");
|
||||
/* TODO: Log error, this is probably very bad. */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$response = json_decode(implode("", $response));
|
||||
|
||||
$json_error = json_last_error();
|
||||
|
||||
if($json_error !== JSON_ERROR_NONE)
|
||||
{
|
||||
switch($json_last_error)
|
||||
{
|
||||
case JSON_ERROR_DEPTH:
|
||||
$err_msg = "Maximum stack depth exceeded.";
|
||||
break;
|
||||
case JSON_ERROR_STATE_MISMATCH:
|
||||
$err_msg = "Underflow or modes mismatch.";
|
||||
break;
|
||||
case JSON_ERROR_CTRL_CHAR:
|
||||
$err_msg = "Unexpected control character found.";
|
||||
break;
|
||||
case JSON_ERROR_SYNTAX:
|
||||
$err_msg = "Syntax error, malformed JSON.";
|
||||
break;
|
||||
case JSON_ERROR_UTF8:
|
||||
$err_msg = "Malformed UTF-8 characters, possibly incorrectly encoded.";
|
||||
break;
|
||||
default:
|
||||
$err_msg = "Unknown error {$json_error}.";
|
||||
}
|
||||
|
||||
throw new SshCommandException("An error occurred while decoding the response from the slave: {$err_msg}");
|
||||
}
|
||||
}
|
||||
|
||||
if($response->returncode != 0 && $throw_exception === true)
|
||||
{
|
||||
throw new SshExitException("Non-zero exit code returned: {$response->stderr}", $response->returncode);
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
class Template extends CPHPDatabaseRecordClass
|
||||
{
|
||||
public $table_name = "templates";
|
||||
public $fill_query = "SELECT * FROM templates WHERE `Id` = :Id";
|
||||
public $verify_query = "SELECT * FROM templates WHERE `Id` = :Id";
|
||||
|
||||
public $prototype = array(
|
||||
'string' => array(
|
||||
'Name' => "Name",
|
||||
'TemplateName' => "TemplateName",
|
||||
'Description' => "Description"
|
||||
),
|
||||
'boolean' => array(
|
||||
'IsSupported' => "Supported",
|
||||
'IsAvailable' => "Available",
|
||||
'IsOutdated' => "Outdated"
|
||||
)
|
||||
);
|
||||
|
||||
function CheckAvailable()
|
||||
{
|
||||
if($this->sIsAvailable === true)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new TemplateUnavailableException("This template is not available.");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,122 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
class User extends CPHPDatabaseRecordClass
|
||||
{
|
||||
public $table_name = "users";
|
||||
public $fill_query = "SELECT * FROM users WHERE `Id` = :Id";
|
||||
public $verify_query = "SELECT * FROM users WHERE `Id` = :Id";
|
||||
|
||||
public $prototype = array(
|
||||
'string' => array(
|
||||
'Username' => "Username",
|
||||
'EmailAddress' => "EmailAddress",
|
||||
'Hash' => "Hash",
|
||||
'Salt' => "Salt"
|
||||
),
|
||||
'numeric' => array(
|
||||
'AccessLevel' => "AccessLevel"
|
||||
)
|
||||
);
|
||||
|
||||
public $prototype_export = array(
|
||||
'Username',
|
||||
'EmailAddress',
|
||||
'AccessLevel'
|
||||
);
|
||||
|
||||
public function __get($name)
|
||||
{
|
||||
switch($name)
|
||||
{
|
||||
case "sVpsCount":
|
||||
return $this->GetVpsCount();
|
||||
break;
|
||||
default:
|
||||
return parent::__get($name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public function GetVpsCount()
|
||||
{
|
||||
global $database;
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM containers WHERE `UserId` = :UserId", array(":UserId" => $this->sId)))
|
||||
{
|
||||
return count($result->data);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public function GenerateSalt()
|
||||
{
|
||||
$this->uSalt = random_string(10);
|
||||
}
|
||||
|
||||
public function GenerateHash()
|
||||
{
|
||||
if(!empty($this->uSalt))
|
||||
{
|
||||
if(!empty($this->uPassword))
|
||||
{
|
||||
$this->uHash = $this->CreateHash($this->uPassword);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new MissingDataException("User object is missing a password.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new MissingDataException("User object is missing a salt.");
|
||||
}
|
||||
}
|
||||
|
||||
public function CreateHash($input)
|
||||
{
|
||||
global $settings;
|
||||
$hash = crypt($input, "$5\$rounds=50000\${$this->uSalt}{$settings['salt']}$");
|
||||
$parts = explode("$", $hash);
|
||||
return $parts[4];
|
||||
}
|
||||
|
||||
public function VerifyPassword($password)
|
||||
{
|
||||
if($this->CreateHash($password) == $this->sHash)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function RequireAccessLevel($level)
|
||||
{
|
||||
if($this->sAccessLevel < $level)
|
||||
{
|
||||
throw new InsufficientAccessLevelException("You do not have the required access level to perform this action.");
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,729 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
class Vps extends CPHPDatabaseRecordClass
|
||||
{
|
||||
public $table_name = "containers";
|
||||
public $fill_query = "SELECT * FROM containers WHERE `Id` = :Id";
|
||||
public $verify_query = "SELECT * FROM containers WHERE `Id` = :Id";
|
||||
|
||||
public $prototype = array(
|
||||
'string' => array(
|
||||
'Hostname' => "Hostname",
|
||||
'InternalId' => "InternalId",
|
||||
'RootPassword' => "RootPassword"
|
||||
),
|
||||
'numeric' => array(
|
||||
'NodeId' => "NodeId",
|
||||
'TemplateId' => "TemplateId",
|
||||
'UserId' => "UserId",
|
||||
'VirtualizationType' => "VirtualizationType",
|
||||
'DiskSpace' => "DiskSpace",
|
||||
'GuaranteedRam' => "GuaranteedRam",
|
||||
'BurstableRam' => "BurstableRam",
|
||||
'CpuCount' => "CpuCount",
|
||||
'Status' => "Status",
|
||||
'IncomingTrafficUsed' => "IncomingTrafficUsed",
|
||||
'IncomingTrafficLast' => "IncomingTrafficLast",
|
||||
'OutgoingTrafficUsed' => "OutgoingTrafficUsed",
|
||||
'OutgoingTrafficLast' => "OutgoingTrafficLast",
|
||||
'IncomingTrafficLimit' => "IncomingTrafficLimit",
|
||||
'OutgoingTrafficLimit' => "OutgoingTrafficLimit",
|
||||
'TotalTrafficLimit' => "TotalTrafficLimit"
|
||||
),
|
||||
'timestamp' => array(
|
||||
"TerminationDate" => "TerminationDate"
|
||||
),
|
||||
'boolean' => array(
|
||||
"IsTerminated" => "Terminated"
|
||||
),
|
||||
'node' => array(
|
||||
'Node' => "NodeId"
|
||||
),
|
||||
'template' => array(
|
||||
'Template' => "TemplateId"
|
||||
),
|
||||
'user' => array(
|
||||
'User' => "UserId"
|
||||
)
|
||||
);
|
||||
|
||||
public function __get($name)
|
||||
{
|
||||
switch($name)
|
||||
{
|
||||
case "sRamUsed":
|
||||
return $this->GetRamUsed();
|
||||
break;
|
||||
case "sRamTotal":
|
||||
return $this->GetRamTotal();
|
||||
break;
|
||||
case "sDiskUsed":
|
||||
return $this->GetDiskUsed();
|
||||
break;
|
||||
case "sDiskTotal":
|
||||
return $this->GetDiskTotal();
|
||||
break;
|
||||
case "sBandwidthUsed":
|
||||
return $this->GetBandwidthUsed();
|
||||
break;
|
||||
case "sCurrentStatus":
|
||||
return (int)$this->GetCurrentStatus();
|
||||
break;
|
||||
case "sStatusText":
|
||||
return $this->GetStatusText();
|
||||
break;
|
||||
default:
|
||||
return parent::__get($name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public function GetBandwidthUsed()
|
||||
{
|
||||
return ($this->sOutgoingTrafficUsed + $this->IncomingTrafficUsed) / (1024 * 1024);
|
||||
}
|
||||
|
||||
public function GetCurrentStatus()
|
||||
{
|
||||
if($this->sStatus == CVM_STATUS_SUSPENDED || $this->sStatus == CVM_STATUS_TERMINATED)
|
||||
{
|
||||
return $this->sStatus;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
$command = array("sudo", "vzctl", "status", $this->sInternalId);
|
||||
|
||||
$result = $this->sNode->ssh->RunCommandCached($command, false);
|
||||
|
||||
if($result->returncode == 0)
|
||||
{
|
||||
$values = split_whitespace($result->stdout);
|
||||
|
||||
if($values[4] == "running")
|
||||
{
|
||||
return CVM_STATUS_STARTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
return CVM_STATUS_STOPPED;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (SshCommandException $e)
|
||||
{
|
||||
return CVM_STATUS_STOPPED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function GetStatusText()
|
||||
{
|
||||
/* TODO: Add several more options:
|
||||
* - unknown
|
||||
* - deleted / non-existent
|
||||
* - terminated
|
||||
*/
|
||||
|
||||
$status = $this->sCurrentStatus;
|
||||
|
||||
if($status == CVM_STATUS_STARTED)
|
||||
{
|
||||
return "running";
|
||||
}
|
||||
elseif($status == CVM_STATUS_STOPPED)
|
||||
{
|
||||
return "stopped";
|
||||
}
|
||||
elseif($status == CVM_STATUS_SUSPENDED)
|
||||
{
|
||||
return "suspended";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
|
||||
public function GetRamUsed()
|
||||
{
|
||||
$ram = $this->GetRam();
|
||||
return $ram['used'];
|
||||
}
|
||||
|
||||
public function GetRamTotal()
|
||||
{
|
||||
$ram = $this->GetRam();
|
||||
return $ram['total'];
|
||||
}
|
||||
|
||||
public function GetRam()
|
||||
{
|
||||
try
|
||||
{
|
||||
$result = $this->RunCommandCached("free -m", true);
|
||||
$lines = explode("\n", $result->stdout);
|
||||
array_shift($lines);
|
||||
|
||||
$total_free = 0;
|
||||
$total_used = 0;
|
||||
$total_total = 0;
|
||||
|
||||
foreach($lines as $line)
|
||||
{
|
||||
$line = trim($line);
|
||||
$values = split_whitespace($line);
|
||||
|
||||
if(trim($values[0]) == "Mem:")
|
||||
{
|
||||
$total_total = $values[1];
|
||||
$total_used = $values[2];
|
||||
$total_free = $values[3];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (SshCommandException $e)
|
||||
{
|
||||
$total_free = 0;
|
||||
$total_used = 0;
|
||||
$total_total = 0;
|
||||
}
|
||||
|
||||
return array(
|
||||
'free' => $total_free,
|
||||
'used' => $total_used,
|
||||
'total' => $total_total
|
||||
);
|
||||
}
|
||||
|
||||
public function GetDiskUsed()
|
||||
{
|
||||
$disk = $this->GetDisk();
|
||||
return $disk['used'];
|
||||
}
|
||||
|
||||
public function GetDiskTotal()
|
||||
{
|
||||
$disk = $this->GetDisk();
|
||||
return $disk['total'];
|
||||
}
|
||||
|
||||
public function GetDisk()
|
||||
{
|
||||
try
|
||||
{
|
||||
$result = $this->RunCommandCached("df -l -x tmpfs", true);
|
||||
$lines = explode("\n", $result->stdout);
|
||||
array_shift($lines);
|
||||
|
||||
$total_free = 0;
|
||||
$total_used = 0;
|
||||
$total_total = 0;
|
||||
|
||||
foreach($lines as $disk)
|
||||
{
|
||||
$disk = trim($disk);
|
||||
|
||||
if(!empty($disk))
|
||||
{
|
||||
$values = split_whitespace($disk);
|
||||
$total_free += (int)$values[3] / 1024;
|
||||
$total_used += (int)$values[2] / 1024;
|
||||
$total_total += ((int)$values[2] + (int)$values[3]) / 1024;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (SshCommandException $e)
|
||||
{
|
||||
$total_free = 0;
|
||||
$total_used = 0;
|
||||
$total_total = 0;
|
||||
}
|
||||
|
||||
return array(
|
||||
'free' => $total_free,
|
||||
'used' => $total_used,
|
||||
'total' => $total_total
|
||||
);
|
||||
}
|
||||
|
||||
public function CheckAllowed()
|
||||
{
|
||||
if($this->sStatus == CVM_STATUS_SUSPENDED)
|
||||
{
|
||||
throw new VpsSuspendedException("No operations can be performed on this VPS beacuse it is suspended.", 1, $this->sInternalId);
|
||||
}
|
||||
elseif($this->sStatus == CVM_STATUS_TERMINATED)
|
||||
{
|
||||
throw new VpsTerminatedException("No operations can be performed on this VPS beacuse it is terminated.", 1, $this->sInternalId);
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public function SetOptions($options)
|
||||
{
|
||||
if(is_array($options))
|
||||
{
|
||||
$command_elements = array("sudo", "vzctl", "set", $this->sInternalId);
|
||||
|
||||
foreach($options as $key => $value)
|
||||
{
|
||||
$command_elements[] = "--{$key}";
|
||||
$command_elements[] = $value;
|
||||
}
|
||||
|
||||
$command_elements[] = "--save";
|
||||
|
||||
$this->sNode->ssh->RunCommand($command_elements, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidArgumentException("The option argument to Vps::SetOptions should be an array.");
|
||||
}
|
||||
}
|
||||
|
||||
public function RunCommand($command, $throw_exception = false)
|
||||
{
|
||||
return $this->sNode->ssh->RunCommand(array("sudo", "vzctl", "exec", $this->sInternalId, $command), $throw_exception);
|
||||
}
|
||||
|
||||
public function RunCommandCached($command, $throw_exception = false)
|
||||
{
|
||||
return $this->sNode->ssh->RunCommandCached(array("sudo", "vzctl", "exec", $this->sInternalId, $command), $throw_exception);
|
||||
}
|
||||
|
||||
public function Deploy($conf = array())
|
||||
{
|
||||
$sRootPassword = random_string(20);
|
||||
|
||||
$this->uRootPassword = $sRootPassword;
|
||||
$this->InsertIntoDatabase();
|
||||
|
||||
$command = array("sudo", "vzctl", "create", $this->sInternalId, "--ostemplate", $this->sTemplate->sTemplateName);
|
||||
|
||||
$result = $this->sNode->ssh->RunCommand($command, false);
|
||||
|
||||
if($result->returncode == 0 && strpos($result->stderr, "ERROR") === false)
|
||||
{
|
||||
$this->uStatus = CVM_STATUS_CREATED;
|
||||
$this->InsertIntoDatabase();
|
||||
|
||||
$dummy_processes = 1000;
|
||||
$dummy_files = $this->sGuaranteedRam * 32;
|
||||
$dummy_sockets = $this->sGuaranteedRam * 3;
|
||||
|
||||
$sKMemSize = (isset($conf['sKMemSize'])) ? $conf['sKMemSize'] : (40 * 1024 * ($dummy_processes / 2)) + ($dummy_files * 384 * 100);
|
||||
$sKMemSizeLimit = (isset($conf['sKMemSizeLimit'])) ? $conf['sKMemSizeLimit'] : (int)($sKMemSize * 1.1);
|
||||
$sLockedPages = (isset($conf['sLockedPages'])) ? $conf['sLockedPages'] : $dummy_processes;
|
||||
$sShmPages = (isset($conf['sShmPages'])) ? $conf['sShmPages'] : $this->sGuaranteedRam . "M";
|
||||
$sOomGuarPages = (isset($conf['sOomGuarPages'])) ? $conf['sOomGuarPages'] : $this->sGuaranteedRam . "M";
|
||||
$sTcpSock = (isset($conf['sTcpSock'])) ? $conf['sTcpSock'] : $dummy_sockets;
|
||||
$sOtherSock = (isset($conf['sOtherSock'])) ? $conf['sOtherSock'] : $dummy_sockets;
|
||||
$sFLock = (isset($conf['sFLock'])) ? $conf['sFLock'] : $dummy_processes;
|
||||
$sFLockLimit = (isset($conf['sFLockLimit'])) ? $conf['sFLockLimit'] : (int)($sFLock * 1.1);
|
||||
$sTcpSndBuf = (isset($conf['sTcpSndBuf'])) ? $conf['sTcpSndBuf'] : round($this->sGuaranteedRam * 1024 / 5) . "K";
|
||||
$sTcpRcvBuf = (isset($conf['sTcpRcvBuf'])) ? $conf['sTcpRcvBuf'] : round($this->sGuaranteedRam * 1024 / 5) . "K";
|
||||
$sOtherBuf = (isset($conf['sOtherBuf'])) ? $conf['sOtherBuf'] : round($this->sGuaranteedRam * 1024 / 5) . "K";
|
||||
$sOtherBufLimit = (isset($conf['sOtherBufLimit'])) ? $conf['sOtherBufLimit'] : (int)($sOtherBuf + (2 * $dummy_processes * 16));
|
||||
$sTcpSndBufLimit = (isset($conf['sTcpSndBufLimit'])) ? $conf['sTcpSndBufLimit'] : (int)($sTcpSndBuf + (2 * $dummy_processes * 16));
|
||||
$sTcpRcvBufLimit = (isset($conf['sTcpRcvBufLimit'])) ? $conf['sTcpRcvBufLimit'] : (int)($sTcpRcvBuf + (2 * $dummy_processes * 16));
|
||||
$sDgramBuf = (isset($conf['sDgramBuf'])) ? $conf['sDgramBuf'] : round($this->sGuaranteedRam * 1024 / 5) . "K";
|
||||
$sNumFile = (isset($conf['sNumFile'])) ? $conf['sNumFile'] : $dummy_files;
|
||||
$sNumProc = (isset($conf['sNumProc'])) ? $conf['sNumProc'] : $dummy_processes;
|
||||
$sDCache = (isset($conf['sDCache'])) ? $conf['sDCache'] : $dummy_files * 384;
|
||||
$sDCacheLimit = (isset($conf['sDCacheLimit'])) ? $conf['sDCacheLimit'] : (int)($sDCache * 1.1);
|
||||
$sAvgProc = (isset($conf['sAvgProc'])) ? $conf['sAvgProc'] : $dummy_processes / 2;
|
||||
|
||||
$command = array("sudo", "vzctl", "set", $this->sInternalId,
|
||||
"--onboot", "yes",
|
||||
"--setmode", "restart",
|
||||
"--hostname", $this->sHostname,
|
||||
"--nameserver", "8.8.8.8",
|
||||
"--nameserver", "8.8.4.4",
|
||||
"--numproc", $this->sCpuCount,
|
||||
"--vmguarpages", "{$this->sGuaranteedRam}M:unlimited",
|
||||
"--privvmpages", "{$this->sBurstableRam}M:{$this->sBurstableRam}M",
|
||||
"--quotatime", "0",
|
||||
"--diskspace", "{$this->sDiskSpace}M:{$this->sDiskSpace}M",
|
||||
"--userpasswd", "root:{$sRootPassword}",
|
||||
"--kmemsize", "{$sKMemSize}:{$sKMemSizeLimit}",
|
||||
"--lockedpages", "{$sLockedPages}:{$sLockedPages}",
|
||||
"--shmpages", "{$sShmPages}:{$sShmPages}",
|
||||
"--physpages", "0:unlimited",
|
||||
"--oomguarpages", "{$sOomGuarPages}:unlimited",
|
||||
"--numtcpsock", "{$sTcpSock}:{$sTcpSock}",
|
||||
"--numflock", "{$sFLock}:{$sFLockLimit}",
|
||||
"--numpty", "32:32",
|
||||
"--numsiginfo", "512:512",
|
||||
"--tcpsndbuf", "{$sTcpSndBuf}:{$sTcpSndBufLimit}",
|
||||
"--tcprcvbuf", "{$sTcpRcvBuf}:{$sTcpRcvBufLimit}",
|
||||
"--othersockbuf", "{$sOtherBuf}:{$sOtherBufLimit}",
|
||||
"--dgramrcvbuf", "{$sDgramBuf}:{$sDgramBuf}",
|
||||
"--numothersock", "{$sOtherSock}:{$sOtherSock}",
|
||||
"--numfile", "{$sNumFile}:{$sNumFile}",
|
||||
"--numproc", "{$sNumProc}:{$sNumProc}",
|
||||
"--dcachesize", "{$sDCache}:{$sDCacheLimit}",
|
||||
"--numiptent", "128:128",
|
||||
"--diskinodes", "200000:220000",
|
||||
"--avnumproc", "{$sAvgProc}:{$sAvgProc}",
|
||||
"--save"
|
||||
);
|
||||
|
||||
/*
|
||||
This may be useful if we turn out to have a kernel that supports vswap
|
||||
|
||||
$command = shrink_command("vzctl set {$this->sInternalId}
|
||||
--onboot yes
|
||||
--setmode restart
|
||||
--hostname {$this->sHostname}
|
||||
--nameserver 8.8.8.8
|
||||
--nameserver 8.8.4.4
|
||||
--numproc {$this->sCpuCount}
|
||||
--quotatime 0
|
||||
--diskspace {$this->sDiskSpace}M:{$this->sDiskSpace}M
|
||||
--userpasswd root:{$sRootPassword}
|
||||
--numtcpsock 360:360
|
||||
--numflock 188:206
|
||||
--numpty 16:16
|
||||
--numsiginfo 256:256
|
||||
--tcpsndbuf 1720320:2703360
|
||||
--tcprcvbuf 1720320:2703360
|
||||
--othersockbuf 1126080:2097152
|
||||
--dgramrcvbuf 262144:262144
|
||||
--numothersock 360:360
|
||||
--numfile 9312:9312
|
||||
--dcachesize 3409920:3624960
|
||||
--numiptent 128:128
|
||||
--diskinodes 200000:220000
|
||||
--avnumproc 180:180
|
||||
--ram {$this->sGuaranteedRam}M
|
||||
--swap {$this->sBurstableRam}M
|
||||
--save
|
||||
");*/
|
||||
|
||||
$result = $this->sNode->ssh->RunCommand($command, false);
|
||||
|
||||
if($result->returncode == 0)
|
||||
{
|
||||
$this->uStatus = CVM_STATUS_CONFIGURED;
|
||||
$this->InsertIntoDatabase();
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsConfigureException($result->stderr, $result->returncode, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsCreateException($result->stderr, $result->returncode, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
|
||||
public function Destroy()
|
||||
{
|
||||
if($this->sCurrentStatus == CVM_STATUS_STARTED)
|
||||
{
|
||||
$this->Stop();
|
||||
}
|
||||
|
||||
$command = array("sudo", "vzctl", "destroy", $this->sInternalId);
|
||||
$result = $this->sNode->ssh->RunCommand($command, false);
|
||||
|
||||
if($result->returncode == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsDestroyException("Destroying VPS failed: {$result->stderr}", $result->returncode, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
|
||||
public function Reinstall()
|
||||
{
|
||||
try
|
||||
{
|
||||
$this->Destroy();
|
||||
$this->Deploy();
|
||||
}
|
||||
catch (VpsDestroyException $e)
|
||||
{
|
||||
throw new VpsReinstallException("Reinstalling VPS failed during destroying: " . $e->getMessage(), $e->getCode(), $this->sInternalId, $e);
|
||||
}
|
||||
catch (VpsCreateException $e)
|
||||
{
|
||||
throw new VpsReinstallException("Reinstalling VPS failed during creation: " . $e->getMessage(), $e->getCode(), $this->sInternalId, $e);
|
||||
}
|
||||
catch (VpsConfigureException $e)
|
||||
{
|
||||
throw new VpsReinstallException("Reinstalling VPS failed during configuration: " . $e->getMessage(), $e->getCode(), $this->sInternalId, $e);
|
||||
}
|
||||
}
|
||||
|
||||
public function Start($forced = false)
|
||||
{
|
||||
if($this->sStatus == CVM_STATUS_SUSPENDED && $forced == false)
|
||||
{
|
||||
throw new VpsSuspendedException("The VPS cannot be started as it is suspended.", 1, $this->sInternalId);
|
||||
}
|
||||
elseif($this->sStatus == CVM_STATUS_TERMINATED && $forced == false)
|
||||
{
|
||||
throw new VpsTerminatedException("The VPS cannot be started as it is terminated.", 1, $this->sInternalId);
|
||||
}
|
||||
else
|
||||
{
|
||||
$command = array("sudo", "vzctl", "start", $this->sInternalId);
|
||||
$result = $this->sNode->ssh->RunCommand($command, false);
|
||||
|
||||
if($result->returncode == 0)
|
||||
{
|
||||
$this->uStatus = CVM_STATUS_STARTED;
|
||||
$this->InsertIntoDatabase();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsStartException($result->stderr, $result->returncode, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function Stop()
|
||||
{
|
||||
if($this->sStatus == CVM_STATUS_SUSPENDED)
|
||||
{
|
||||
throw new VpsSuspendedException("The VPS cannot be stopped as it is suspended.", 1, $this->sInternalId);
|
||||
}
|
||||
elseif($this->sStatus == CVM_STATUS_TERMINATED)
|
||||
{
|
||||
throw new VpsTerminatedException("The VPS cannot be stopped as it is terminated.", 1, $this->sInternalId);
|
||||
}
|
||||
else
|
||||
{
|
||||
$command = array("sudo", "vzctl", "stop", $this->sInternalId);
|
||||
$result = $this->sNode->ssh->RunCommand($command, false);
|
||||
|
||||
/* vzctl is retarded enough to return code 0 when the command fails because the container isn't running,
|
||||
* so we'll have to check stderr for specific error strings as well. Come on guys, it's 2012. */
|
||||
if($result->returncode == 0 && strpos($result->stderr, "Unable to stop") === false)
|
||||
{
|
||||
$this->uStatus = CVM_STATUS_STOPPED;
|
||||
$this->InsertIntoDatabase();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsStopException($result->stderr, $result->returncode, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function Suspend()
|
||||
{
|
||||
if($this->sStatus == CVM_STATUS_SUSPENDED)
|
||||
{
|
||||
throw new VpsSuspendException("The VPS is already suspended.", 1, $this->sInternalId);
|
||||
}
|
||||
elseif($this->sStatus == CVM_STATUS_TERMINATED)
|
||||
{
|
||||
throw new VpsSuspendException("The VPS cannot be suspended because it is already terminated.", 1, $this->sInternalId);
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
$this->Stop();
|
||||
$this->uStatus = CVM_STATUS_SUSPENDED;
|
||||
$this->InsertIntoDatabase();
|
||||
}
|
||||
catch (VpsStopException $e)
|
||||
{
|
||||
throw new VpsSuspendException("Suspension failed as the VPS could not be stopped.", 1, $this->sInternalId, $e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function Unsuspend()
|
||||
{
|
||||
if($this->sStatus == CVM_STATUS_SUSPENDED)
|
||||
{
|
||||
try
|
||||
{
|
||||
$this->Start(true);
|
||||
$this->uStatus = CVM_STATUS_STARTED;
|
||||
$this->InsertIntoDatabase();
|
||||
}
|
||||
catch (VpsStartException $e)
|
||||
{
|
||||
throw new VpsUnsuspendException("Unsuspension failed as the VPS could not be started.", 1, $this->sInternalId, $e);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsUnsuspendException("The VPS is not suspended.", 1, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
|
||||
public function Terminate()
|
||||
{
|
||||
if($this->sStatus != CVM_STATUS_TERMINATED)
|
||||
{
|
||||
try
|
||||
{
|
||||
$this->Stop();
|
||||
}
|
||||
catch (VpsStopException $e)
|
||||
{
|
||||
/*throw new VpsTerminateException("Termination failed as the VPS could not be stopped.", 1, $this->sInternalId, $e);*/
|
||||
/* TODO: Throw warning about being unable to stop it, after checking VPS status. */
|
||||
}
|
||||
|
||||
$this->uStatus = CVM_STATUS_TERMINATED;
|
||||
$this->uTerminationDate = time();
|
||||
$this->InsertIntoDatabase();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsTerminateException("The VPS is already terminated.", 1, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
|
||||
public function Unterminate()
|
||||
{
|
||||
if($this->sStatus == CVM_STATUS_TERMINATED)
|
||||
{
|
||||
try
|
||||
{
|
||||
$this->Start(true);
|
||||
}
|
||||
catch (VpsStartException $e)
|
||||
{
|
||||
/*throw new VpsUnterminateException("Untermination failed as the VPS could not be started.", 1, $this->sInternalId, $e);*/
|
||||
/* TODO: Throw warning about being unable to start it, after checking VPS status. */
|
||||
}
|
||||
|
||||
$this->uStatus = CVM_STATUS_STARTED;
|
||||
$this->InsertIntoDatabase();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsUnterminateException("The VPS is not terminated.", 1, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
|
||||
public function AddIp($ip)
|
||||
{
|
||||
$command = array("sudo", "vzctl", "set", $this->sInternalId, "--ipadd", $ip, "--save");
|
||||
|
||||
$result = $this->sNode->ssh->RunCommand($command, false);
|
||||
|
||||
if($result->returncode == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsIpAddException($result->stderr, $result->returncode, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
|
||||
public function RemoveIp($ip)
|
||||
{
|
||||
$command = array("sudo", "vzctl", "set", $this->sInternalId, "--ipdel", $ip, "--save");
|
||||
|
||||
$result = $this->sNode->ssh->RunCommand($command, false);
|
||||
|
||||
if($result->returncode == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsIpRemoveException($result->stderr, $result->returncode, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
|
||||
public function UpdateTraffic()
|
||||
{
|
||||
/* TODO: Don't rely on grep, and parse the output in this function itself. Also try to find another way to do this without relying
|
||||
* on the container at all. */
|
||||
$result = $this->sNode->ssh->RunCommand(array("sudo", "vzctl", "exec", $this->sInternalId, "cat /proc/net/dev | grep venet0"), false);
|
||||
|
||||
if($result->returncode == 0)
|
||||
{
|
||||
$lines = split_lines($result->stdout);
|
||||
$values = split_whitespace(str_replace(":", " ", $lines[0]));
|
||||
|
||||
$uIncoming = $values[1];
|
||||
$uOutgoing = $values[9];
|
||||
|
||||
if($uIncoming < (int)$this->sIncomingTrafficLast || $uOutgoing < (int)$this->sOutgoingTrafficLast)
|
||||
{
|
||||
// the counter has reset (wrap-around, reboot, etc.)
|
||||
$uNewIncoming = $uIncoming;
|
||||
$uNewOutgoing = $uOutgoing;
|
||||
}
|
||||
else
|
||||
{
|
||||
$uNewIncoming = $uIncoming - $this->sIncomingTrafficLast;
|
||||
$uNewOutgoing = $uOutgoing - $this->sOutgoingTrafficLast;
|
||||
}
|
||||
|
||||
$this->uIncomingTrafficUsed = $this->sIncomingTrafficUsed + $uNewIncoming;
|
||||
$this->uOutgoingTrafficUsed = $this->sOutgoingTrafficUsed + $uNewOutgoing;
|
||||
|
||||
$this->uIncomingTrafficLast = $uIncoming;
|
||||
$this->uOutgoingTrafficLast = $uOutgoing;
|
||||
|
||||
$this->InsertIntoDatabase();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new VpsTrafficRetrieveException($result->stderr, $result->returncode, $this->sInternalId);
|
||||
}
|
||||
}
|
||||
|
||||
public function SetRootPassword($password)
|
||||
{
|
||||
if($this->sStatus == CVM_STATUS_SUSPENDED)
|
||||
{
|
||||
throw new VpsSuspendedException("The root password cannot be changed, because the VPS is suspended.", 1, $this->sInternalId);
|
||||
}
|
||||
elseif($this->sStatus == CVM_STATUS_TERMINATED)
|
||||
{
|
||||
throw new VpsTerminatedException("The root password cannot be changed, because the VPS is terminated.", 1, $this->sInternalId);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->SetOptions(array(
|
||||
'userpasswd' => "root:{$password}"
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
public function EnableTunTap()
|
||||
{
|
||||
/* TODO: Finish EnableTunTap function, check whether tun module is available on host */
|
||||
$command = array("sudo", "vzctl", "set", $this->sInternalId, "--devnodes", "net/tun:rw", "--save");
|
||||
}
|
||||
}
|
@ -1 +0,0 @@
|
||||
../../cphp
|
@ -1,37 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
$_APP = true;
|
||||
require("includes/include.base.php");
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM containers"))
|
||||
{
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sVps = new Vps($row);
|
||||
|
||||
try
|
||||
{
|
||||
$sVps->UpdateTraffic();
|
||||
}
|
||||
catch (VpsTrafficRetrieveException $e)
|
||||
{
|
||||
if($sVps->sCurrentStatus == CVM_STATUS_STARTED)
|
||||
{
|
||||
// This is not supposed to fail, as the VPS is running.
|
||||
// Something shady going on.
|
||||
// TODO: Log exception
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1 +0,0 @@
|
||||
include.config.api.php
|
@ -1,39 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$_CPHP_CONFIG = "../config.json";
|
||||
$_CPHP = true;
|
||||
require("cphp/base.php");
|
||||
require("include.config.php");
|
||||
require("include.exceptions.php");
|
||||
require("include.constants.php");
|
||||
require("include.parsing.php");
|
||||
require("include.misc.php");
|
||||
|
||||
function __autoload($class_name)
|
||||
{
|
||||
global $_APP;
|
||||
|
||||
if(strpos($class_name, "\\") !== false)
|
||||
{
|
||||
$class_name = str_replace("\\", "/", strtolower($class_name));
|
||||
require_once("classes/{$class_name}.php");
|
||||
}
|
||||
else
|
||||
{
|
||||
$class_name = strtolower($class_name);
|
||||
require_once("classes/{$class_name}.php");
|
||||
}
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
$settings['local_api_key'] = "something";
|
@ -1,20 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
$settings['master_privkey'] = "/etc/cvm/key";
|
||||
$settings['master_pubkey'] = "/etc/cvm/key.pub";
|
||||
$settings['salt'] = "kAU0qM";
|
||||
|
||||
require("include.config.api.php");
|
||||
|
||||
?>
|
@ -1,31 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
define("CVM_VIRTUALIZATION_OPENVZ", 1 );
|
||||
|
||||
define("CVM_STATUS_BLANK", 1 );
|
||||
define("CVM_STATUS_CREATED", 2 );
|
||||
define("CVM_STATUS_CONFIGURED", 3 );
|
||||
define("CVM_STATUS_STARTED", 4 );
|
||||
define("CVM_STATUS_STOPPED", 5 );
|
||||
define("CVM_STATUS_SUSPENDED", 6 );
|
||||
define("CVM_STATUS_TERMINATED", 7 );
|
||||
|
||||
define("API_CLIENT", 1 );
|
||||
define("API_BILLING", 2 );
|
||||
define("API_ADMIN", 3 );
|
||||
|
||||
define("REGEX_HOSTNAME", "/(([a-zA-Z0-9-]+\.)+)([a-zA-Z0-9-]+)/");
|
||||
?>
|
@ -1,62 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
// SshConnector-related exceptions
|
||||
class SshException extends Exception {}
|
||||
class SshConnectException extends SshException {}
|
||||
class SshAuthException extends SshException {}
|
||||
class SshCommandException extends SshException {}
|
||||
class SshExitException extends SshException {}
|
||||
|
||||
// VPS-related exceptions
|
||||
class VpsException extends Exception
|
||||
{
|
||||
private $id = "";
|
||||
|
||||
public function __construct($message = "", $code = 0, $id = "", $previous = null)
|
||||
{
|
||||
$this->id = $id;
|
||||
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
|
||||
public function getId()
|
||||
{
|
||||
return $this->id;
|
||||
}
|
||||
}
|
||||
|
||||
class VpsCreateException extends VpsException {}
|
||||
class VpsConfigureException extends VpsException {}
|
||||
class VpsStartException extends VpsException {}
|
||||
class VpsStopException extends VpsException {}
|
||||
class VpsSuspendException extends VpsException {}
|
||||
class VpsUnsuspendException extends VpsException {}
|
||||
class VpsTerminateException extends VpsException {}
|
||||
class VpsUnterminateException extends VpsException {}
|
||||
class VpsSuspendedException extends VpsException {}
|
||||
class VpsTerminatedException extends VpsException {}
|
||||
class VpsDestroyException extends VpsException {}
|
||||
class VpsReinstallException extends VpsException {}
|
||||
class VpsDeployException extends VpsException {}
|
||||
class VpsIpAddException extends VpsException {}
|
||||
class VpsIpRemoveException extends VpsException {}
|
||||
class VpsTrafficRetrieveException extends VpsException {}
|
||||
|
||||
class UnauthorizedException extends Exception {}
|
||||
class InsufficientAccessLevelException extends Exception {}
|
||||
class TemplateUnavailableException extends Exception {}
|
||||
|
||||
class ParsingException extends Exception {}
|
@ -1,229 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
function check_fields($source, $fields, &$errors)
|
||||
{
|
||||
/* This function runs through a GET/POST value array, checks if all values are filled in,
|
||||
* and adds error messages to the specified array if this is not the case. */
|
||||
foreach($fields as $field_name => $field_error)
|
||||
{
|
||||
if(empty($source[$field_name]))
|
||||
{
|
||||
$errors[] = $field_error;
|
||||
}
|
||||
}
|
||||
|
||||
return $errors;
|
||||
}
|
||||
|
||||
function array_add(&$array, $value)
|
||||
{
|
||||
/* Why use a separate function to add an item to an array if the $name[] construct exists?
|
||||
* We only want to add an element to an array if the element isn't in the array yet, hence
|
||||
* the need for a custom function.
|
||||
* NOTE: This function works in-place. */
|
||||
if(in_array($value, $array) === false)
|
||||
{
|
||||
$array[] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
function validate_hostname($hostname)
|
||||
{
|
||||
if(preg_match("/^[a-z\d](-*[a-z\d])*(\.[a-z\d](-*[a-z\d])*)*$/", $hostname))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function first_unused_ctid()
|
||||
{
|
||||
/* [OpenVZ only] This function finds the first valid unused CTID and returns it. */
|
||||
global $database;
|
||||
|
||||
$id_list = array();
|
||||
$highest = 101;
|
||||
|
||||
/* Collect all known CTIDs and keep track of the highest CTID. */
|
||||
if($result = $database->CachedQuery("SELECT `InternalId` FROM containers WHERE `VirtualizationType` = 1", array(), 0))
|
||||
{
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$id = filter_var($row['InternalId'] ,FILTER_VALIDATE_INT);
|
||||
|
||||
if($id !== false)
|
||||
{
|
||||
$id_list[] = $id;
|
||||
|
||||
if($id > $highest)
|
||||
{
|
||||
$highest = $id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Generate a list of all possible CTIDs between 101 and the highest CTID, and find
|
||||
* all possible CTIDs that do not exist in the known CTID list. We use array_merge
|
||||
* because otherwise the array indexes may not start from 0. */
|
||||
$all_ids = range(101, $highest, 1);
|
||||
$missing = array_merge(array_diff($all_ids, $id_list));
|
||||
|
||||
if(count($missing) > 0)
|
||||
{
|
||||
/* Return the first unused CTID. */
|
||||
return $missing[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* All CTIDs up to the highest CTID have been used. We'll just return the CTID
|
||||
* that is one above the highest known CTID. */
|
||||
return $highest + 1;
|
||||
}
|
||||
}
|
||||
|
||||
function format_size($input, $multiplier = 1024, $group = false, $decimal_places = 0, $return_array = false)
|
||||
{
|
||||
if($input > pow($multiplier, 8))
|
||||
{
|
||||
$unit = "Y";
|
||||
$number = $input / pow($multiplier, 8);
|
||||
}
|
||||
elseif($input > pow($multiplier, 7))
|
||||
{
|
||||
$unit = "Z";
|
||||
$number = $input / pow($multiplier, 7);
|
||||
}
|
||||
elseif($input > pow($multiplier, 6))
|
||||
{
|
||||
$unit = "E";
|
||||
$number = $input / pow($multiplier, 6);
|
||||
}
|
||||
elseif($input > pow($multiplier, 5))
|
||||
{
|
||||
$unit = "P";
|
||||
$number = $input / pow($multiplier, 5);
|
||||
}
|
||||
elseif($input > pow($multiplier, 4))
|
||||
{
|
||||
$unit = "T";
|
||||
$number = $input / pow($multiplier, 4);
|
||||
}
|
||||
elseif($input > pow($multiplier, 3))
|
||||
{
|
||||
$unit = "G";
|
||||
$number = $input / pow($multiplier, 3);
|
||||
}
|
||||
elseif($input > pow($multiplier, 2))
|
||||
{
|
||||
$unit = "M";
|
||||
$number = $input / pow($multiplier, 2);
|
||||
}
|
||||
elseif($input > $multiplier)
|
||||
{
|
||||
$unit = "K";
|
||||
$number = $input / $multiplier;
|
||||
}
|
||||
else
|
||||
{
|
||||
$unit = "";
|
||||
$number = $input;
|
||||
}
|
||||
|
||||
if($group === true)
|
||||
{
|
||||
$number = number_format($number, $decimal_places);
|
||||
}
|
||||
else
|
||||
{
|
||||
$number = round($number, $decimal_places);
|
||||
}
|
||||
|
||||
if($return_array == true)
|
||||
{
|
||||
return array($number, $unit);
|
||||
}
|
||||
else
|
||||
{
|
||||
return $number . $unit;
|
||||
}
|
||||
}
|
||||
|
||||
function status_code($code)
|
||||
{
|
||||
$codes = array(
|
||||
100 => "Continue",
|
||||
101 => "Switching Protocols",
|
||||
200 => "OK",
|
||||
201 => "Created",
|
||||
202 => "Accepted",
|
||||
203 => "Non-Authoritative Information",
|
||||
204 => "No Content",
|
||||
205 => "Reset Content",
|
||||
206 => "Partial Content",
|
||||
300 => "Multiple Choices",
|
||||
301 => "Moved Permanently",
|
||||
302 => "Moved Temporarily",
|
||||
303 => "See Other",
|
||||
304 => "Not Modified",
|
||||
305 => "Use Proxy",
|
||||
400 => "Bad Request",
|
||||
401 => "Unauthorized",
|
||||
402 => "Payment Required",
|
||||
403 => "Forbidden",
|
||||
404 => "Not Found",
|
||||
405 => "Method Not Allowed",
|
||||
406 => "Not Acceptable",
|
||||
407 => "Proxy Authentication Required",
|
||||
408 => "Request Time-out",
|
||||
409 => "Conflict",
|
||||
410 => "Gone",
|
||||
411 => "Length Required",
|
||||
412 => "Precondition Failed",
|
||||
413 => "Request Entity Too Large",
|
||||
414 => "Request-URI Too Large",
|
||||
415 => "Unsupported Media Type",
|
||||
418 => "I'm a teapot",
|
||||
500 => "Internal Server Error",
|
||||
501 => "Not Implemented",
|
||||
502 => "Bad Gateway",
|
||||
503 => "Service Unavailable",
|
||||
504 => "Gateway Time-out",
|
||||
505 => "HTTP Version not supported",
|
||||
);
|
||||
|
||||
if(array_key_exists($code, $codes))
|
||||
{
|
||||
$text = $codes[$code];
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("The specified HTTP status code does not exist.");
|
||||
}
|
||||
|
||||
if(strpos(php_sapi_name(), "cgi") !== false)
|
||||
{
|
||||
header("Status: {$code} {$text}");
|
||||
}
|
||||
else
|
||||
{
|
||||
$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
|
||||
header("{$protocol} {$code} {$text}");
|
||||
}
|
||||
}
|
@ -1,94 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
function split_whitespace($input)
|
||||
{
|
||||
return preg_split("/\s+/", $input);
|
||||
}
|
||||
|
||||
function split_lines($input)
|
||||
{
|
||||
$lines = explode("/n", $input);
|
||||
|
||||
foreach($lines as &$line)
|
||||
{
|
||||
$line = trim($line);
|
||||
}
|
||||
|
||||
return $lines;
|
||||
}
|
||||
|
||||
function shrink_command($command)
|
||||
{
|
||||
$command = preg_replace("/(\t+|\n)/", " ", $command);
|
||||
$command = str_replace("/r", "", $command);
|
||||
return $command;
|
||||
}
|
||||
|
||||
function parse_size($size, $multiplier = 1024)
|
||||
{
|
||||
/* Note that this function will always assume bytes and the given multiplier, regardless of
|
||||
* what is actually specified. */
|
||||
if(preg_match("/(-?[0-9.,]+)\s*(([kKmMgGtTpPeEzZyY]?)([iI]?)([bB]?))/", $size, $matches))
|
||||
{
|
||||
$number = (float) $matches[1];
|
||||
$unit = $matches[2];
|
||||
$prefix = $matches[3];
|
||||
$suffix = $matches[5];
|
||||
|
||||
if(empty($prefix))
|
||||
{
|
||||
/* Size is in bytes. */
|
||||
return $number;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(strtolower($prefix))
|
||||
{
|
||||
case "y":
|
||||
$number = $number * $multiplier;
|
||||
case "z":
|
||||
$number = $number * $multiplier;
|
||||
case "e":
|
||||
$number = $number * $multiplier;
|
||||
case "p":
|
||||
$number = $number * $multiplier;
|
||||
case "t":
|
||||
$number = $number * $multiplier;
|
||||
case "g":
|
||||
$number = $number * $multiplier;
|
||||
case "m":
|
||||
$number = $number * $multiplier;
|
||||
case "k":
|
||||
$number = $number * $multiplier;
|
||||
break;
|
||||
default:
|
||||
throw new ParsingException("No valid unit was specified.");
|
||||
}
|
||||
|
||||
return $number;
|
||||
}
|
||||
}
|
||||
elseif(is_numeric($size))
|
||||
{
|
||||
return (int) $size;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ParsingException("The given size specification could not be parsed.");
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -1,14 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
require("rewrite.php");
|
@ -1,86 +0,0 @@
|
||||
_locale; nl_NL.UTF-8,nl_NL
|
||||
_datetime_short; %d/%m/%Y %H:%M:%S
|
||||
_datetime_long; %A %B %d, %Y %H:%M:%S
|
||||
_date_short; %d/%m/%Y
|
||||
_date_long; %A %B %d, %Y
|
||||
_time; %H:%M:%S
|
||||
|
||||
event-now; zojuist
|
||||
event-future; in de toekomst
|
||||
event-past; in het verleden
|
||||
event-1second-ago; 1 seconde geleden
|
||||
event-seconds-ago; %1$d seconden geleden
|
||||
event-1minutes-ago; 1 minuut geleden
|
||||
event-minutes-ago; %1$d minuten geleden
|
||||
event-1hour-ago; 1 uur geleden
|
||||
event-hours-ago; %1$d uren geleden
|
||||
event-1day-ago; 1 dag geleden
|
||||
event-days-ago; %1$d dagen geleden
|
||||
event-1week-ago; 1 week geleden
|
||||
event-weeks-ago; %1$d weken geleden
|
||||
event-1month-ago; 1 maand geleden
|
||||
event-months-ago; %1$d maanden geleden
|
||||
event-1year-ago; 1 jaar geleden
|
||||
event-years-ago; %1$d jaar geleden
|
||||
|
||||
title-overview; Overzicht
|
||||
title-login; Inloggen op je VPS panel
|
||||
title-reinstall; VPS herinstalleren
|
||||
|
||||
button-login; Inloggen
|
||||
button-reinstall; Herinstalleren
|
||||
|
||||
notfound; De gezochte VPS is niet gevonden.
|
||||
footer; CVM is een gratis en open-source VPS-beheerpaneel. <a href="http://cvm.cryto.net/">Help mee!</a>
|
||||
|
||||
userbox-loggedin; Je bent ingelogd als <strong>{%?username}</strong>.
|
||||
userbox-account; Accountinstellingen
|
||||
userbox-list; Mijn VPSen
|
||||
userbox-logout; Uitloggen
|
||||
|
||||
menu-overview; Overzicht
|
||||
menu-statistics; Statistieken
|
||||
menu-reinstall; Herinstalleren
|
||||
menu-backups; Backups
|
||||
menu-console; Console
|
||||
menu-ip; IP-toewijzing
|
||||
menu-alerts; Notificaties
|
||||
menu-api; API
|
||||
|
||||
login-username; Gebruikersnaam
|
||||
login-password; Wachtwoord
|
||||
|
||||
overview-quota-title-disk; Schijfruimte
|
||||
overview-quota-title-ram; RAM
|
||||
overview-quota-title-traffic; Dataverkeer
|
||||
overview-title-configuration; VPS-configuratie
|
||||
overview-title-status; Status
|
||||
overview-title-location; Serverlocatie
|
||||
overview-title-node; Host-server
|
||||
overview-title-os; Besturingssysteem
|
||||
overview-title-ipv4; IPv4-adressen
|
||||
overview-title-ipv6; IPv6-adressen
|
||||
overview-title-guaranteed; Gegarandeerde RAM
|
||||
overview-title-burstable; Burstable RAM
|
||||
overview-title-disk; Schijfruimte
|
||||
overview-title-traffic; Dataverkeer
|
||||
overview-title-bandwidth; Bandbreedtte
|
||||
overview-status-running; Gestart
|
||||
overview-status-stopped; Gestopt
|
||||
overview-status-suspended; Geblokkeerd
|
||||
overview-status-unknown; Onbekend
|
||||
overview-button-start; Start VPS
|
||||
overview-button-restart; Herstart VPS
|
||||
overview-button-stop; Stop VPS
|
||||
|
||||
list-column-hostname; Hostnaam
|
||||
list-column-platform; Platform
|
||||
list-column-node; Host-server
|
||||
list-column-disk; Schijfruimte
|
||||
list-column-ram; RAM
|
||||
list-column-template; Sjabloon
|
||||
list-status-running; Gestart
|
||||
list-status-stopped; Gestopt
|
||||
list-status-suspended; Geblokkeerd
|
||||
|
||||
reinstall-warning; Ik begrijp dat bij het herinstalleren van mijn VPS <strong>alle gegevens die zich op de VPS bevinden onherroepelijk verloren gaan,</strong> en niet hersteld kunnen worden. Er zijn geen verdere bevestigingen, <strong>na het aanklikken van onderstaande knop wordt de herinstallatie gestart. Deze kan niet geannuleerd worden.</strong>
|
File diff suppressed because one or more lines are too long
@ -1,342 +0,0 @@
|
||||
## Basic locale settings
|
||||
_locale; en_US.UTF-8,en_US
|
||||
_datetime_short; %d/%m/%Y %H:%M:%S
|
||||
_datetime_long; %A %B %d, %Y %H:%M:%S
|
||||
_date_short; %d/%m/%Y
|
||||
_date_long; %A %B %d, %Y
|
||||
_time; %H:%M:%S
|
||||
|
||||
## Relative time indications
|
||||
event-now; now
|
||||
event-future; in the future
|
||||
event-past; in the past
|
||||
event-1second-ago; 1 second ago
|
||||
event-seconds-ago; %1$d seconds ago
|
||||
event-1minutes-ago; 1 minute ago
|
||||
event-minutes-ago; %1$d minutes ago
|
||||
event-1hour-ago; 1 hour ago
|
||||
event-hours-ago; %1$d hours ago
|
||||
event-1day-ago; 1 day ago
|
||||
event-days-ago; %1$d days ago
|
||||
event-1week-ago; 1 week ago
|
||||
event-weeks-ago; %1$d weeks ago
|
||||
event-1month-ago; 1 month ago
|
||||
event-months-ago; %1$d months ago
|
||||
event-1year-ago; 1 year ago
|
||||
event-years-ago; %1$d years ago
|
||||
|
||||
## Miscellaneous
|
||||
footer; CVM is a free and open source VPS control panel. <a href="http://cvm.cryto.net/">Want to contribute?</a>
|
||||
title-unauthorized; Unauthorized
|
||||
error-unauthorized-title; You are not authorized to view this page
|
||||
error-unauthorized-text; Your access level is not sufficient or you are not logged in.
|
||||
error-notfound-title; VPS not found
|
||||
error-notfound-text; The VPS you selected was not found.
|
||||
|
||||
## Login
|
||||
title-login; Login to your VPS panel
|
||||
error-login-invalid-title; Login failed
|
||||
error-login-invalid-text; The login details you provided are invalid. Please try again.
|
||||
login-username; Username
|
||||
login-password; Password
|
||||
button-login; Login
|
||||
|
||||
## Logout
|
||||
error-logout-success-title; Successfully logged out
|
||||
error-logout-success-text; You have been successfully logged out. You can now close this page.
|
||||
error-logout-notloggedin-title; You are not logged in
|
||||
error-logout-notloggedin-text; You can only logout when you are already logged in.
|
||||
|
||||
## User box
|
||||
userbox-loggedin; You are logged in as <strong>{%?username}</strong>.
|
||||
userbox-account; Account settings
|
||||
userbox-list; My VPSes
|
||||
userbox-logout; Log out
|
||||
userbox-admin; Administration panel
|
||||
|
||||
## End user menu items
|
||||
menu-overview; Overview
|
||||
menu-statistics; Statistics
|
||||
menu-reinstall; Reinstall
|
||||
menu-backups; Backups
|
||||
menu-console; Console
|
||||
menu-ip; IP Allocation
|
||||
menu-alerts; Alerts
|
||||
menu-api; API
|
||||
menu-password; Root Password
|
||||
|
||||
## Administration panel menu items
|
||||
menu-admin-overview; Overview
|
||||
menu-admin-users; Users
|
||||
menu-admin-vpses; VPSes
|
||||
menu-admin-nodes; Nodes
|
||||
menu-admin-templates; Templates
|
||||
|
||||
## Global warnings and errors
|
||||
error-form; One or more problems occurred.
|
||||
warning-suspended-title; This VPS is suspended
|
||||
warning-suspended-text; You cannot change any configuration or perform any actions on this VPS. If you feel this should not be the case, please contact support.
|
||||
warning-terminated-title; This VPS has been terminated
|
||||
warning-terminated-text; You cannot change any configuration or perform any actions on this VPS, as it is terminated.
|
||||
error-suspended-title; This VPS is suspended
|
||||
error-terminated-title; This VPS has been terminated
|
||||
|
||||
## VPS overview page
|
||||
title-overview; Overview
|
||||
notfound; The specified VPS was not found.
|
||||
overview-quota-title-disk; Disk space
|
||||
overview-quota-title-ram; RAM
|
||||
overview-quota-title-traffic; Traffic
|
||||
overview-quota-title-traffic-incoming; Incoming traffic
|
||||
overview-quota-title-traffic-outgoing; Outgoing traffic
|
||||
overview-title-configuration; VPS configuration
|
||||
overview-title-status; Status
|
||||
overview-title-location; Server location
|
||||
overview-title-node; Host node
|
||||
overview-title-os; Operating system
|
||||
overview-title-ipv4; IPv4 addresses
|
||||
overview-title-ipv6; IPv6 addresses
|
||||
overview-title-guaranteed; Guaranteed RAM
|
||||
overview-title-burstable; Burstable RAM
|
||||
overview-title-disk; Disk space
|
||||
overview-title-traffic; Traffic
|
||||
overview-title-traffic-incoming; Incoming traffic
|
||||
overview-title-traffic-outgoing; Outgoing traffic
|
||||
overview-title-bandwidth; Bandwidth
|
||||
overview-status-running; Running
|
||||
overview-status-stopped; Stopped
|
||||
overview-status-suspended; Suspended
|
||||
overview-status-unknown; Unknown
|
||||
overview-button-start; Start VPS
|
||||
overview-button-restart; Restart VPS
|
||||
overview-button-stop; Stop VPS
|
||||
header-vps-admin; Administrative tasks
|
||||
vps-admin-suspend; Suspend / unsuspend
|
||||
vps-admin-transfer; Transfer
|
||||
vps-admin-terminate; Terminate
|
||||
|
||||
## Start VPS
|
||||
error-start-success-title; VPS started
|
||||
error-start-success-text; Your VPS was successfully started.
|
||||
error-start-suspended-title; VPS is suspended
|
||||
error-start-suspended-text; Your VPS could not be started, as it is currently suspended. If you believe this is in error, please file a support ticket.
|
||||
error-start-terminated-title; VPS is terminated
|
||||
error-start-terminated-text; Your VPS could not be started, as it is terminated.
|
||||
error-start-failed-title; VPS failed to start
|
||||
error-start-failed-text; Your VPS could not be started. If this error persists, please file a support ticket.
|
||||
error-start-running-title; VPS can't be started
|
||||
error-start-running-text; Your VPS cannot be started because it is already running.
|
||||
|
||||
## Stop VPS
|
||||
error-stop-success-title; VPS stopped
|
||||
error-stop-success-text; Your VPS was successfully stopped.
|
||||
error-stop-suspended-title; VPS is suspended
|
||||
error-stop-suspended-text; Your VPS could not be stopped, as it is currently suspended. If you believe this is in error, please file a support ticket.
|
||||
error-stop-terminated-title; VPS is terminated
|
||||
error-stop-terminated-text; Your VPS could not be stopped, as it is terminated.
|
||||
error-stop-failed-title; VPS failed to stop
|
||||
error-stop-failed-text; Your VPS could not be stopped. If this error persists, please file a support ticket.
|
||||
error-stop-stopped-title; VPS can't be stopped
|
||||
error-stop-stopped-text; Your VPS cannot be stopped because it is not running.
|
||||
|
||||
## Restart VPS
|
||||
error-restart-success-title; VPS restarted
|
||||
error-restart-success-text; Your VPS was successfully restarted.
|
||||
error-restart-suspended-title; VPS is suspended
|
||||
error-restart-suspended-text; Your VPS could not be restarted, as it is currently suspended. If you believe this is in error, please file a support ticket.
|
||||
error-restart-terminated-title; VPS is terminated
|
||||
error-restart-terminated-text; Your VPS could not be restarted, as it is terminated.
|
||||
error-restart-start-title; VPS failed to start
|
||||
error-restart-start-text; Your VPS could not be started. If this error persists, please file a support ticket.
|
||||
|
||||
## Suspend VPS
|
||||
title-admin-vps-suspend; Suspend VPS
|
||||
vps-admin-suspend-text; Are you sure you wish to suspend this VPS? The owner will no longer be able to use it, until it is unsuspended!
|
||||
error-suspend-success-title; VPS suspended
|
||||
error-suspend-success-text; The VPS has been suspended and can no longer be used by the owner.
|
||||
error-suspend-error-title; Failed to suspend VPS
|
||||
error-suspend-error-text; The VPS could not be suspended.
|
||||
button-admin-vps-suspend; Suspend VPS
|
||||
|
||||
## Unsuspend VPS
|
||||
title-admin-vps-unsuspend; Unsuspend VPS
|
||||
vps-admin-unsuspend-text; Are you sure you wish to unsuspend this VPS? The owner will be able to use it again.
|
||||
error-unsuspend-success-title; VPS unsuspended
|
||||
error-unsuspend-success-text; The VPS has been unsuspended and can now be used by the owner again.
|
||||
error-unsuspend-error-title; Failed to unsuspend VPS
|
||||
error-unsuspend-error-text; The VPS could not be unsuspended.
|
||||
button-admin-vps-unsuspend; Unsuspend VPS
|
||||
|
||||
## Terminate VPS
|
||||
title-admin-vps-terminate; Terminate VPS
|
||||
vps-admin-terminate-text; Are you sure you wish to terminate this VPS? The VPS will be suspended immediately, and deleted after several hours. As long as it is not deleted, the termination can be undone.
|
||||
error-terminate-success-title; VPS terminated
|
||||
error-terminate-success-text; The VPS has been terminated and can no longer be used by the owner.
|
||||
error-terminate-error-title; Failed to terminate VPS
|
||||
error-terminate-error-text; The VPS could not be terminated.
|
||||
button-admin-vps-terminate; Terminate VPS
|
||||
|
||||
## Unterminate VPS
|
||||
title-admin-vps-unterminate; Unterminate VPS
|
||||
vps-admin-unterminate-text; Are you sure you wish to unterminate this VPS? The owner will be able to use it again.
|
||||
error-unterminate-success-title; VPS unterminated
|
||||
error-unterminate-success-text; The VPS has been unterminated and can now be used by the owner again.
|
||||
error-unterminate-error-title; Failed to unterminate VPS
|
||||
error-unterminate-error-text; The VPS could not be unterminated.
|
||||
button-admin-vps-unterminate; Unterminate VPS
|
||||
|
||||
## Transfer VPS
|
||||
title-admin-vps-transfer; Transfer VPS ownership
|
||||
button-admin-vps-transfer; Transfer VPS
|
||||
|
||||
## Terminate VPS
|
||||
title-admin-vps-terminate; Terminate VPS
|
||||
button-admin-vps-terminate; Terminate VPS
|
||||
|
||||
## Reinstall VPS
|
||||
title-reinstall; Reinstall your VPS
|
||||
error-reinstall-success-title; Reinstallation succeeded!
|
||||
error-reinstall-success-text; Your VPS was successfully reinstalled.
|
||||
error-reinstall-confirm-title; Reinstallation aborted
|
||||
error-reinstall-confirm-text; You did not tick the checkbox at the bottom of the page. Please carefully read the warning, tick the checkbox, and try again.
|
||||
error-reinstall-notfound-title; Reinstallation aborted
|
||||
error-reinstall-notfound-text; The template you selected does not exist (anymore). Please select a different template.
|
||||
error-reinstall-notselected-title; No template selected
|
||||
error-reinstall-notselected-text; You did not select a template from the list. Please select a template and try again.
|
||||
error-reinstall-unavailable-title; Reinstallation aborted
|
||||
error-reinstall-unavailable-text; The template you selected is not available. Please select a different template.
|
||||
error-reinstall-failed-title; Reinstallation failed
|
||||
error-reinstall-failed-text; Something went wrong during the reinstallation of your VPS. Please try again. If the reinstallation fails again, please contact support.
|
||||
error-reinstall-start-title; Failed to start
|
||||
error-reinstall-start-text; The VPS was successfully reinstalled, but it could not be started. If the issue persists, please contact support.
|
||||
error-reinstall-suspended-title; Reinstallation aborted
|
||||
error-reinstall-suspended-text; You can not reinstall this VPS, because it is suspended. If you believe this is in error, please contact support.
|
||||
error-reinstall-terminated-title; Reinstallation aborted
|
||||
error-reinstall-terminated-text; You can not reinstall this VPS, because it has been terminated.
|
||||
reinstall-warning; I understand that by reinstalling my VPS, <strong>all data on the VPS is permanently lost</strong> and cannot be recovered. There will be no further confirmations, <strong>after clicking the Reinstall button the reinstallation process cannot be aborted.</strong>
|
||||
reinstall-patience; (be patient; this may take a while)
|
||||
button-reinstall; Reinstall
|
||||
|
||||
## Change root password
|
||||
title-password; Set new root password
|
||||
error-password-success-title; Password configuration succeeded!
|
||||
error-password-success-text; Your new root password was successfully configured. Please ensure to change your root password again from your VPS after logging in.
|
||||
error-password-nomatch-title; Passwords do not match
|
||||
error-password-nomatch-text; Both entries must be identical. Please try again.
|
||||
error-password-missing-title; Fields missing
|
||||
error-password-missing-text; Both fields are required. Please try again.
|
||||
error-password-suspended-title; Failed to configure root password
|
||||
error-password-suspended-text; You can not configure the root password for this VPS, because it is suspended. If you believe this is in error, please contact support.
|
||||
error-password-terminated-title; Failed to configure root password
|
||||
error-password-terminated-text; You can not configure the root password for this VPS, because it has been terminated.
|
||||
error-password-invalid-title; Failed to configure root password
|
||||
error-password-invalid-text; Your password may be in an invalid format. Try again with a different password.
|
||||
warning-password-title; Security warning
|
||||
warning-password-text; Configuring your root password through this panel may expose it to the VPS provider. Only use this feature in an emergency situation, and always change your password again afterwards, from within your VPS.
|
||||
password-field-password; New root password
|
||||
password-field-confirm; Confirm password
|
||||
button-password; Set new root password
|
||||
|
||||
## Out-of-band console
|
||||
title-console; Out-of-band console
|
||||
console-introduction; If you cannot access your VPS for some reason, you can use the out-of-band console (also known as shell dropper) to invoke a root shell.
|
||||
console-step1; To use the out-of-band console, connect through SSH using the following details:
|
||||
console-step2; After logging in with the above details, you will have to enter your VPS panel login details, after which you can select a VPS to invoke a root shell on.
|
||||
console-title-hostname; Hostname
|
||||
console-title-port; Port
|
||||
console-title-username; Username
|
||||
console-title-password; Password
|
||||
|
||||
## User list
|
||||
title-admin-userlist; User overview
|
||||
toolbar-createuser; Create user
|
||||
|
||||
## User lookup
|
||||
title-admin-userinfo; User lookup
|
||||
error-admin-user-title; That user does not exist
|
||||
error-admin-user-text; The user you tried to look up does not exist.
|
||||
toolbar-edituser; Edit user details
|
||||
admin-title-id; User ID
|
||||
admin-title-username; Username
|
||||
admin-title-email; Email address
|
||||
admin-title-accesslevel; Access level
|
||||
admin-title-vpses; VPS count
|
||||
admin-level-enduser; End user
|
||||
admin-level-reseller; Reseller
|
||||
admin-level-nodeadmin; Node administrator
|
||||
admin-level-masteradmin; Master administrator
|
||||
header-admin-user-vpses; VPSes owned by this user
|
||||
|
||||
## User editing
|
||||
title-admin-edituser; Edit user
|
||||
edituser-username; Username
|
||||
edituser-email; Email address
|
||||
edituser-access; Account type
|
||||
button-admin-edituser; Apply changes
|
||||
|
||||
## VPS list
|
||||
title-admin-vpslist; VPS overview
|
||||
list-column-hostname; Hostname
|
||||
list-column-platform; Platform
|
||||
list-column-node; Node
|
||||
list-column-disk; Disk space
|
||||
list-column-ram; RAM
|
||||
list-column-template; Template
|
||||
list-column-location; Physical location
|
||||
list-column-nodeid; Node ID
|
||||
list-status-running; Running
|
||||
list-status-stopped; Stopped
|
||||
list-status-suspended; Suspended
|
||||
list-status-unknown; Status unknown
|
||||
|
||||
## Node list
|
||||
title-admin-nodelist; Node overview
|
||||
toolbar-addnode; Add node
|
||||
|
||||
## Node lookup
|
||||
title-admin-nodeinfo; Node lookup
|
||||
toolbar-createvps; Create VPS
|
||||
toolbar-editnode; Edit node details
|
||||
header-admin-node-vpses; VPSes on this node
|
||||
|
||||
## Add node
|
||||
title-admin-addnode; Add node
|
||||
error-admin-nodes-add-name; You did not fill in a valid name.
|
||||
error-admin-nodes-add-hostname; You did not fill in a valid hostname.
|
||||
error-admin-nodes-add-location; You did not fill in a valid physical location.
|
||||
error-admin-nodes-add-publickey; You did not upload a valid public key.
|
||||
error-admin-nodes-add-privatekey; You did not upload a valid private key.
|
||||
error-admin-nodes-add-upload; Something went wrong while processing the uploaded keys. Ensure that the keys directory is writable.
|
||||
addnode-name; Name
|
||||
addnode-hostname; Hostname
|
||||
addnode-location; Physical location
|
||||
addnode-customkeypair; Custom keypair
|
||||
addnode-publickey; Public key
|
||||
addnode-privatekey; Private key
|
||||
button-admin-addnode; Add node
|
||||
|
||||
## Create VPS
|
||||
title-admin-addvps; Create VPS
|
||||
error-admin-vpses-add-node; You did not select a valid node.
|
||||
error-admin-vpses-add-user; You did not select a valid user.
|
||||
error-admin-vpses-add-template; You did not select a valid template.
|
||||
error-admin-vpses-add-disk; You did not enter a valid disk space specification.
|
||||
error-admin-vpses-add-guaranteed; You did not enter a valid guaranteed RAM specification.
|
||||
error-admin-vpses-add-burstable; You did not enter a valid burstable RAM specification.
|
||||
error-admin-vpses-add-cpucount; You did not enter a valid amount of CPUs.
|
||||
error-admin-vpses-add-traffic; You did not enter a valid traffic allocation specification.
|
||||
error-admin-vpses-add-hostname; You entered an invalid hostname.
|
||||
addvps-node; Node
|
||||
addvps-user; User
|
||||
addvps-diskspace; Disk space
|
||||
addvps-guaranteed; Guaranteed RAM
|
||||
addvps-burstable; Burstable RAM
|
||||
addvps-cpucount; CPUs
|
||||
addvps-traffic; Traffic allocation
|
||||
addvps-hostname; Hostname (optional)
|
||||
addvps-template; Template
|
||||
button-admin-addvps; Create VPS
|
||||
|
||||
## Administrative overview
|
||||
title-admin-overview; Administrative overview
|
||||
admin-overview-message; In the future, this page will hold a log of all most recent events. For now, it's just an empty page.
|
@ -1,86 +0,0 @@
|
||||
_locale; ro_RO.UTF-8,ro_RO
|
||||
_datetime_short; %d/%m/%Y %H:%M:%S
|
||||
_datetime_long; %A %B %d, %Y %H:%M:%S
|
||||
_date_short; %d/%m/%Y
|
||||
_date_long; %A %B %d, %Y
|
||||
_time; %H:%M:%S
|
||||
|
||||
event-now; acum
|
||||
event-future; in viitor
|
||||
event-past; in trecut
|
||||
event-1second-ago; cu o secunda in urma
|
||||
event-seconds-ago; cu %1$d secunde in urma
|
||||
event-1minutes-ago; cu un minut in urma
|
||||
event-minutes-ago; cu %1$d minute in urma
|
||||
event-1hour-ago; cu o ora in urma
|
||||
event-hours-ago; cu %1$d ore in urma
|
||||
event-1day-ago; cu o zi in urma
|
||||
event-days-ago; cu %1$d zile in urma
|
||||
event-1week-ago; saptamana trecuta
|
||||
event-weeks-ago; cu %1$d saptamani in urma
|
||||
event-1month-ago; luna trecuta
|
||||
event-months-ago; cu %1$d luni in urma
|
||||
event-1year-ago; anul trecut
|
||||
event-years-ago; cu %1$d ani in urma
|
||||
|
||||
title-overview; Prezentare generala
|
||||
title-login; Autentificare la panoul de VPS
|
||||
title-reinstall; Reinstalarea VPS-ului
|
||||
|
||||
button-login; Autentificare
|
||||
button-reinstall; Reinstalare
|
||||
|
||||
notfound; VPS-ul specificat nu a putut fi gasit
|
||||
footer; CVM este un panou de control pentru VPS-uri, gratuit si open source. <a href="http://cvm.cryto.net/">Vrei sa contribui?</a>
|
||||
|
||||
userbox-loggedin; Esti logat ca <strong>{%?username}</strong>.
|
||||
userbox-account; Setari cont
|
||||
userbox-list; VPS-urile mele
|
||||
userbox-logout; Iesire (logout)
|
||||
|
||||
menu-overview; Sumar
|
||||
menu-statistics; Statistici
|
||||
menu-reinstall; Reinstalare
|
||||
menu-backups; Backups
|
||||
menu-console; Consola
|
||||
menu-ip; Alocarea IP-urilor
|
||||
menu-alerts; Alerte
|
||||
menu-api; API
|
||||
|
||||
login-username; Username
|
||||
login-password; Parola
|
||||
|
||||
overview-quota-title-disk; Spatiu pe disc
|
||||
overview-quota-title-ram; RAM
|
||||
overview-quota-title-traffic; Trafic
|
||||
overview-title-configuration; Configuratie VPS
|
||||
overview-title-status; Status
|
||||
overview-title-location; Locatie server
|
||||
overview-title-node; Nod gazda
|
||||
overview-title-os; Sistem de operare
|
||||
overview-title-ipv4; Adrese IPv4
|
||||
overview-title-ipv6; Adrese IPv6
|
||||
overview-title-guaranteed; RAM Garantat
|
||||
overview-title-burstable; RAM burst
|
||||
overview-title-disk; Spatiu pe disc
|
||||
overview-title-traffic; Trafic
|
||||
overview-title-bandwidth; Banda
|
||||
overview-status-running; Pornit
|
||||
overview-status-stopped; Oprit
|
||||
overview-status-suspended; Suspendat
|
||||
overview-status-unknown; Necunoscut
|
||||
overview-button-start; Pornire VPS
|
||||
overview-button-restart; Restart VPS
|
||||
overview-button-stop; Oprire VPS
|
||||
|
||||
list-column-hostname; Hostname
|
||||
list-column-platform; Platforma
|
||||
list-column-node; Gazda
|
||||
list-column-disk; Spatiu pe disc
|
||||
list-column-ram; RAM
|
||||
list-column-template; Template
|
||||
list-status-running; Activ
|
||||
list-status-stopped; Oprit
|
||||
list-status-suspended; Suspendat
|
||||
|
||||
reinstall-warning; Inteleg ca prin reinstalarea VPS-ului, <strong>toate datele de pe VPS vor fi permanent pierdute</strong> si nu pot fi recuperate. Nu vor mai urma alte confirmari, <strong>dupa apasarea butonului Reinstalare procesul de reinstalare nu poate fi intrerupt.</strong>
|
@ -1,101 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$sErrors = array();
|
||||
|
||||
if(isset($_POST['submit']))
|
||||
{
|
||||
if(empty($_POST['name']))
|
||||
{
|
||||
$sErrors[] = $locale->strings['error-admin-nodes-add-name'];
|
||||
}
|
||||
|
||||
if(empty($_POST['hostname']) || preg_match(REGEX_HOSTNAME, $_POST['hostname']) === 0)
|
||||
{
|
||||
$sErrors[] = $locale->strings['error-admin-nodes-add-hostname'];
|
||||
}
|
||||
|
||||
if(empty($_POST['location']))
|
||||
{
|
||||
$sErrors[] = $locale->strings['error-admin-nodes-add-location'];
|
||||
}
|
||||
|
||||
if(isset($_POST['customkey']))
|
||||
{
|
||||
$sKeyId = random_string(20);
|
||||
|
||||
/* TODO: Ensure validity of the custom keys. */
|
||||
|
||||
if($_FILES["publickey"]["error"] == UPLOAD_ERR_OK)
|
||||
{
|
||||
$sPublicKeyName = "{$sKeyId}.public.key";
|
||||
}
|
||||
else
|
||||
{
|
||||
$sErrors[] = $locale->strings['error-admin-nodes-add-publickey'];
|
||||
}
|
||||
|
||||
if($_FILES["privatekey"]["error"] == UPLOAD_ERR_OK)
|
||||
{
|
||||
$sPrivateKeyName = "{$sKeyId}.private.key";
|
||||
}
|
||||
else
|
||||
{
|
||||
$sErrors[] = $locale->strings['error-admin-nodes-add-privatekey'];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sPublicKeyName = "";
|
||||
$sPrivateKeyName = "";
|
||||
}
|
||||
|
||||
if(empty($sErrors))
|
||||
{
|
||||
if(isset($_POST['customkey']))
|
||||
{
|
||||
$sSuccess = move_uploaded_file($_FILES['publickey']['tmp_name'], "/etc/cvm/keys/{$sPublicKeyName}") &&
|
||||
move_uploaded_file($_FILES['privatekey']['tmp_name'], "/etc/cvm/keys/{$sPrivateKeyName}");
|
||||
if(!$sSuccess)
|
||||
{
|
||||
$sErrors[] = $locale->strings['error-admin-nodes-add-upload'];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sSuccess = true;
|
||||
}
|
||||
|
||||
if($sSuccess)
|
||||
{
|
||||
$sNode = new Node(0);
|
||||
$sNode->uName = $_POST['name'];
|
||||
$sNode->uHostname = $_POST['hostname'];
|
||||
$sNode->uPhysicalLocation = $_POST['location'];
|
||||
$sNode->uHasCustomKey = isset($_POST['customkey']);
|
||||
$sNode->uPublicKey = $sPublicKeyName;
|
||||
$sNode->uPrivateKey = $sPrivateKeyName;
|
||||
$sNode->uUser = "cvm";
|
||||
$sNode->uPort = 22;
|
||||
$sNode->InsertIntoDatabase();
|
||||
|
||||
redirect("/admin/nodes/");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/node/add", $locale->strings, array(
|
||||
'errors' => $sErrors
|
||||
));
|
@ -1,34 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$sNodeList = array();
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM nodes"))
|
||||
{
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sNode = new Node($row);
|
||||
|
||||
$sNodeList[] = array(
|
||||
'id' => $sNode->sId,
|
||||
'hostname' => $sNode->sHostname,
|
||||
'location' => $sNode->sPhysicalLocation
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/node/list", $locale->strings, array(
|
||||
'nodes' => $sNodeList
|
||||
));
|
@ -1,67 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
try
|
||||
{
|
||||
$sNode = new Node($router->uParameters[1]);
|
||||
|
||||
$sVpsList = array();
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM containers WHERE `NodeId` = :NodeId", array(":NodeId" => $sNode->sId)))
|
||||
{
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sVps = new Vps($row);
|
||||
|
||||
try
|
||||
{
|
||||
$sStatus = $sVps->sStatusText;
|
||||
}
|
||||
catch (SshException $e)
|
||||
{
|
||||
$sStatus = "unknown";
|
||||
}
|
||||
|
||||
$sVpsList[] = array(
|
||||
'id' => $sVps->sId,
|
||||
'hostname' => $sVps->sHostname,
|
||||
'node' => $sVps->sNode->sName,
|
||||
'node-hostname' => $sVps->sNode->sHostname,
|
||||
'template' => $sVps->sTemplate->sName,
|
||||
'diskspace' => number_format($sVps->sDiskSpace / 1024),
|
||||
'diskspace-unit' => "GB",
|
||||
'guaranteed-ram' => $sVps->sGuaranteedRam,
|
||||
'guaranteed-ram-unit' => "MB",
|
||||
'status' => $sStatus,
|
||||
'virtualization-type' => $sVps->sVirtualizationType
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/node/lookup", $locale->strings, array(
|
||||
'id' => $sNode->sId,
|
||||
'hostname' => $sNode->sHostname,
|
||||
'location' => $sNode->sPhysicalLocation,
|
||||
'vpses' => $sVpsList
|
||||
));
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-admin-node-title'],
|
||||
'message' => $locale->strings['error-admin-node-text']
|
||||
));
|
||||
}
|
||||
|
@ -1,16 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/overview/index", $locale->strings, array());
|
@ -1,77 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
if($router->uMethod == "post")
|
||||
{
|
||||
$handler = new CPHPFormHandler();
|
||||
|
||||
try
|
||||
{
|
||||
$handler
|
||||
->RequireKey("filename")
|
||||
->RequireKey("name")
|
||||
->RequireKey("description")
|
||||
->RequireNonEmpty("filename")
|
||||
->RequireNonEmpty("name")
|
||||
->ValidateCustom("filename", "The specified template file does not exist.", function($key, $value, $args, $handler){
|
||||
return file_exists("/etc/cvm/templates/{$value}");
|
||||
})
|
||||
->Done();
|
||||
|
||||
foreach($handler->GetGroupedValues("filename", "name", "description") as $uTemplateData)
|
||||
{
|
||||
$sTemplate = new Template();
|
||||
$sTemplate->uName = $uTemplateData["name"];
|
||||
$sTemplate->uTemplateName = $uTemplateData["filename"];
|
||||
$sTemplate->uDescription = $uTemplateData["description"];
|
||||
$sTemplate->uIsSupported = true;
|
||||
$sTemplate->uIsOutdated = false;
|
||||
$sTemplate->uIsAvailable = true;
|
||||
$sTemplate->InsertIntoDatabase();
|
||||
}
|
||||
|
||||
redirect("/admin/templates/");
|
||||
}
|
||||
catch (FormValidationException $e)
|
||||
{
|
||||
var_dump($e->GetOffendingKeys());
|
||||
var_dump($e->GetErrors());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sUnknownTemplates = array();
|
||||
|
||||
$handle = opendir("/etc/cvm/templates");
|
||||
while(($filename = readdir($handle)) !== false)
|
||||
{
|
||||
if($filename != "." && $filename != "..")
|
||||
{
|
||||
try
|
||||
{
|
||||
Template::CreateFromQuery("SELECT * FROM templates WHERE `TemplateName` = :Filename", array("Filename" => $filename), 0);
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
$sUnknownTemplates[] = $filename;
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($handle);
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/template/add", $locale->strings, array(
|
||||
"templates" => $sUnknownTemplates
|
||||
));
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$sTemplates = array();
|
||||
|
||||
try
|
||||
{
|
||||
foreach(Template::CreateFromQuery("SELECT * FROM templates") as $sTemplate)
|
||||
{
|
||||
$sTemplates[] = array(
|
||||
"id" => $sTemplate->sId,
|
||||
"name" => $sTemplate->sName,
|
||||
"filename" => $sTemplate->sTemplateName,
|
||||
"description" => $sTemplate->sDescription,
|
||||
"supported" => $sTemplate->sIsSupported,
|
||||
"outdated" => $sTemplate->sIsOutdated,
|
||||
"available" => $sTemplate->sIsAvailable
|
||||
);
|
||||
}
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
/* pass */
|
||||
}
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/template/list", $locale->strings, array(
|
||||
"templates" => $sTemplates
|
||||
));
|
@ -1,78 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
try
|
||||
{
|
||||
$sUser = new User($router->uParameters[1]);
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
throw new RouterException("Specified user does not exist.");
|
||||
}
|
||||
|
||||
$sErrors = array();
|
||||
|
||||
if($router->uMethod == "post")
|
||||
{
|
||||
if(empty($_POST['username']) || preg_match("/^[a-z0-9_.-]+$/i", $_POST['username']) === 0)
|
||||
{
|
||||
$sErrors[] = "You did not enter a valid username.";
|
||||
}
|
||||
|
||||
if(empty($_POST['email']) || filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false)
|
||||
{
|
||||
$sErrors[] = "You did not enter a valid e-mail address.";
|
||||
}
|
||||
|
||||
if(empty($_POST['access']) || preg_match("/^[0-9]+$/", $_POST['access']) === 0)
|
||||
{
|
||||
$sErrors[] = "You did not specify a valid user type.";
|
||||
}
|
||||
else
|
||||
{
|
||||
if($sUser->sAccessLevel == 30 && $_POST['access'] < 30)
|
||||
{
|
||||
/* This user is a master admin, check if any other master admins exist before lowering
|
||||
* the permissions of this one, to prevent lock-outs. */
|
||||
|
||||
try
|
||||
{
|
||||
User::CreateFromQuery("SELECT * FROM users WHERE `AccessLevel` = 30 AND `Id` != :Id", array(":Id" => $sUser->sId), 0);
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
$sErrors[] = "You can't remove your master administrator permissions if no other master administrators exist!";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(empty($sErrors))
|
||||
{
|
||||
$sUser->uUsername = $_POST['username'];
|
||||
$sUser->uEmailAddress = $_POST['email'];
|
||||
$sUser->uAccessLevel = $_POST['access'];
|
||||
$sUser->InsertIntoDatabase();
|
||||
redirect("/admin/user/{$sUser->sId}/");
|
||||
}
|
||||
}
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/user/edit", $locale->strings, array(
|
||||
"errors" => $sErrors,
|
||||
"id" => $router->uParameters[1]
|
||||
), array(
|
||||
"username" => $sUser->sUsername,
|
||||
"email" => $sUser->sEmailAddress,
|
||||
"access" => $sUser->sAccessLevel
|
||||
));
|
@ -1,33 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$result = $database->CachedQuery("SELECT * FROM users ORDER BY `AccessLevel` DESC");
|
||||
|
||||
$sUserList = array();
|
||||
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sUserEntry = new User($row);
|
||||
$sUserList[] = array(
|
||||
'id' => $sUserEntry->sId,
|
||||
'username' => $sUserEntry->sUsername,
|
||||
'email' => $sUserEntry->sEmailAddress,
|
||||
'accesslevel' => $sUserEntry->sAccessLevel
|
||||
);
|
||||
}
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/user/list", $locale->strings, array(
|
||||
'users' => $sUserList
|
||||
));
|
@ -1,71 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
/* TODO: Add "create VPS" button. */
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
try
|
||||
{
|
||||
$sUserEntry = new User($router->uParameters[1]);
|
||||
|
||||
$sVpsList = array();
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM containers WHERE `UserId` = :UserId", array(":UserId" => $sUserEntry->sId)))
|
||||
{
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sVps = new Vps($row);
|
||||
|
||||
try
|
||||
{
|
||||
$sStatus = $sVps->sStatusText;
|
||||
}
|
||||
catch (SshException $e)
|
||||
{
|
||||
$sStatus = "unknown";
|
||||
}
|
||||
|
||||
$sVpsList[] = array(
|
||||
'id' => $sVps->sId,
|
||||
'hostname' => $sVps->sHostname,
|
||||
'node' => $sVps->sNode->sName,
|
||||
'node-hostname' => $sVps->sNode->sHostname,
|
||||
'template' => $sVps->sTemplate->sName,
|
||||
'diskspace' => number_format($sVps->sDiskSpace / 1024),
|
||||
'diskspace-unit' => "GB",
|
||||
'guaranteed-ram' => $sVps->sGuaranteedRam,
|
||||
'guaranteed-ram-unit' => "MB",
|
||||
'status' => $sStatus,
|
||||
'virtualization-type' => $sVps->sVirtualizationType
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/user/lookup", $locale->strings, array(
|
||||
'id' => $sUserEntry->sId,
|
||||
'username' => $sUserEntry->sUsername,
|
||||
'email' => $sUserEntry->sEmailAddress,
|
||||
'accesslevel' => $sUserEntry->sAccessLevel,
|
||||
'vpscount' => $sUserEntry->sVpsCount,
|
||||
'vpses' => $sVpsList
|
||||
));
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-admin-user-title'],
|
||||
'message' => $locale->strings['error-admin-user-text']
|
||||
));
|
||||
}
|
||||
|
@ -1,213 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$sErrors = array();
|
||||
|
||||
if(isset($_POST['submit']))
|
||||
{
|
||||
check_fields($_POST, array(
|
||||
'node' => $locale->strings['error-admin-vpses-add-node'],
|
||||
'user' => $locale->strings['error-admin-vpses-add-user'],
|
||||
'diskspace' => $locale->strings['error-admin-vpses-add-disk'],
|
||||
'guaranteed' => $locale->strings['error-admin-vpses-add-guaranteed'],
|
||||
'burstable' => $locale->strings['error-admin-vpses-add-burstable'],
|
||||
'cpucount' => $locale->strings['error-admin-vpses-add-cpucount'],
|
||||
'traffic' => $locale->strings['error-admin-vpses-add-traffic'],
|
||||
'template' => $locale->strings['error-admin-vpses-add-template']
|
||||
), $sErrors);
|
||||
|
||||
try
|
||||
{
|
||||
$disk_space = parse_size($_POST['diskspace']);
|
||||
}
|
||||
catch(ParsingException $e)
|
||||
{
|
||||
array_add($sErrors, $locale->strings['error-admin-vpses-add-disk']);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$guaranteed_ram = parse_size($_POST['guaranteed']);
|
||||
}
|
||||
catch(ParsingException $e)
|
||||
{
|
||||
array_add($sErrors, $locale->strings['error-admin-vpses-add-guaranteed']);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$burstable_ram = parse_size($_POST['burstable']);
|
||||
}
|
||||
catch(ParsingException $e)
|
||||
{
|
||||
array_add($sErrors, $locale->strings['error-admin-vpses-add-burstable']);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$traffic = parse_size($_POST['traffic']);
|
||||
}
|
||||
catch(ParsingException $e)
|
||||
{
|
||||
array_add($sErrors, $locale->strings['error-admin-vpses-add-traffic']);
|
||||
}
|
||||
|
||||
if(is_numeric($_POST['cpucount']))
|
||||
{
|
||||
$cpu_count = (int) $_POST['cpucount'];
|
||||
}
|
||||
else
|
||||
{
|
||||
array_add($sErrors, $locale->strings['error-admin-vpses-add-cpucount']);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$node = new Node($_POST['node']);
|
||||
}
|
||||
catch(NotFoundException $e)
|
||||
{
|
||||
array_add($sErrors, $locale->strings['error-admin-vpses-add-node']);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$user = new User($_POST['user']);
|
||||
}
|
||||
catch(NotFoundException $e)
|
||||
{
|
||||
array_add($sErrors, $locale->strings['error-admin-vpses-add-user']);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$template = new Template($_POST['template']);
|
||||
}
|
||||
catch(NotFoundException $e)
|
||||
{
|
||||
array_add($sErrors, $locale->strings['error-admin-vpses-add-template']);
|
||||
}
|
||||
|
||||
if(!empty($_POST['hostname']))
|
||||
{
|
||||
if(validate_hostname($_POST['hostname']))
|
||||
{
|
||||
$hostname = $_POST['hostname'];
|
||||
}
|
||||
else
|
||||
{
|
||||
array_add($sErrors, $locale->strings['error-admin-vpses-add-hostname']);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$hostname = random_string(12);
|
||||
}
|
||||
|
||||
if(empty($sErrors))
|
||||
{
|
||||
$sVps = new Vps(0);
|
||||
$sVps->uHostname = $hostname;
|
||||
$sVps->uInternalId = first_unused_ctid();
|
||||
$sVps->uNodeId = $node->sId;
|
||||
$sVps->uTemplateId = $template->sId;
|
||||
$sVps->uUserId = $user->sId;
|
||||
$sVps->uVirtualizationType = CVM_VIRTUALIZATION_OPENVZ;
|
||||
$sVps->uGuaranteedRam = ($guaranteed_ram / 1024 / 1024); /* MB */
|
||||
$sVps->uBurstableRam = ($burstable_ram / 1024 / 1024); /* MB */
|
||||
$sVps->uDiskSpace = ($disk_space / 1024 / 1024); /* MB */
|
||||
$sVps->uCpuCount = $cpu_count;
|
||||
$sVps->uStatus = CVM_STATUS_BLANK;
|
||||
$sVps->uIncomingTrafficLimit = $traffic;
|
||||
$sVps->uOutgoingTrafficLimit = $traffic;
|
||||
$sVps->uTotalTrafficLimit = $traffic;
|
||||
$sVps->InsertIntoDatabase();
|
||||
$sVps->Deploy();
|
||||
|
||||
/* TODO: Flash message. */
|
||||
|
||||
redirect("/admin/node/{$node->sId}/");
|
||||
}
|
||||
}
|
||||
|
||||
/* This is a bit hacky - there's no better method for this yet. If the node or user has to be
|
||||
* pre-determined (according to the requested URL), it is stored in the relevant POST variable
|
||||
* so that the templater will think it was an already selected option, thereby causing the
|
||||
* desired behaviour: pre-selecting the particular option. */
|
||||
|
||||
if(!empty($router->uVariables['prefilled_node']))
|
||||
{
|
||||
$_POST['node'] = $router->uParameters[1];
|
||||
}
|
||||
|
||||
if(!empty($router->uVariables['prefilled_user']))
|
||||
{
|
||||
$_POST['user'] = $router->uParameters[1];
|
||||
}
|
||||
|
||||
$result = $database->CachedQuery("SELECT * FROM nodes");
|
||||
|
||||
$sNodes = array();
|
||||
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sNode = new Node($row);
|
||||
|
||||
$sNodes[] = array(
|
||||
'id' => $sNode->sId,
|
||||
'name' => $sNode->sName,
|
||||
'location' => $sNode->sPhysicalLocation
|
||||
);
|
||||
}
|
||||
|
||||
$sTemplates = array();
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM templates WHERE `Available` = 1"))
|
||||
{
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sTemplate = new Template($row);
|
||||
|
||||
$sTemplates[] = array(
|
||||
'id' => $sTemplate->sId,
|
||||
'name' => $sTemplate->sName
|
||||
);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: Show an error when no templates are available. */
|
||||
}
|
||||
|
||||
$result = $database->CachedQuery("SELECT * FROM users WHERE `AccessLevel` > 0");
|
||||
|
||||
$sUsers = array();
|
||||
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sUserOption = new User($row);
|
||||
|
||||
$sUsers[] = array(
|
||||
'id' => $sUserOption->sId,
|
||||
'username' => $sUserOption->sUsername
|
||||
);
|
||||
}
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/vps/add", $locale->strings, array(
|
||||
'errors' => $sErrors,
|
||||
'nodes' => $sNodes,
|
||||
'users' => $sUsers,
|
||||
'templates' => $sTemplates
|
||||
));
|
@ -1,51 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$sVpsList = array();
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM containers"))
|
||||
{
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sVps = new Vps($row);
|
||||
|
||||
try
|
||||
{
|
||||
$sStatus = $sVps->sStatusText;
|
||||
}
|
||||
catch (SshException $e)
|
||||
{
|
||||
$sStatus = "unknown";
|
||||
}
|
||||
|
||||
$sVpsList[] = array(
|
||||
'id' => $sVps->sId,
|
||||
'hostname' => $sVps->sHostname,
|
||||
'node' => $sVps->sNode->sName,
|
||||
'node-hostname' => $sVps->sNode->sHostname,
|
||||
'template' => $sVps->sTemplate->sName,
|
||||
'diskspace' => number_format($sVps->sDiskSpace / 1024),
|
||||
'diskspace-unit' => "GB",
|
||||
'guaranteed-ram' => $sVps->sGuaranteedRam,
|
||||
'guaranteed-ram-unit' => "MB",
|
||||
'status' => $sStatus,
|
||||
'virtualization-type' => $sVps->sVirtualizationType
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/vps/list", $locale->strings, array(
|
||||
'vpses' => $sVpsList
|
||||
));
|
@ -1,75 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
try
|
||||
{
|
||||
$sUser->RequireAccessLevel(20);
|
||||
|
||||
$sVps = new Vps($router->uParameters[1]);
|
||||
|
||||
if(isset($_POST['submit']))
|
||||
{
|
||||
if($_POST['action'] == "suspend")
|
||||
{
|
||||
$sVps->Suspend();
|
||||
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/success", $locale->strings, array(
|
||||
'title' => $locale->strings['error-suspend-success-title'],
|
||||
'message' => $locale->strings['error-suspend-success-text']
|
||||
));
|
||||
}
|
||||
elseif($_POST['action'] == "unsuspend")
|
||||
{
|
||||
$sVps->Unsuspend();
|
||||
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/success", $locale->strings, array(
|
||||
'title' => $locale->strings['error-unsuspend-success-title'],
|
||||
'message' => $locale->strings['error-unsuspend-success-text']
|
||||
));
|
||||
}
|
||||
|
||||
$sVps->RefreshData();
|
||||
|
||||
/* TODO: Flash message and redirect to VPS lookup page. */
|
||||
}
|
||||
|
||||
$sSuspended = ($sVps->sStatus == CVM_STATUS_SUSPENDED) ? true : false;
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/vps/suspend", $locale->strings, array(
|
||||
'id' => $sVps->sId,
|
||||
'suspended' => $sSuspended
|
||||
));
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-notfound-title'],
|
||||
'message' => $locale->strings['error-notfound-text']
|
||||
));
|
||||
}
|
||||
catch (VpsSuspendException $e)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-suspend-error-title'],
|
||||
'message' => $locale->strings['error-suspend-error-text']
|
||||
));
|
||||
}
|
||||
catch (VpsUnsuspendException $e)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-unsuspend-error-title'],
|
||||
'message' => $locale->strings['error-unsuspend-error-text']
|
||||
));
|
||||
}
|
@ -1,77 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
try
|
||||
{
|
||||
$sUser->RequireAccessLevel(30);
|
||||
|
||||
$sVps = new Vps($router->uParameters[1]);
|
||||
|
||||
if(isset($_POST['submit']))
|
||||
{
|
||||
if($_POST['action'] == "terminate")
|
||||
{
|
||||
$sVps->Terminate();
|
||||
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/success", $locale->strings, array(
|
||||
'title' => $locale->strings['error-terminate-success-title'],
|
||||
'message' => $locale->strings['error-terminate-success-text']
|
||||
));
|
||||
}
|
||||
elseif($_POST['action'] == "unterminate")
|
||||
{
|
||||
$sVps->Unterminate();
|
||||
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/success", $locale->strings, array(
|
||||
'title' => $locale->strings['error-unterminate-success-title'],
|
||||
'message' => $locale->strings['error-unterminate-success-text']
|
||||
));
|
||||
}
|
||||
|
||||
$sVps->RefreshData();
|
||||
|
||||
/* TODO: Flash message and redirect to VPS lookup page. */
|
||||
}
|
||||
|
||||
$sTerminated = ($sVps->sStatus == CVM_STATUS_TERMINATED) ? true : false;
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/admin/vps/terminate", $locale->strings, array(
|
||||
'id' => $sVps->sId,
|
||||
'terminated' => $sTerminated,
|
||||
'can-unterminate' => !$sVps->IsTerminated
|
||||
));
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-notfound-title'],
|
||||
'message' => $locale->strings['error-notfound-text']
|
||||
));
|
||||
}
|
||||
catch (VpsTerminateException $e)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-terminate-error-title'],
|
||||
'message' => $locale->strings['error-terminate-error-text']
|
||||
));
|
||||
}
|
||||
catch (VpsUnterminateException $e)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-unterminate-error-title'],
|
||||
'message' => $locale->strings['error-unterminate-error-text']
|
||||
));
|
||||
}
|
||||
|
@ -1,66 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM containers WHERE `UserId` = :UserId", array(':UserId' => $sApiKey->sUser->sId)))
|
||||
{
|
||||
$sVpses = array();
|
||||
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sVps = new Vps($row);
|
||||
|
||||
$sVpsData = array(
|
||||
'id' => $sVps->sId,
|
||||
'virtualization_type' => $sVps->sVirtualizationType,
|
||||
'hostname' => $sVps->sHostname,
|
||||
'guaranteed_ram' => $sVps->sGuaranteedRam,
|
||||
'burstable_ram' => $sVps->sBurstableRam,
|
||||
'disk_space' => $sVps->sDiskSpace,
|
||||
'cpu_count' => $sVps->sCpuCount,
|
||||
'node' => $sVps->sNodeId
|
||||
);
|
||||
|
||||
if($sVps->sTotalTrafficLimit == 0)
|
||||
{
|
||||
/* Split traffic accounting */
|
||||
$sVpsData['traffic_in_limit'] = $sVps->sIncomingTrafficLimit;
|
||||
$sVpsData['traffic_out_limit'] = $sVps->sOutgoingTrafficLimit;
|
||||
$sVpsData['traffic_in_used'] = $sVps->sIncomingTrafficUsed;
|
||||
$sVpsData['traffic_out_used'] = $sVps->sOutgoingTrafficUsed;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Combined traffic accounting */
|
||||
$sVpsData['traffic_limit'] = $sVps->sTotalTrafficLimit;
|
||||
$sVpsData['traffic_used'] = $sVps->sIncomingTrafficUsed + $sVps->sOutgoingTrafficUsed;
|
||||
}
|
||||
|
||||
$sVpses[] = $sVpsData;
|
||||
}
|
||||
|
||||
$sResponse = array(
|
||||
'response' => array(
|
||||
'vpses' => $sVpses
|
||||
)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResponse = array(
|
||||
'response' => array(
|
||||
'vpses' => array()
|
||||
)
|
||||
);
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
$sVps->Stop();
|
||||
}
|
||||
catch(VpsStopException $e)
|
||||
{
|
||||
// we can make this silently fail, as the only important thing is that it starts again
|
||||
}
|
||||
|
||||
$sVps->Start();
|
||||
$sVps->sCurrentStatus = CVM_STATUS_STARTED;
|
||||
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/success", $locale->strings, array(
|
||||
'title' => $locale->strings['error-stop-restart-success'],
|
||||
'message' => $locale->strings['error-stop-restart-success']
|
||||
));
|
||||
}
|
||||
catch (VpsSuspendedException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-restart-suspended-title'],
|
||||
'message' => $locale->strings['error-restart-suspended-text']
|
||||
));
|
||||
}
|
||||
catch (VpsTerminatedException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-restart-terminated-title'],
|
||||
'message' => $locale->strings['error-restart-terminated-text']
|
||||
));
|
||||
}
|
||||
catch(VpsStartException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-restart-start-title'],
|
||||
'message' => $locale->strings['error-restart-start-text']
|
||||
));
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
if($sVps->sCurrentStatus != CVM_STATUS_STARTED)
|
||||
{
|
||||
try
|
||||
{
|
||||
$sVps->Start();
|
||||
$sVps->sCurrentStatus = CVM_STATUS_STARTED;
|
||||
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/success", $locale->strings, array(
|
||||
'title' => $locale->strings['error-start-success-title'],
|
||||
'message' => $locale->strings['error-start-success-text']
|
||||
));
|
||||
}
|
||||
catch (VpsSuspendedException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-start-suspended-title'],
|
||||
'message' => $locale->strings['error-start-suspended-text']
|
||||
));
|
||||
}
|
||||
catch (VpsTerminatedException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-start-terminated-title'],
|
||||
'message' => $locale->strings['error-start-terminated-text']
|
||||
));
|
||||
}
|
||||
catch (VpsStartException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-start-failed-title'],
|
||||
'message' => $locale->strings['error-start-failed-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-start-running-title'],
|
||||
'message' => $locale->strings['error-start-running-text']
|
||||
));
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
if($sVps->sCurrentStatus != CVM_STATUS_STOPPED)
|
||||
{
|
||||
try
|
||||
{
|
||||
$sVps->Stop();
|
||||
$sVps->sCurrentStatus = CVM_STATUS_STOPPED;
|
||||
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/success", $locale->strings, array(
|
||||
'title' => $locale->strings['error-stop-success-title'],
|
||||
'message' => $locale->strings['error-stop-success-text']
|
||||
));
|
||||
}
|
||||
catch (VpsSuspendedException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-stop-suspended-title'],
|
||||
'message' => $locale->strings['error-stop-suspended-text']
|
||||
));
|
||||
}
|
||||
catch (VpsTerminatedException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-stop-terminated-title'],
|
||||
'message' => $locale->strings['error-stop-terminated-text']
|
||||
));
|
||||
}
|
||||
catch(VpsStopException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-stop-failed-title'],
|
||||
'message' => $locale->strings['error-stop-failed-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-stop-stopped-title'],
|
||||
'message' => $locale->strings['error-stop-stopped-text']
|
||||
));
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/client/vps/console", $locale->strings, array(
|
||||
'host' => htmlspecialchars($_SERVER['SERVER_NAME']),
|
||||
'port' => 22,
|
||||
'username' => "vzshell",
|
||||
'password' => "vzshell"
|
||||
));
|
@ -1,58 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
if($sLoggedIn === true)
|
||||
{
|
||||
$sVpsList = array();
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM containers WHERE `UserId` = :UserId", array(":UserId" => $sUser->sId)))
|
||||
{
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sVps = new Vps($row);
|
||||
|
||||
try
|
||||
{
|
||||
$sStatus = $sVps->sStatusText;
|
||||
}
|
||||
catch (SshException $e)
|
||||
{
|
||||
$sStatus = "unknown";
|
||||
}
|
||||
|
||||
$sVpsList[] = array(
|
||||
'id' => $sVps->sId,
|
||||
'hostname' => $sVps->sHostname,
|
||||
'node' => $sVps->sNode->sName,
|
||||
'node-hostname' => $sVps->sNode->sHostname,
|
||||
'template' => $sVps->sTemplate->sName,
|
||||
'diskspace' => number_format($sVps->sDiskSpace / 1024),
|
||||
'diskspace-unit' => "GB",
|
||||
'guaranteed-ram' => $sVps->sGuaranteedRam,
|
||||
'guaranteed-ram-unit' => "MB",
|
||||
'status' => $sStatus,
|
||||
'virtualization-type' => $sVps->sVirtualizationType
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$sMainContents = NewTemplater::Render("{$sTheme}/client/vps/list", $locale->strings, array(
|
||||
'vpses' => $sVpsList
|
||||
));
|
||||
}
|
||||
else
|
||||
{
|
||||
redirect("/login");
|
||||
}
|
@ -1,121 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
if(!empty($router->uVariables['action']))
|
||||
{
|
||||
if($router->uVariables['action'] == "start")
|
||||
{
|
||||
require("modules/client/vps/action/start.php");
|
||||
}
|
||||
elseif($router->uVariables['action'] == "stop")
|
||||
{
|
||||
require("modules/client/vps/action/stop.php");
|
||||
}
|
||||
elseif($router->uVariables['action'] == "restart")
|
||||
{
|
||||
require("modules/client/vps/action/restart.php");
|
||||
}
|
||||
}
|
||||
|
||||
if($sVps->sTotalTrafficLimit != 0)
|
||||
{
|
||||
$sTrafficLimit = $sVps->sTotalTrafficLimit;
|
||||
$sTrafficSplit = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
$sTrafficLimit = $sVps->sIncomingTrafficLimit + $sVps->sOutgoingTrafficLimit;
|
||||
$sTrafficSplit = true;
|
||||
}
|
||||
|
||||
$sVariables = array(
|
||||
'id' => $sVps->sId,
|
||||
'server-location' => $sVps->sNode->sPhysicalLocation,
|
||||
'operating-system' => $sVps->sTemplate->sName,
|
||||
'guaranteed-ram' => "{$sVps->sGuaranteedRam}MB",
|
||||
'burstable-ram' => "{$sVps->sBurstableRam}MB",
|
||||
'disk-space' => "{$sVps->sDiskSpace}MB",
|
||||
'total-traffic-limit' => format_size($sVps->sTotalTrafficLimit, 1024, true, 0) . "B",
|
||||
'incoming-traffic-limit'=> format_size($sVps->sIncomingTrafficLimit, 1024, true, 0) . "B",
|
||||
'outgoing-traffic-limit'=> format_size($sVps->sOutgoingTrafficLimit, 1024, true, 0) . "B",
|
||||
'bandwidth-limit' => "100mbit",
|
||||
'status' => $sVps->sStatusText,
|
||||
'traffic-split' => $sTrafficSplit
|
||||
);
|
||||
|
||||
if($sTrafficSplit == true)
|
||||
{
|
||||
$sVariables = array_merge($sVariables, array(
|
||||
'inbound-used' => number_format(($sVps->sIncomingTrafficUsed) / 1024 / 1024 / 1024, 2),
|
||||
'inbound-total' => number_format($sIncomingTrafficLimit / 1024 / 1024 / 1024, 0),
|
||||
'inbound-percentage' => number_format(($sVps->sIncomingTrafficUsed) / $sTrafficLimit, 2),
|
||||
'inbound-unit' => "GB",
|
||||
'outbound-used' => number_format(($sVps->sOutgoingTrafficUsed) / 1024 / 1024 / 1024, 2),
|
||||
'outbound-total' => number_format($sOutgoingTrafficLimit / 1024 / 1024 / 1024, 0),
|
||||
'outbound-percentage' => number_format(($sVps->sOutgoingTrafficUsed) / $sTrafficLimit, 2),
|
||||
'outbound-unit' => "GB"
|
||||
));
|
||||
}
|
||||
else
|
||||
{
|
||||
$sVariables = array_merge($sVariables, array(
|
||||
'traffic-used' => number_format(($sVps->sIncomingTrafficUsed + $sVps->sOutgoingTrafficUsed) / 1024 / 1024 / 1024, 2),
|
||||
'traffic-total' => number_format($sTrafficLimit / 1024 / 1024 / 1024, 0),
|
||||
'traffic-percentage' => number_format(($sVps->sIncomingTrafficUsed + $sVps->sOutgoingTrafficUsed) / $sTrafficLimit, 2),
|
||||
'traffic-unit' => "GB"
|
||||
));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$sVariables = array_merge($sVariables, array(
|
||||
'disk-used' => number_format($sVps->sDiskUsed / 1024, 2),
|
||||
'disk-total' => number_format($sVps->sDiskTotal / 1024, 2),
|
||||
'disk-percentage' => ($sVps->sDiskTotal == 0) ? 0 : number_format(($sVps->sDiskUsed / $sVps->sDiskTotal) * 100, 2),
|
||||
'disk-unit' => "GB"
|
||||
));
|
||||
}
|
||||
catch (SshExitException $e)
|
||||
{
|
||||
$sVariables = array_merge($sVariables, array(
|
||||
'disk-used' => 0,
|
||||
'disk-total' => 0,
|
||||
'disk-percentage' => 0,
|
||||
'disk-unit' => "GB"
|
||||
));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$sVariables = array_merge($sVariables, array(
|
||||
'ram-used' => $sVps->sRamUsed,
|
||||
'ram-total' => $sVps->sRamTotal,
|
||||
'ram-percentage' => ($sVps->sRamTotal == 0) ? 0 : number_format(($sVps->sRamUsed / $sVps->sRamTotal) * 100, 2),
|
||||
'ram-unit' => "MB"
|
||||
));
|
||||
}
|
||||
catch (SshExitException $e)
|
||||
{
|
||||
$sVariables = array_merge($sVariables, array(
|
||||
'ram-used' => 0,
|
||||
'ram-total' => 0,
|
||||
'ram-percentage' => 0,
|
||||
'ram-unit' => "MB"
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
$sPageContents = NewTemplater::Render("{$sTheme}/client/vps/lookup", $locale->strings, $sVariables);
|
||||
|
@ -1,82 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$display_form = true;
|
||||
|
||||
if(isset($_POST['submit']))
|
||||
{
|
||||
try
|
||||
{
|
||||
if(!empty($_POST['password']) && !empty($_POST['confirm']))
|
||||
{
|
||||
if($_POST['password'] == $_POST['confirm'])
|
||||
{
|
||||
$sVps->SetRootPassword($_POST['password']);
|
||||
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/success", $locale->strings, array(
|
||||
'title' => $locale->strings['error-password-success-title'],
|
||||
'message' => $locale->strings['error-password-success-text']
|
||||
));
|
||||
}
|
||||
else
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-password-nomatch-title'],
|
||||
'message' => $locale->strings['error-password-nomatch-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-password-missing-title'],
|
||||
'message' => $locale->strings['error-password-missing-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
catch (VpsSuspendedException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-password-suspended-title'],
|
||||
'message' => $locale->strings['error-password-suspended-text']
|
||||
));
|
||||
}
|
||||
catch (VpsTerminatedException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-password-terminated-title'],
|
||||
'message' => $locale->strings['error-password-terminated-text']
|
||||
));
|
||||
}
|
||||
catch (SshExitException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-password-invalid-title'],
|
||||
'message' => $locale->strings['error-password-invalid-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
if($display_form === true)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/warning", $locale->strings, array(
|
||||
'title' => $locale->strings['warning-password-title'],
|
||||
'message' => $locale->strings['warning-password-text']
|
||||
));
|
||||
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/client/vps/password", $locale->strings, array(
|
||||
'id' => $sVps->sId
|
||||
));
|
||||
}
|
@ -1,119 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
$display_form = true;
|
||||
|
||||
if(isset($_POST['submit']))
|
||||
{
|
||||
if(!empty($_POST['template']))
|
||||
{
|
||||
try
|
||||
{
|
||||
$sVps->CheckAllowed();
|
||||
$sTemplate = new Template($_POST['template']);
|
||||
$sTemplate->CheckAvailable();
|
||||
|
||||
if(isset($_POST['confirm']))
|
||||
{
|
||||
$sVps->uTemplateId = $sTemplate->sId;
|
||||
$sVps->InsertIntoDatabase();
|
||||
$sVps->Reinstall();
|
||||
$sVps->Start();
|
||||
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/success", $locale->strings, array(
|
||||
'title' => $locale->strings['error-reinstall-success-title'],
|
||||
'message' => $locale->strings['error-reinstall-success-text']
|
||||
));
|
||||
}
|
||||
else
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-reinstall-confirm-title'],
|
||||
'message' => $locale->strings['error-reinstall-confirm-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
catch (NotFoundException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-reinstall-notfound-title'],
|
||||
'message' => $locale->strings['error-reinstall-notfound-text']
|
||||
));
|
||||
}
|
||||
catch (TemplateUnavailableException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-reinstall-unavailable-title'],
|
||||
'message' => $locale->strings['error-reinstall-unavailable-text']
|
||||
));
|
||||
}
|
||||
catch (VpsReinstallException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-reinstall-failed-title'],
|
||||
'message' => $locale->strings['error-reinstall-failed-text']
|
||||
));
|
||||
}
|
||||
catch (VpsStartException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-reinstall-start-title'],
|
||||
'message' => $locale->strings['error-reinstall-start-text']
|
||||
));
|
||||
}
|
||||
catch (VpsSuspendedException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-reinstall-suspended-title'],
|
||||
'message' => $locale->strings['error-reinstall-suspended-text']
|
||||
));
|
||||
}
|
||||
catch (VpsTerminatedException $e)
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-reinstall-terminated-title'],
|
||||
'message' => $locale->strings['error-reinstall-terminated-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-reinstall-notselected-title'],
|
||||
'message' => $locale->strings['error-reinstall-notselected-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
if($display_form === true)
|
||||
{
|
||||
$result = $database->CachedQuery("SELECT * FROM templates WHERE `Available` = '1'");
|
||||
|
||||
$sTemplateList = array();
|
||||
|
||||
foreach($result->data as $row)
|
||||
{
|
||||
$sTemplate = new Template($row);
|
||||
$sTemplateList[] = array(
|
||||
'id' => $sTemplate->sId,
|
||||
'name' => $sTemplate->sName,
|
||||
'description' => $sTemplate->sDescription
|
||||
);
|
||||
}
|
||||
|
||||
$sPageContents .= NewTemplater::Render("{$sTheme}/client/vps/reinstall", $locale->strings, array(
|
||||
'templates' => $sTemplateList
|
||||
));
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
throw new UnauthorizedException("You are not allowed to access this page.");
|
@ -1,2 +0,0 @@
|
||||
<?php
|
||||
/* Empty */
|
@ -1,59 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
if($sLoggedIn === true)
|
||||
{
|
||||
// TODO: alert the user that he will switch to a different account, or disable if it is not allowed to have multiple accounts
|
||||
}
|
||||
|
||||
$sError = "";
|
||||
$sFieldUsername = "";
|
||||
$render_form = true;
|
||||
|
||||
if(isset($_POST['submit']))
|
||||
{
|
||||
$sFieldUsername = htmlentities($_POST['username']);
|
||||
|
||||
if($result = $database->CachedQuery("SELECT * FROM users WHERE `Username` = :Username", array(":Username" => $_POST['username'])))
|
||||
{
|
||||
$sLoginUser = new User($result);
|
||||
|
||||
if($sLoginUser->VerifyPassword($_POST['password']))
|
||||
{
|
||||
$_SESSION['userid'] = $sLoginUser->sId;
|
||||
header("Location: /");
|
||||
die();
|
||||
}
|
||||
else
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-login-invalid-title'],
|
||||
'message' => $locale->strings['error-login-invalid-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-login-invalid-title'],
|
||||
'message' => $locale->strings['error-login-invalid-text']
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
$sMainContents = NewTemplater::Render("{$sTheme}/shared/login", $locale->strings, array(
|
||||
'error' => $sError,
|
||||
'field-username' => $sFieldUsername
|
||||
));
|
@ -1,33 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
if(!isset($_APP)) { die("Unauthorized."); }
|
||||
|
||||
if($sLoggedIn === true)
|
||||
{
|
||||
unset($_SESSION['userid']);
|
||||
$sUser = new User(0);
|
||||
$sLoggedIn = false;
|
||||
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/success", $locale->strings, array(
|
||||
'title' => $locale->strings['error-logout-success-title'],
|
||||
'message' => $locale->strings['error-logout-success-text']
|
||||
));
|
||||
}
|
||||
else
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-logout-notloggedin-title'],
|
||||
'message' => $locale->strings['error-logout-notloggedin-text']
|
||||
));
|
||||
}
|
@ -1,83 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
function test_iprange($input, $desired_start, $desired_end, $desired_size, $desired_type)
|
||||
{
|
||||
try
|
||||
{
|
||||
$obj = new IpRange($input);
|
||||
|
||||
if($obj->sStart != $desired_start)
|
||||
{
|
||||
echo("IpRange unit test failed due to sStart mismatch. Expected: {$desired_start} Actual: {$obj->sStart}<br>");
|
||||
}
|
||||
|
||||
if($obj->sEnd != $desired_end)
|
||||
{
|
||||
echo("IpRange unit test failed due to sEnd mismatch. Expected: {$desired_end} Actual: {$obj->sEnd}<br>");
|
||||
}
|
||||
|
||||
if($obj->sSize != $desired_size)
|
||||
{
|
||||
echo("IpRange unit test failed due to sSize mismatch. Expected: {$desired_size} Actual: {$obj->sSize}<br>");
|
||||
}
|
||||
|
||||
if($obj->sType != $desired_type)
|
||||
{
|
||||
echo("IpRange unit test failed due to sType mismatch. Expected: {$desired_type} Actual: {$obj->sType}<br>");
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
echo("IpRange unit test failed due to exception! Input: {$input} Error message: " . $e->getMessage() . "<br>");
|
||||
}
|
||||
}
|
||||
|
||||
test_iprange("fe80:0000:0000:0000:e0d3:f0ff:fe28:5f47/64", "fe80:0:0:0:0:0:0:0", "fe80:0:0:0:ffff:ffff:ffff:ffff", 64, 6);
|
||||
test_iprange("fe80:0000:0000:0000:e0d3:f0ff:fe28:5f47", "fe80:0000:0000:0000:e0d3:f0ff:fe28:5f47", "fe80:0000:0000:0000:e0d3:f0ff:fe28:5f47", 0, 6);
|
||||
test_iprange("0.0.0.0/1", "0.0.0.0", "127.255.255.255", 1, 4);
|
||||
test_iprange("162.16.47.0/16", "162.16.0.0", "162.16.255.255", 16, 4);
|
||||
test_iprange("192.168.1.0/27", "192.168.1.0", "192.168.1.31", 27, 4);
|
||||
test_iprange("192.168.1.0/32", "192.168.1.0", "192.168.1.0", 32, 4);
|
||||
test_iprange("192.168.1.0", "192.168.1.0", "192.168.1.0", 0, 4);
|
||||
|
||||
$sVps = new Vps(0);
|
||||
$sVps->uHostname = "test6.cryto.net";
|
||||
$sVps->uInternalId = "110";
|
||||
$sVps->uNodeId = 2;
|
||||
$sVps->uTemplateId = 1;
|
||||
$sVps->uUserId = 1;
|
||||
$sVps->uVirtualizationType = CVM_VIRTUALIZATION_OPENVZ;
|
||||
$sVps->uGuaranteedRam = 256;
|
||||
$sVps->uBurstableRam = 384;
|
||||
$sVps->uDiskSpace = 6000;
|
||||
$sVps->uCpuCount = 1;
|
||||
$sVps->uStatus = CVM_STATUS_BLANK;
|
||||
$sVps->uIncomingTrafficLimit = 500000000000;
|
||||
$sVps->uOutgoingTrafficLimit = 500000000000;
|
||||
$sVps->uTotalTrafficLimit = 1000000000000;
|
||||
$sVps->InsertIntoDatabase();
|
||||
|
||||
$sVps->Deploy();
|
||||
*/
|
||||
/*
|
||||
var_dump(
|
||||
parse_size("15m"), parse_size("24 KB"), parse_size("51"),
|
||||
parse_size("2 TiB"), parse_size("4.9GiB"), parse_size("0.75GB"),
|
||||
parse_size("20gb", 1000), parse_size("14.6 TiB", 1000), parse_size("84YB")
|
||||
);
|
||||
*/
|
||||
/*
|
||||
var_dump(first_unused_ctid());
|
||||
*/
|
||||
|
||||
//var_dump(format_size(900), format_size(900000), format_size(900000000), format_size(900000000000), format_size(900000000000000), format_size(9000000000000000));
|
||||
|
||||
$sKey = new ApiKey(0);
|
||||
$sKey->GenerateSalt();
|
||||
$sKey->uPublicToken = random_string(32);
|
||||
$new_token = random_string(32);
|
||||
echo($new_token);
|
||||
$sKey->SetPrivateToken($new_token);
|
||||
$sKey->uUserId = 1;
|
||||
$sKey->InsertIntoDatabase();
|
@ -1,314 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* CVM is more free software. It is licensed under the WTFPL, which
|
||||
* allows you to do pretty much anything with it, without having to
|
||||
* ask permission. Commercial use is allowed, and no attribution is
|
||||
* required. We do politely request that you share your modifications
|
||||
* to benefit other developers, but you are under no enforced
|
||||
* obligation to do so :)
|
||||
*
|
||||
* Please read the accompanying LICENSE document for the full WTFPL
|
||||
* licensing text.
|
||||
*/
|
||||
|
||||
$timing_start = microtime(true);
|
||||
|
||||
$_APP = true;
|
||||
require("includes/include.base.php");
|
||||
|
||||
$sTheme = $cphp_config->theme;
|
||||
|
||||
$sTemplateParameters = array();
|
||||
|
||||
if(!empty($_SESSION['userid']))
|
||||
{
|
||||
$sUser = new User($_SESSION['userid']);
|
||||
$sLoggedIn = true;
|
||||
$template_global_vars['accesslevel'] = $sUser->sAccessLevel;
|
||||
$sTemplateParameters = array_merge($sTemplateParameters, array(
|
||||
'username' => $sUser->sUsername
|
||||
));
|
||||
}
|
||||
else
|
||||
{
|
||||
$sUser = new User(0);
|
||||
$sLoggedIn = false;
|
||||
$template_global_vars['accesslevel'] = 0;
|
||||
}
|
||||
|
||||
$sMainContents = "";
|
||||
$sMainClass = "";
|
||||
$sPageTitle = "";
|
||||
$sResponse = array();
|
||||
$sResponseCode = 200;
|
||||
|
||||
/* Initialize some variables to ensure that they are available throughout the application.
|
||||
* Due to the way PHP variable scoping works (and the way CPHP works around this), variables
|
||||
* are only available at the end of rewrite.php if they were set *before* routing the request. */
|
||||
$sVps = null;
|
||||
$sPageContents = "";
|
||||
$router = null;
|
||||
$sError = null;
|
||||
|
||||
try
|
||||
{
|
||||
$router = new CPHPRouter();
|
||||
|
||||
$router->ignore_query = true;
|
||||
|
||||
$router->routes = array(
|
||||
0 => array(
|
||||
'^/?$' => "modules/client/vps/list.php",
|
||||
'^/list/?$' => "modules/client/vps/list.php",
|
||||
'^/account/?$' => "modules/client/account/index.php",
|
||||
'^/login/?$' => "modules/shared/login.php",
|
||||
'^/logout/?$' => "modules/shared/logout.php",
|
||||
/* Frontpage/overview */
|
||||
'^/([0-9]+)/?$' => array(
|
||||
'target' => "modules/client/vps/lookup.php",
|
||||
'authenticator' => "authenticators/vps.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "vps"
|
||||
),
|
||||
/* VPS - Start */
|
||||
'^/([0-9]+)/start/?$' => array(
|
||||
'target' => "modules/client/vps/lookup.php",
|
||||
'authenticator' => "authenticators/vps.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "vps",
|
||||
'_action' => "start"
|
||||
),
|
||||
/* VPS - Stop */
|
||||
'^/([0-9]+)/stop/?$' => array(
|
||||
'target' => "modules/client/vps/lookup.php",
|
||||
'authenticator' => "authenticators/vps.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "vps",
|
||||
'_action' => "stop"
|
||||
),
|
||||
/* VPS - Restart */
|
||||
'^/([0-9]+)/restart/?$' => array(
|
||||
'target' => "modules/client/vps/lookup.php",
|
||||
'authenticator' => "authenticators/vps.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "vps",
|
||||
'_action' => "restart"
|
||||
),
|
||||
/* VPS - Reinstall */
|
||||
'^/([0-9]+)/reinstall/?$' => array(
|
||||
'target' => "modules/client/vps/reinstall.php",
|
||||
'authenticator' => "authenticators/vps.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "vps"
|
||||
),
|
||||
/* VPS - Change password */
|
||||
'^/([0-9]+)/password/?$' => array(
|
||||
'target' => "modules/client/vps/password.php",
|
||||
'authenticator' => "authenticators/vps.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "vps"
|
||||
),
|
||||
/* VPS - Console */
|
||||
'^/([0-9]+)/console/?$' => array(
|
||||
'target' => "modules/client/vps/console.php",
|
||||
'authenticator' => "authenticators/vps.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "vps"
|
||||
),
|
||||
/* Admin - Overview */
|
||||
'^/admin/?$' => array(
|
||||
'target' => "modules/admin/overview/index.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Users - Overview */
|
||||
'^/admin/users/?$' => array(
|
||||
'target' => "modules/admin/user/list.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Users - Lookup */
|
||||
'^/admin/user/([0-9]+)/?$' => array(
|
||||
'target' => "modules/admin/user/lookup.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Users - Edit */
|
||||
'^/admin/user/([0-9]+)/edit/?$' => array(
|
||||
'target' => "modules/admin/user/edit.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Users - Create VPS */
|
||||
'^/admin/user/([0-9]+)/add/?$' => array(
|
||||
'target' => "modules/admin/vps/create.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin",
|
||||
'_prefilled_user' => true
|
||||
),
|
||||
/* Admin - VPSes - Overview */
|
||||
'^/admin/vpses/?$' => array(
|
||||
'target' => "modules/admin/vps/list.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - VPSes - Create VPS */
|
||||
'^/admin/vpses/add/?$' => array(
|
||||
'target' => "modules/admin/vps/create.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - VPSes - Suspend */
|
||||
'^/admin/vps/([0-9]+)/suspend/?$' => array(
|
||||
'target' => "modules/admin/vps/suspend.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - VPSes - Transfer */
|
||||
'^/admin/vps/([0-9]+)/transfer/?$' => array(
|
||||
'target' => "modules/admin/vps/transfer.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - VPSes - Terminate */
|
||||
'^/admin/vps/([0-9]+)/terminate/?$' => array(
|
||||
'target' => "modules/admin/vps/terminate.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Templates - Overview */
|
||||
'^/admin/templates/?$' => array(
|
||||
'target' => "modules/admin/template/list.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Templates - Lookup */
|
||||
'^/admin/templates/([0-9]+)/?$' => array(
|
||||
'target' => "modules/admin/template/lookup.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Templates - Add */
|
||||
'^/admin/templates/add/?$' => array(
|
||||
'target' => "modules/admin/template/add.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Nodes - Overview */
|
||||
'^/admin/nodes/?$' => array(
|
||||
'target' => "modules/admin/node/list.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Nodes - Lookup */
|
||||
'^/admin/node/([0-9]+)/?$' => array(
|
||||
'target' => "modules/admin/node/lookup.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Nodes - Add */
|
||||
'^/admin/nodes/add/?$' => array(
|
||||
'target' => "modules/admin/node/add.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin"
|
||||
),
|
||||
/* Admin - Nodes - Create VPS */
|
||||
'^/admin/node/([0-9]+)/add/?$' => array(
|
||||
'target' => "modules/admin/vps/create.php",
|
||||
'authenticator' => "authenticators/admin.php",
|
||||
'auth_error' => "modules/error/access.php",
|
||||
'_menu' => "admin",
|
||||
'_prefilled_node' => true
|
||||
),
|
||||
/* API - Client - List VPSes */
|
||||
'^/api/client/list' => array(
|
||||
'target' => "modules/api/client/vps/list.php",
|
||||
'authenticator' => "authenticators/api/client.php",
|
||||
'auth_error' => "modules/error/api/access.php",
|
||||
'_raw' => true
|
||||
),
|
||||
'^/test/?$' => "modules/test.php"
|
||||
)
|
||||
);
|
||||
|
||||
try
|
||||
{
|
||||
$router->RouteRequest();
|
||||
}
|
||||
catch (VpsSuspendedException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-suspended-title'],
|
||||
'message' => $e->getMessage()
|
||||
));
|
||||
}
|
||||
catch (VpsTerminatedException $e)
|
||||
{
|
||||
$sError .= NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-terminated-title'],
|
||||
'message' => $e->getMessage()
|
||||
));
|
||||
}
|
||||
|
||||
if(empty($router->uVariables['raw']))
|
||||
{
|
||||
if(isset($router->uVariables['menu']) && $router->uVariables['menu'] == "vps" && $router->uVariables['display_menu'] === true)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/client/vps/main", $locale->strings, array(
|
||||
'error' => $sError,
|
||||
'contents' => $sPageContents,
|
||||
'id' => $sVps->sId
|
||||
));
|
||||
}
|
||||
elseif(isset($router->uVariables['menu']) && $router->uVariables['menu'] == "admin" && $router->uVariables['display_menu'] === true)
|
||||
{
|
||||
$sMainContents .= NewTemplater::Render("{$sTheme}/admin/main", $locale->strings, array(
|
||||
'error' => $sError,
|
||||
'contents' => $sPageContents
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (UnauthorizedException $e)
|
||||
{
|
||||
$sPageTitle = $locale->strings['title-unauthorized'];
|
||||
|
||||
$sMainContents = NewTemplater::Render("{$sTheme}/shared/error/error", $locale->strings, array(
|
||||
'title' => $locale->strings['error-unauthorized-title'],
|
||||
'message' => $locale->strings['error-unauthorized-text']
|
||||
));
|
||||
}
|
||||
|
||||
if(empty($router->uVariables['raw']))
|
||||
{
|
||||
$sTemplateParameters = array_merge($sTemplateParameters, array(
|
||||
'logged-in' => $sLoggedIn,
|
||||
'title' => $sPageTitle,
|
||||
'main' => $sMainContents,
|
||||
'menu-visible' => (isset($router->uVariables['menu']) && $router->sAuthenticated === true),
|
||||
'generation' => round(microtime(true) - $timing_start, 6)
|
||||
));
|
||||
|
||||
echo(NewTemplater::Render("{$sTheme}/shared/main", $locale->strings, $sTemplateParameters));
|
||||
}
|
||||
else
|
||||
{
|
||||
status_code($sResponseCode);
|
||||
echo(json_encode($sResponse));
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
<div class="sidebar">
|
||||
<a class="sidebutton" href="/admin/">{%!menu-admin-overview}</a>
|
||||
<a class="sidebutton" href="/admin/nodes/">{%!menu-admin-nodes}</a>
|
||||
<a class="sidebutton" href="/admin/templates/">{%!menu-admin-templates}</a>
|
||||
<a class="sidebutton" href="/admin/users/">{%!menu-admin-users}</a>
|
||||
<a class="sidebutton" href="/admin/vpses/">{%!menu-admin-vpses}</a>
|
||||
</div>
|
||||
|
||||
{%?contents}
|
||||
|
||||
<div class="clear"></div>
|
@ -1,58 +0,0 @@
|
||||
<h2>{%!title-admin-addnode}</h2>
|
||||
|
||||
{%if isempty|errors == false}
|
||||
<div class="errorhandler error-error">
|
||||
<div class="error-title">{%!error-form}</div>
|
||||
<div class="error-message">
|
||||
<ul>
|
||||
{%foreach error in errors}
|
||||
<li>{%?error}</li>
|
||||
{%/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{%/if}
|
||||
|
||||
<form enctype="multipart/form-data" method="post" action="/admin/nodes/add/" class="add dark">
|
||||
<div class="field">
|
||||
<label for="form_addnode_name">{%!addnode-name}</label>
|
||||
{%input type="text" group="addnode" name="name"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addnode_hostname">{%!addnode-hostname}</label>
|
||||
{%input type="text" group="addnode" name="hostname"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addnode_location">{%!addnode-location}</label>
|
||||
{%input type="text" group="addnode" name="location"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addnode_customkey">{%!addnode-customkeypair}</label>
|
||||
{%input type="checkbox" group="addnode" name="customkey" data-enable-group="customkey" class="enabler"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="disabled field" data-disabled-group="customkey">
|
||||
<label for="form_addnode_publickey">{%!addnode-publickey}</label>
|
||||
{%input type="file" group="addnode" name="publickey" disabled="disabled"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="disabled field" data-disabled-group="customkey">
|
||||
<label for="form_addnode_privatekey">{%!addnode-privatekey}</label>
|
||||
{%input type="file" group="addnode" name="privatekey" disabled="disabled"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<div class="filler"></div>
|
||||
<button type="submit" name="submit">{%!button-admin-addnode}</button>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
</form>
|
@ -1,25 +0,0 @@
|
||||
<div class="toolbar">
|
||||
<a href="/admin/nodes/add/">{%!toolbar-addnode}</a>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<h2>{%!title-admin-nodelist}</h2>
|
||||
|
||||
<table class="vpslist">
|
||||
<tr>
|
||||
<th>{%!list-column-hostname}</th>
|
||||
<th>{%!list-column-location}</th>
|
||||
</tr>
|
||||
{%foreach node in nodes}
|
||||
<tr class="clickable" data-url="/admin/node/{%?node[id]}/">
|
||||
<td>
|
||||
<a href="/admin/node/{%?node[id]}/">
|
||||
{%?node[hostname]}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
{%?node[location]}
|
||||
</td>
|
||||
</tr>
|
||||
{%/foreach}
|
||||
</table>
|
@ -1,78 +0,0 @@
|
||||
<div class="toolbar">
|
||||
<a href="/admin/node/{%?id}/add/">{%!toolbar-createvps}</a>
|
||||
<a href="/admin/node/{%?id}/edit/">{%!toolbar-editnode}</a>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<h2>{%!title-admin-nodeinfo}</h2>
|
||||
|
||||
<table class="nodeinfo vertical">
|
||||
<tr>
|
||||
<th>{%!list-column-nodeid}</th>
|
||||
<td>{%?id}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!list-column-hostname}</th>
|
||||
<td>{%?hostname}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!list-column-location}</th>
|
||||
<td>{%?location}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>{%!header-admin-node-vpses}</h3>
|
||||
<table class="vpslist">
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>{%!list-column-hostname}</th>
|
||||
<th>{%!list-column-platform}</th>
|
||||
<th>{%!list-column-disk}</th>
|
||||
<th>{%!list-column-ram}</th>
|
||||
<th>{%!list-column-template}</th>
|
||||
</tr>
|
||||
{%if isset|vpses == true}
|
||||
{%foreach vps in vpses}
|
||||
<tr class="clickable" data-url="/{%?vps[id]}/">
|
||||
<td class="vps-status">
|
||||
{%if vps[status] == running}
|
||||
<img src="/templates/default/static/images/status/online.png" alt="{%!list-status-running}">
|
||||
{%elseif vps[status] == stopped}
|
||||
<img src="/templates/default/static/images/status/offline.png" alt="{%!list-status-stopped}">
|
||||
{%elseif vps[status] == suspended}
|
||||
<img src="/templates/default/static/images/status/suspended.png" alt="{%!list-status-suspended}">
|
||||
{%else}
|
||||
<img src="/templates/default/static/images/status/unknown.png" alt="{%!list-status-unknown}">
|
||||
{%/if}
|
||||
</td>
|
||||
<td>
|
||||
<a href="/{%?vps[id]}/">
|
||||
{%?vps[hostname]}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/{%?vps[id]}/">
|
||||
{%if vps[virtualization-type] == 1}
|
||||
OpenVZ
|
||||
{%/if}{%if vps[virtualization-type] == 2}
|
||||
Xen PV
|
||||
{%/if}{%if vps[virtualization-type] == 3}
|
||||
Xen HVM
|
||||
{%/if}{%if vps[virtualization-type] == 4}
|
||||
KVM
|
||||
{%/if}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
{%?vps[diskspace]}
|
||||
<span class="unit">{%?vps[diskspace-unit]}</span>
|
||||
</td>
|
||||
<td>
|
||||
{%?vps[guaranteed-ram]}
|
||||
<span class="unit">{%?vps[guaranteed-ram-unit]}</span>
|
||||
</td>
|
||||
<td>{%?vps[template]}</td>
|
||||
</tr>
|
||||
{%/foreach}
|
||||
{%/if}
|
||||
</table>
|
@ -1,3 +0,0 @@
|
||||
<h2>{%!title-admin-overview}</h2>
|
||||
|
||||
<p>{%!admin-overview-message}</p>
|
@ -1,26 +0,0 @@
|
||||
<h2>Add templates</h2>
|
||||
|
||||
{%if isempty|templates == true}
|
||||
<p>
|
||||
To add new templates, add the corresponding tar.gz files to /etc/cvm/templates on the master node, and reload this page.
|
||||
New files will be automatically detected, and you will be able to add them as templates from this page.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
All templates will be automatically synchronized to slave nodes.
|
||||
</p>
|
||||
{%else}
|
||||
<form method="post" action="/admin/template/add">
|
||||
{%foreach template in templates}
|
||||
<div class="darkform">
|
||||
<h3>{%?template}</h3>
|
||||
|
||||
<div class="field">
|
||||
<label>Name</label>
|
||||
{%input type="text" group="addtemplate" name="name[]"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
</div>
|
||||
{%/foreach}
|
||||
</form>
|
||||
{%/if}
|
@ -1,45 +0,0 @@
|
||||
<h2>{%!title-admin-edituser}</h2>
|
||||
|
||||
{%if isempty|errors == false}
|
||||
<div class="errorhandler error-error">
|
||||
<div class="error-title">{%!error-form}</div>
|
||||
<div class="error-message">
|
||||
<ul>
|
||||
{%foreach error in errors}
|
||||
<li>{%?error}</li>
|
||||
{%/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{%/if}
|
||||
|
||||
<form method="post" action="/admin/user/{%?id}/edit/" class="add dark">
|
||||
<div class="field">
|
||||
<label for="form_edituser_username">{%!edituser-username}</label>
|
||||
{%input type="text" group="edituser" name="username"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_edituser_email">{%!edituser-email}</label>
|
||||
{%input type="text" group="edituser" name="email"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_edituser_access">{%!edituser-access}</label>
|
||||
{%select type="text" group="edituser" name="access"}
|
||||
{%option value="1" text="{%!admin-level-enduser}"}
|
||||
<!-- {%option value="10" text="{%!admin-level-reseller}"} -->
|
||||
{%option value="20" text="{%!admin-level-nodeadmin}"}
|
||||
{%option value="30" text="{%!admin-level-masteradmin}"}
|
||||
{%/select}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<div class="filler"></div>
|
||||
<button type="submit" name="submit">{%!button-admin-edituser}</button>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
</form>
|
@ -1,31 +0,0 @@
|
||||
<div class="toolbar">
|
||||
<a href="/admin/users/add/">{%!toolbar-createuser}</a>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<h2>{%!title-admin-userlist}</h2>
|
||||
|
||||
<table class="userlist">
|
||||
<tr>
|
||||
<th>{%!admin-title-username}</th>
|
||||
<th>{%!admin-title-email}</th>
|
||||
<th>{%!admin-title-accesslevel}</th>
|
||||
</tr>
|
||||
{%foreach user in users}
|
||||
<tr class="clickable" data-url="/admin/user/{%?user[id]}/">
|
||||
<td>{%?user[username]}</td>
|
||||
<td>{%?user[email]}</td>
|
||||
<td>
|
||||
{%if user[accesslevel] == 1}
|
||||
{%!admin-level-enduser}
|
||||
{%/if}{%if user[accesslevel] == 10}
|
||||
{%!admin-level-reseller}
|
||||
{%/if}{%if user[accesslevel] == 20}
|
||||
{%!admin-level-nodeadmin}
|
||||
{%/if}{%if user[accesslevel] == 30}
|
||||
{%!admin-level-masteradmin}
|
||||
{%/if}
|
||||
</td>
|
||||
</tr>
|
||||
{%/foreach}
|
||||
</table>
|
@ -1,93 +0,0 @@
|
||||
<div class="toolbar">
|
||||
<a href="/admin/user/{%?id}/add/">{%!toolbar-createvps}</a>
|
||||
<a href="/admin/user/{%?id}/edit/">{%!toolbar-edituser}</a>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<h2>{%!title-admin-userinfo}</h2>
|
||||
|
||||
<table class="userinfo vertical">
|
||||
<tr>
|
||||
<th>{%!admin-title-id}</th>
|
||||
<td>{%?id}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!admin-title-username}</th>
|
||||
<td>{%?username}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!admin-title-email}</th>
|
||||
<td>{%?email}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!admin-title-accesslevel}</th>
|
||||
<td>
|
||||
{%if accesslevel == 1}
|
||||
{%!admin-level-enduser}
|
||||
{%/if}{%if accesslevel == 10}
|
||||
{%!admin-level-reseller}
|
||||
{%/if}{%if accesslevel == 20}
|
||||
{%!admin-level-nodeadmin}
|
||||
{%/if}{%if accesslevel == 30}
|
||||
{%!admin-level-masteradmin}
|
||||
{%/if}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!admin-title-vpses}</th>
|
||||
<td>{%?vpscount}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>{%!header-admin-user-vpses}</h3>
|
||||
<table class="vpslist">
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>{%!list-column-hostname}</th>
|
||||
<th>{%!list-column-platform}</th>
|
||||
<th>{%!list-column-disk}</th>
|
||||
<th>{%!list-column-ram}</th>
|
||||
<th>{%!list-column-template}</th>
|
||||
</tr>
|
||||
{%foreach vps in vpses}
|
||||
<tr class="clickable" data-url="/{%?vps[id]}/">
|
||||
<td class="vps-status">
|
||||
{%if vps[status] == running}
|
||||
<img src="/templates/default/static/images/status/online.png" alt="{%!list-status-running}">
|
||||
{%elseif vps[status] == stopped}
|
||||
<img src="/templates/default/static/images/status/offline.png" alt="{%!list-status-stopped}">
|
||||
{%elseif vps[status] == suspended}
|
||||
<img src="/templates/default/static/images/status/suspended.png" alt="{%!list-status-suspended}">
|
||||
{%else}
|
||||
<img src="/templates/default/static/images/status/unknown.png" alt="{%!list-status-unknown}">
|
||||
{%/if}
|
||||
<td>
|
||||
<a href="/{%?vps[id]}/">
|
||||
{%?vps[hostname]}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/{%?vps[id]}/">
|
||||
{%if vps[virtualization-type] == 1}
|
||||
OpenVZ
|
||||
{%/if}{%if vps[virtualization-type] == 2}
|
||||
Xen PV
|
||||
{%/if}{%if vps[virtualization-type] == 3}
|
||||
Xen HVM
|
||||
{%/if}{%if vps[virtualization-type] == 4}
|
||||
KVM
|
||||
{%/if}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
{%?vps[diskspace]}
|
||||
<span class="unit">{%?vps[diskspace-unit]}</span>
|
||||
</td>
|
||||
<td>
|
||||
{%?vps[guaranteed-ram]}
|
||||
<span class="unit">{%?vps[guaranteed-ram-unit]}</span>
|
||||
</td>
|
||||
<td>{%?vps[template]}</td>
|
||||
</tr>
|
||||
{%/foreach}
|
||||
</table>
|
@ -1,88 +0,0 @@
|
||||
<h2>{%!title-admin-addvps}</h2>
|
||||
|
||||
{%if isempty|errors == false}
|
||||
<div class="errorhandler error-error">
|
||||
<div class="error-title">{%!error-form}</div>
|
||||
<div class="error-message">
|
||||
<ul>
|
||||
{%foreach error in errors}
|
||||
<li>{%?error}</li>
|
||||
{%/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{%/if}
|
||||
|
||||
<form method="post" action="/admin/vpses/add/" class="add dark">
|
||||
<div class="field">
|
||||
<label for="form_addvps_node">{%!addvps-node}</label>
|
||||
{%select group="addvps" name="node"}
|
||||
{%foreach node in nodes}
|
||||
{%option value="(?node[id])" text="(?node[name]) ((?node[location]))"}
|
||||
{%/foreach}
|
||||
{%/select}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addvps_template">{%!addvps-template}</label>
|
||||
{%select group="addvps" name="template"}
|
||||
{%foreach template in templates}
|
||||
{%option value="(?template[id])" text="(?template[name])"}
|
||||
{%/foreach}
|
||||
{%/select}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addvps_user">{%!addvps-user}</label>
|
||||
{%select group="addvps" name="user"}
|
||||
{%foreach user in users}
|
||||
{%option value="(?user[id])" text="(?user[username]) (#(?user[id]))"}
|
||||
{%/foreach}
|
||||
{%/select}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addnode_diskspace">{%!addvps-diskspace}</label>
|
||||
{%input type="text" group="addvps" name="diskspace"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addnode_guaranteed">{%!addvps-guaranteed}</label>
|
||||
{%input type="text" group="addvps" name="guaranteed"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addnode_burstable">{%!addvps-burstable}</label>
|
||||
{%input type="text" group="addvps" name="burstable"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addnode_cpucount">{%!addvps-cpucount}</label>
|
||||
{%input type="text" group="addvps" name="cpucount"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addnode_traffic">{%!addvps-traffic}</label>
|
||||
{%input type="text" group="addvps" name="traffic"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_addnode_hostname">{%!addvps-hostname}</label>
|
||||
{%input type="text" group="addvps" name="hostname"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<div class="filler"></div>
|
||||
<button type="submit" name="submit">{%!button-admin-addvps}</button>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
</form>
|
@ -1,54 +0,0 @@
|
||||
<h2>{%!title-admin-vpslist}</h2>
|
||||
|
||||
<table class="vpslist">
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>{%!list-column-hostname}</th>
|
||||
<th>{%!list-column-platform}</th>
|
||||
<th>{%!list-column-disk}</th>
|
||||
<th>{%!list-column-ram}</th>
|
||||
<th>{%!list-column-template}</th>
|
||||
</tr>
|
||||
{%foreach vps in vpses}
|
||||
<tr class="clickable" data-url="/{%?vps[id]}/">
|
||||
<td class="vps-status">
|
||||
{%if vps[status] == running}
|
||||
<img src="/templates/default/static/images/status/online.png" alt="{%!list-status-running}">
|
||||
{%elseif vps[status] == stopped}
|
||||
<img src="/templates/default/static/images/status/offline.png" alt="{%!list-status-stopped}">
|
||||
{%elseif vps[status] == suspended}
|
||||
<img src="/templates/default/static/images/status/suspended.png" alt="{%!list-status-suspended}">
|
||||
{%else}
|
||||
<img src="/templates/default/static/images/status/unknown.png" alt="{%!list-status-unknown}">
|
||||
{%/if}
|
||||
</td>
|
||||
<td>
|
||||
<a href="/{%?vps[id]}/">
|
||||
{%?vps[hostname]}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/{%?vps[id]}/">
|
||||
{%if vps[virtualization-type] == 1}
|
||||
OpenVZ
|
||||
{%/if}{%if vps[virtualization-type] == 2}
|
||||
Xen PV
|
||||
{%/if}{%if vps[virtualization-type] == 3}
|
||||
Xen HVM
|
||||
{%/if}{%if vps[virtualization-type] == 4}
|
||||
KVM
|
||||
{%/if}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
{%?vps[diskspace]}
|
||||
<span class="unit">{%?vps[diskspace-unit]}</span>
|
||||
</td>
|
||||
<td>
|
||||
{%?vps[guaranteed-ram]}
|
||||
<span class="unit">{%?vps[guaranteed-ram-unit]}</span>
|
||||
</td>
|
||||
<td>{%?vps[template]}</td>
|
||||
</tr>
|
||||
{%/foreach}
|
||||
</table>
|
@ -1,14 +0,0 @@
|
||||
<form method="post" action="/admin/vps/{%?id}/suspend/">
|
||||
{%if suspended == false}
|
||||
<h2>{%!title-admin-vps-suspend}</h2>
|
||||
<p>{%!vps-admin-suspend-text}</p>
|
||||
<input type="hidden" name="action" value="suspend">
|
||||
<button type="submit" name="submit" class="padded">{%!button-admin-vps-suspend}</button>
|
||||
{%/if}{%if suspended == true}
|
||||
<h2>{%!title-admin-vps-unsuspend}</h2>
|
||||
<p>{%!vps-admin-unsuspend-text}</p>
|
||||
<input type="hidden" name="action" value="unsuspend">
|
||||
<button type="submit" name="submit" class="padded">{%!button-admin-vps-unsuspend}</button>
|
||||
{%/if}
|
||||
</form>
|
||||
|
@ -1,18 +0,0 @@
|
||||
<form method="post" action="/admin/vps/{%?id}/terminate/">
|
||||
{%if terminated == false}
|
||||
<h2>{%!title-admin-vps-terminate}</h2>
|
||||
<p>{%!vps-admin-terminate-text}</p>
|
||||
<input type="hidden" name="action" value="terminate">
|
||||
<button type="submit" name="submit" class="padded">{%!button-admin-vps-terminate}</button>
|
||||
{%else}
|
||||
{%if can-unterminate == true}
|
||||
<h2>{%!title-admin-vps-unterminate}</h2>
|
||||
<p>{%!vps-admin-unterminate-text}</p>
|
||||
<input type="hidden" name="action" value="unterminate">
|
||||
<button type="submit" name="submit" class="padded">{%!button-admin-vps-unterminate}</button>
|
||||
{%else}
|
||||
Cannot unterminate
|
||||
{%/if}
|
||||
{%/if}
|
||||
</form>
|
||||
|
@ -1,26 +0,0 @@
|
||||
<h1>{%!title-console}</h1>
|
||||
|
||||
<p>{%!console-introduction}</p>
|
||||
|
||||
<p>{%!console-step1}</p>
|
||||
|
||||
<table class="console vertical">
|
||||
<tr>
|
||||
<th>{%!console-title-hostname}</th>
|
||||
<td>{%?host}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!console-title-port}</th>
|
||||
<td>{%?port}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!console-title-username}</th>
|
||||
<td>{%?username}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!console-title-password}</th>
|
||||
<td>{%?password}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>{%!console-step2}</p>
|
@ -1 +0,0 @@
|
||||
{%!notfound}
|
@ -1,59 +0,0 @@
|
||||
<table class="vpslist">
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>{%!list-column-hostname}</th>
|
||||
<th>{%!list-column-platform}</th>
|
||||
<th>{%!list-column-node}</th>
|
||||
<th>{%!list-column-disk}</th>
|
||||
<th>{%!list-column-ram}</th>
|
||||
<th>{%!list-column-template}</th>
|
||||
</tr>
|
||||
{%foreach vps in vpses}
|
||||
<tr class="clickable" data-url="/{%?vps[id]}/">
|
||||
<td class="vps-status">
|
||||
{%if vps[status] == running}
|
||||
<img src="/templates/default/static/images/status/online.png" alt="{%!list-status-running}">
|
||||
{%elseif vps[status] == stopped}
|
||||
<img src="/templates/default/static/images/status/offline.png" alt="{%!list-status-stopped}">
|
||||
{%elseif vps[status] == suspended}
|
||||
<img src="/templates/default/static/images/status/suspended.png" alt="{%!list-status-suspended}">
|
||||
{%else}
|
||||
<img src="/templates/default/static/images/status/unknown.png" alt="{%!list-status-unknown}">
|
||||
{%/if}
|
||||
</td>
|
||||
<td>
|
||||
<a href="/{%?vps[id]}/">
|
||||
{%?vps[hostname]}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/{%?vps[id]}/">
|
||||
{%if vps[virtualization-type] == 1}
|
||||
OpenVZ
|
||||
{%/if}{%if vps[virtualization-type] == 2}
|
||||
Xen PV
|
||||
{%/if}{%if vps[virtualization-type] == 3}
|
||||
Xen HVM
|
||||
{%/if}{%if vps[virtualization-type] == 4}
|
||||
KVM
|
||||
{%/if}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/{%?vps[id]}/">
|
||||
<span class="nodename">{%?vps[node]}</span>
|
||||
<span class="hostname">({%?vps[node-hostname]})</span>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
{%?vps[diskspace]}
|
||||
<span class="unit">{%?vps[diskspace-unit]}</span>
|
||||
</td>
|
||||
<td>
|
||||
{%?vps[guaranteed-ram]}
|
||||
<span class="unit">{%?vps[guaranteed-ram-unit]}</span>
|
||||
</td>
|
||||
<td>{%?vps[template]}</td>
|
||||
</tr>
|
||||
{%/foreach}
|
||||
</table>
|
@ -1,138 +0,0 @@
|
||||
<h1>{%!title-overview}</h1>
|
||||
|
||||
<div class="quota">
|
||||
{%if traffic-split == false}
|
||||
<div class="quota-item">
|
||||
<h3>{%!overview-quota-title-disk}</h3>
|
||||
<div class="quota-bar">
|
||||
<div class="quota-bar-inner" style="width: {%?disk-percentage}%;"></div>
|
||||
<div class="quota-bar-label">{%?disk-used}/{%?disk-total}{%?disk-unit}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="quota-item">
|
||||
<h3>{%!overview-quota-title-ram}</h3>
|
||||
<div class="quota-bar">
|
||||
<div class="quota-bar-inner" style="width: {%?ram-percentage}%;"></div>
|
||||
<div class="quota-bar-label">{%?ram-used}/{%?ram-total}{%?ram-unit}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="quota-item last">
|
||||
<h3>{%!overview-quota-title-traffic}</h3>
|
||||
<div class="quota-bar">
|
||||
<div class="quota-bar-inner" style="width: {%?traffic-percentage}%;"></div>
|
||||
<div class="quota-bar-label">{%?traffic-used}/{%?traffic-total}{%?traffic-unit}</div>
|
||||
</div>
|
||||
</div>
|
||||
{%else}
|
||||
<div class="quota-item wide">
|
||||
<h3>{%!overview-quota-title-disk}</h3>
|
||||
<div class="quota-bar">
|
||||
<div class="quota-bar-inner" style="width: {%?disk-percentage}%;"></div>
|
||||
<div class="quota-bar-label">{%?disk-used}/{%?disk-total}{%?disk-unit}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="quota-item wide last">
|
||||
<h3>{%!overview-quota-title-ram}</h3>
|
||||
<div class="quota-bar">
|
||||
<div class="quota-bar-inner" style="width: {%?ram-percentage}%;"></div>
|
||||
<div class="quota-bar-label">{%?ram-used}/{%?ram-total}{%?ram-unit}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="quota-item wide">
|
||||
<h3>{%!overview-quota-title-traffic-incoming}</h3>
|
||||
<div class="quota-bar">
|
||||
<div class="quota-bar-inner" style="width: {%?inbound-percentage}%;"></div>
|
||||
<div class="quota-bar-label">{%?inbound-used}/{%?inbound-total}{%?inbound-unit}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="quota-item wide last">
|
||||
<h3>{%!overview-quota-title-traffic-outgoing}</h3>
|
||||
<div class="quota-bar">
|
||||
<div class="quota-bar-inner" style="width: {%?outbound-percentage}%;"></div>
|
||||
<div class="quota-bar-label">{%?outbound-used}/{%?outbound-total}{%?outbound-unit}</div>
|
||||
</div>
|
||||
</div>
|
||||
{%/if}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="controlbox">
|
||||
<a class="controlbutton button-loader" href="/{%?id}/start/">
|
||||
<img src="/templates/default/static/images/button/start.png" class="button-icon">
|
||||
{%!overview-button-start}
|
||||
</a>
|
||||
<a class="controlbutton button-loader" href="/{%?id}/restart/">
|
||||
<img src="/templates/default/static/images/button/restart.png" class="button-icon">
|
||||
{%!overview-button-restart}
|
||||
</a>
|
||||
<a class="controlbutton button-loader last" href="/{%?id}/stop/">
|
||||
<img src="/templates/default/static/images/button/stop.png" class="button-icon">
|
||||
{%!overview-button-stop}
|
||||
</a>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<h2>{%!overview-title-configuration}</h2>
|
||||
<table class="vpsinfo vertical">
|
||||
<tr>
|
||||
<th>{%!overview-title-status}</th>
|
||||
<td>
|
||||
{%if status == running}
|
||||
<span class="online">{%!overview-status-running}</span>
|
||||
{%/if}{%if status == stopped}
|
||||
<span class="offline">{%!overview-status-stopped}</span>
|
||||
{%/if}{%if status == suspended}
|
||||
<span class="suspended">{%!overview-status-suspended}</span>
|
||||
{%/if}{%if status == unknown}
|
||||
<span class="unknown">{%!overview-status-unknown}</span>
|
||||
{%/if}
|
||||
</td>
|
||||
<th>{%!overview-title-os}</th>
|
||||
<td>{%?operating-system}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!overview-title-guaranteed}</th>
|
||||
<td>{%?guaranteed-ram}</td>
|
||||
<th>{%!overview-title-burstable}</th>
|
||||
<td>{%?burstable-ram}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!overview-title-disk}</th>
|
||||
<td>{%?disk-space}</td>
|
||||
<th>{%!overview-title-bandwidth}</th>
|
||||
<td>{%?bandwidth-limit}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
{%if total-traffic-limit == "0B"}
|
||||
<th>{%!overview-title-traffic-incoming}</th>
|
||||
<td>{%?incoming-traffic-limit}</td>
|
||||
<th>{%!overview-title-traffic-outgoing}</th>
|
||||
<td>{%?outgoing-traffic-limit}</td>
|
||||
{%else}
|
||||
<th>{%!overview-title-traffic}</th>
|
||||
<td colspan="3">{%?total-traffic-limit}</td>
|
||||
{%/if}
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!overview-title-location}</th>
|
||||
<td colspan="3">{%?server-location}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!overview-title-ipv4}</th>
|
||||
<td colspan="3"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{%!overview-title-ipv6}</th>
|
||||
<td colspan="3"></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
{%if accesslevel >= 20}
|
||||
<h3>{%!header-vps-admin}</h3>
|
||||
<div class="vps-admin">
|
||||
<a href="/admin/vps/{%?id}/suspend/">{%!vps-admin-suspend}</a>
|
||||
<a href="/admin/vps/{%?id}/transfer/">{%!vps-admin-transfer}</a>
|
||||
<a href="/admin/vps/{%?id}/terminate/">{%!vps-admin-terminate}</a>
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
{%/if}
|
@ -1,19 +0,0 @@
|
||||
<div class="sidebar">
|
||||
<a class="sidebutton" id="button_overview" href="/{%?id}/">{%!menu-overview}</a>
|
||||
<!-- <a class="sidebutton" id="button_statistics" href="/{%?id}/statistics/">{%!menu-statistics}</a> -->
|
||||
<a class="sidebutton" id="button_reinstall" href="/{%?id}/reinstall/">{%!menu-reinstall}</a>
|
||||
<!-- <a class="sidebutton" id="button_backup" href="/{%?id}/backup/">{%!menu-backups}</a> -->
|
||||
<a class="sidebutton" id="button_webshell" href="/{%?id}/console/">{%!menu-console}</a>
|
||||
<a class="sidebutton" id="button_password" href="/{%?id}/password/">{%!menu-password}</a>
|
||||
<a class="sidebutton" id="button_ip" href="/{%?id}/ip/">{%!menu-ip}</a>
|
||||
<!-- <a class="sidebutton" id="button_alerts" href="/{%?id}/alerts/">{%!menu-alerts}</a>
|
||||
<a class="sidebutton" id="button_api" href="/{%?id}/api/">{%!menu-api}</a> -->
|
||||
</div>
|
||||
|
||||
{%if isset|error == true}
|
||||
{%?error}
|
||||
{%/if}
|
||||
|
||||
{%?contents}
|
||||
|
||||
<div class="clear"></div>
|
@ -1,22 +0,0 @@
|
||||
<h1>{%!title-password}</h1>
|
||||
|
||||
|
||||
<form method="post" action="/{%?id}/password/" class="root-password dark">
|
||||
<div class="field">
|
||||
<label for="form_password_password">{%!password-field-password}</label>
|
||||
{%input type="text" group="password" name="password"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_password_confirm">{%!password-field-confirm}</label>
|
||||
{%input type="text" group="password" name="confirm"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<div class="filler"></div>
|
||||
<button type="submit" name="submit">{%!button-password}</button>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
</form>
|
@ -1,23 +0,0 @@
|
||||
<h1>{%!title-reinstall}</h1>
|
||||
|
||||
<form method="post" action="../reinstall/">
|
||||
{%foreach template in templates}
|
||||
<div class="template-option">
|
||||
<div class="template-name">
|
||||
<input type="radio" id="tpl_{%?template[id]}" name="template" value="{%?template[id]}">
|
||||
<label for="tpl_{%?template[id]}">{%?template[name]}</label>
|
||||
</div>
|
||||
<div class="template-description">{%?template[description]}</div>
|
||||
</div>
|
||||
{%/foreach}
|
||||
|
||||
<div class="confirm">
|
||||
<input type="checkbox" name="confirm" value="true" id="confirm_reinstall">
|
||||
<label for="confirm_reinstall" class="confirm-text">{%!reinstall-warning}</label>
|
||||
</div>
|
||||
|
||||
<div class="centered">
|
||||
<button type="submit" name="submit" value="submit" class="padded spaced">{%!button-reinstall}</button>
|
||||
{%!reinstall-patience}
|
||||
</div>
|
||||
</form>
|
@ -1,4 +0,0 @@
|
||||
<div class="errorhandler error-error">
|
||||
<div class="error-title">{%?title}</div>
|
||||
<div class="error-message">{%?message}</div>
|
||||
</div>
|
@ -1,4 +0,0 @@
|
||||
<div class="errorhandler error-info">
|
||||
<div class="error-title">{%?title}</div>
|
||||
<div class="error-message">{%?message}</div>
|
||||
</div>
|
@ -1,4 +0,0 @@
|
||||
<div class="errorhandler error-success">
|
||||
<div class="error-title">{%?title}</div>
|
||||
<div class="error-message">{%?message}</div>
|
||||
</div>
|
@ -1,4 +0,0 @@
|
||||
<div class="errorhandler error-warning">
|
||||
<div class="error-title">{%?title}</div>
|
||||
<div class="error-message">{%?message}</div>
|
||||
</div>
|
@ -1,25 +0,0 @@
|
||||
<h1>{%!title-login}</h1>
|
||||
|
||||
{%?error}
|
||||
|
||||
<form method="post" action="/login/" class="login dark">
|
||||
<div class="field">
|
||||
<label for="form_login_username">{%!login-username}</label>
|
||||
{%input type="text" group="login" name="username"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="form_login_password">{%!login-password}</label>
|
||||
{%input type="password" group="login" name="password"}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<div class="filler">
|
||||
<a href="/forgot/">Forgot?</a>
|
||||
</div>
|
||||
<button type="submit" name="submit">{%!button-login}</button>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
</form>
|
@ -1,39 +0,0 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>CVM</title>
|
||||
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Open+Sans:400,700">
|
||||
<link rel="stylesheet" href="/templates/default/static/css/cvm.css?1">
|
||||
<link rel="stylesheet" href="/templates/default/static/css/kickstart-grid.css" media="all">
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
|
||||
<script src="/templates/default/static/js/prettify.js"></script>
|
||||
<script src="/templates/default/static/js/kickstart.js"></script>
|
||||
<script src="/templates/default/static/js/cvm.js?6"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<div class="header">
|
||||
<img src="/templates/default/static/images/misc/logo.png">
|
||||
{%if logged-in == true}
|
||||
<div class="userbox">
|
||||
<div>{%!userbox-loggedin}</div>
|
||||
{%if accesslevel >= 20}
|
||||
<a href="/admin/">{%!userbox-admin}</a>
|
||||
{%/if}
|
||||
<a href="/account/">{%!userbox-account}</a>
|
||||
<a href="/">{%!userbox-list}</a>
|
||||
<a href="/logout/">{%!userbox-logout}</a>
|
||||
</div>
|
||||
{%/if}
|
||||
</div>
|
||||
<div class="main {%if menu-visible == true}shift{%/if}">
|
||||
{%?main}
|
||||
</div>
|
||||
<div class="footer">
|
||||
{%!footer}
|
||||
</div>
|
||||
</div>
|
||||
<img class="preload" src="/templates/default/static/images/misc/loading.gif">
|
||||
<!-- page generated in {%?generation} seconds. -->
|
||||
</body>
|
||||
</html>
|
@ -1,397 +0,0 @@
|
||||
/* @group Base */
|
||||
.chzn-container {
|
||||
font-size: 13px;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
zoom: 1;
|
||||
*display: inline;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.chzn-container .chzn-drop {
|
||||
background: #fff;
|
||||
border: 1px solid #aaa;
|
||||
border-top: 0;
|
||||
position: absolute;
|
||||
top: 29px;
|
||||
left: 0;
|
||||
-webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
|
||||
-moz-box-shadow : 0 4px 5px rgba(0,0,0,.15);
|
||||
-o-box-shadow : 0 4px 5px rgba(0,0,0,.15);
|
||||
box-shadow : 0 4px 5px rgba(0,0,0,.15);
|
||||
z-index: 999;
|
||||
}
|
||||
/* @end */
|
||||
|
||||
/* @group Single Chosen */
|
||||
.chzn-container-single .chzn-single {
|
||||
background-color: #ffffff;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
|
||||
background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
||||
background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
||||
background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
||||
background-image: -ms-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
||||
background-image: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
||||
-webkit-border-radius: 5px;
|
||||
-moz-border-radius : 5px;
|
||||
border-radius : 5px;
|
||||
-moz-background-clip : padding;
|
||||
-webkit-background-clip: padding-box;
|
||||
background-clip : padding-box;
|
||||
border: 1px solid #aaaaaa;
|
||||
-webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
|
||||
-moz-box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
|
||||
box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
position: relative;
|
||||
height: 23px;
|
||||
line-height: 24px;
|
||||
padding: 0 0 0 8px;
|
||||
color: #444444;
|
||||
text-decoration: none;
|
||||
}
|
||||
.chzn-container-single .chzn-single span {
|
||||
margin-right: 26px;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
-o-text-overflow: ellipsis;
|
||||
-ms-text-overflow: ellipsis;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.chzn-container-single .chzn-single abbr {
|
||||
display: block;
|
||||
position: absolute;
|
||||
right: 26px;
|
||||
top: 6px;
|
||||
width: 12px;
|
||||
height: 13px;
|
||||
font-size: 1px;
|
||||
background: url(img/chosen-sprite.png) right top no-repeat;
|
||||
}
|
||||
.chzn-container-single .chzn-single abbr:hover {
|
||||
background-position: right -11px;
|
||||
}
|
||||
.chzn-container-single .chzn-single div {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
height: 100%;
|
||||
width: 18px;
|
||||
}
|
||||
.chzn-container-single .chzn-single div b {
|
||||
background: url('img/chosen-sprite.png') no-repeat 0 0;
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.chzn-container-single .chzn-search {
|
||||
padding: 3px 4px;
|
||||
position: relative;
|
||||
margin: 0;
|
||||
white-space: nowrap;
|
||||
z-index: 1010;
|
||||
}
|
||||
.chzn-container-single .chzn-search input {
|
||||
background: #fff url('img/chosen-sprite.png') no-repeat 100% -22px;
|
||||
background: url('img/chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
||||
background: url('img/chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('img/chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('img/chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('img/chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('img/chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
margin: 1px 0;
|
||||
padding: 4px 20px 4px 5px;
|
||||
outline: 0;
|
||||
border: 1px solid #aaa;
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
-moz-box-sizing: content-box;
|
||||
-webkit-box-sizing: content-box;
|
||||
-ms-box-sizing: content-box;
|
||||
box-sizing:content-box;
|
||||
}
|
||||
.chzn-container-single .chzn-drop {
|
||||
-webkit-border-radius: 0 0 4px 4px;
|
||||
-moz-border-radius : 0 0 4px 4px;
|
||||
border-radius : 0 0 4px 4px;
|
||||
-moz-background-clip : padding;
|
||||
-webkit-background-clip: padding-box;
|
||||
background-clip : padding-box;
|
||||
}
|
||||
/* @end */
|
||||
|
||||
.chzn-container-single-nosearch .chzn-search input {
|
||||
position: absolute;
|
||||
left: -9000px;
|
||||
}
|
||||
|
||||
/* @group Multi Chosen */
|
||||
.chzn-container-multi .chzn-choices {
|
||||
background-color: #fff;
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
||||
background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
border: 1px solid #aaa;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
cursor: text;
|
||||
overflow: hidden;
|
||||
height: auto !important;
|
||||
height: 1%;
|
||||
position: relative;
|
||||
display:inline-block;
|
||||
*display:inline;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices li {
|
||||
display:inline-block;
|
||||
*display:inline;
|
||||
list-style: none;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices .search-field {
|
||||
white-space: nowrap;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices .search-field input {
|
||||
color: #666;
|
||||
background: transparent !important;
|
||||
border: 0 !important;
|
||||
font-family: sans-serif;
|
||||
font-size: 100%;
|
||||
height: 15px;
|
||||
padding: 5px;
|
||||
margin: 1px 0;
|
||||
outline: 0;
|
||||
-webkit-box-shadow: none;
|
||||
-moz-box-shadow : none;
|
||||
-o-box-shadow : none;
|
||||
box-shadow : none;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices .search-field .default {
|
||||
color: #999;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices .search-choice {
|
||||
-webkit-border-radius: 3px;
|
||||
-moz-border-radius : 3px;
|
||||
border-radius : 3px;
|
||||
-moz-background-clip : padding;
|
||||
-webkit-background-clip: padding-box;
|
||||
background-clip : padding-box;
|
||||
background-color: #e4e4e4;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
|
||||
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
||||
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
||||
background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
||||
background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
||||
background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
||||
-webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
|
||||
-moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
|
||||
box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
|
||||
color: #333;
|
||||
border: 1px solid #aaaaaa;
|
||||
line-height: 13px;
|
||||
padding: 3px 20px 3px 5px;
|
||||
margin: 3px 0 3px 5px;
|
||||
position: relative;
|
||||
cursor: default;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices .search-choice-focus {
|
||||
background: #d4d4d4;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
|
||||
display: block;
|
||||
position: absolute;
|
||||
right: 3px;
|
||||
top: 4px;
|
||||
width: 12px;
|
||||
height: 13px;
|
||||
font-size: 1px;
|
||||
background: url(img/chosen-sprite.png) right top no-repeat;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
|
||||
background-position: right -11px;
|
||||
}
|
||||
.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
|
||||
background-position: right -11px;
|
||||
}
|
||||
/* @end */
|
||||
|
||||
/* @group Results */
|
||||
.chzn-container .chzn-results {
|
||||
margin: 0 4px 4px 0;
|
||||
max-height: 240px;
|
||||
padding: 0 0 0 4px;
|
||||
position: relative;
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.chzn-container-multi .chzn-results {
|
||||
margin: -1px 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
.chzn-container .chzn-results li {
|
||||
display: none;
|
||||
line-height: 15px;
|
||||
padding: 5px 6px;
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
}
|
||||
.chzn-container .chzn-results .active-result {
|
||||
cursor: pointer;
|
||||
display: list-item;
|
||||
}
|
||||
.chzn-container .chzn-results .highlighted {
|
||||
background-color: #3875d7;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
|
||||
background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
|
||||
background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
|
||||
background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
|
||||
background-image: -ms-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
|
||||
background-image: linear-gradient(top, #3875d7 20%, #2a62bc 90%);
|
||||
color: #fff;
|
||||
}
|
||||
.chzn-container .chzn-results li em {
|
||||
background: #feffde;
|
||||
font-style: normal;
|
||||
}
|
||||
.chzn-container .chzn-results .highlighted em {
|
||||
background: transparent;
|
||||
}
|
||||
.chzn-container .chzn-results .no-results {
|
||||
background: #f4f4f4;
|
||||
display: list-item;
|
||||
}
|
||||
.chzn-container .chzn-results .group-result {
|
||||
cursor: default;
|
||||
color: #999;
|
||||
font-weight: bold;
|
||||
}
|
||||
.chzn-container .chzn-results .group-option {
|
||||
padding-left: 15px;
|
||||
}
|
||||
.chzn-container-multi .chzn-drop .result-selected {
|
||||
display: none;
|
||||
}
|
||||
.chzn-container .chzn-results-scroll {
|
||||
background: white;
|
||||
margin: 0 4px;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: 321px; /* This should by dynamic with js */
|
||||
z-index: 1;
|
||||
}
|
||||
.chzn-container .chzn-results-scroll span {
|
||||
display: inline-block;
|
||||
height: 17px;
|
||||
text-indent: -5000px;
|
||||
width: 9px;
|
||||
}
|
||||
.chzn-container .chzn-results-scroll-down {
|
||||
bottom: 0;
|
||||
}
|
||||
.chzn-container .chzn-results-scroll-down span {
|
||||
background: url('img/chosen-sprite.png') no-repeat -4px -3px;
|
||||
}
|
||||
.chzn-container .chzn-results-scroll-up span {
|
||||
background: url('img/chosen-sprite.png') no-repeat -22px -3px;
|
||||
}
|
||||
/* @end */
|
||||
|
||||
/* @group Active */
|
||||
.chzn-container-active .chzn-single {
|
||||
-webkit-box-shadow: 0 0 5px #6DB9FF;
|
||||
-moz-box-shadow : 0 0 5px #6DB9FF;
|
||||
-o-box-shadow : 0 0 5px #6DB9FF;
|
||||
box-shadow : 0 0 5px #6DB9FF;
|
||||
border: 1px solid #50B1FE;
|
||||
}
|
||||
.chzn-container-active .chzn-single-with-drop {
|
||||
border: 1px solid #aaa;
|
||||
-webkit-box-shadow: 0 1px 0 #fff inset;
|
||||
-moz-box-shadow : 0 1px 0 #fff inset;
|
||||
-o-box-shadow : 0 1px 0 #fff inset;
|
||||
box-shadow : 0 1px 0 #fff inset;
|
||||
background-color: #eee;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
|
||||
background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
|
||||
background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
|
||||
background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
|
||||
background-image: -ms-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
|
||||
background-image: linear-gradient(top, #eeeeee 20%, #ffffff 80%);
|
||||
-webkit-border-bottom-left-radius : 0;
|
||||
-webkit-border-bottom-right-radius: 0;
|
||||
-moz-border-radius-bottomleft : 0;
|
||||
-moz-border-radius-bottomright: 0;
|
||||
border-bottom-left-radius : 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
.chzn-container-active .chzn-single-with-drop div {
|
||||
background: transparent;
|
||||
border-left: none;
|
||||
}
|
||||
.chzn-container-active .chzn-single-with-drop div b {
|
||||
background-position: -18px 1px;
|
||||
}
|
||||
.chzn-container-active .chzn-choices {
|
||||
-webkit-box-shadow: 0 0 5px #6DB9FF;
|
||||
-moz-box-shadow : 0 0 5px #6DB9FF;
|
||||
-o-box-shadow : 0 0 5px #6DB9FF;
|
||||
box-shadow : 0 0 5px #6DB9FF;
|
||||
border: 1px solid #50B1FE;
|
||||
}
|
||||
.chzn-container-active .chzn-choices .search-field input {
|
||||
color: #111 !important;
|
||||
}
|
||||
/* @end */
|
||||
|
||||
/* @group Disabled Support */
|
||||
.chzn-disabled {
|
||||
cursor: default;
|
||||
opacity:0.5 !important;
|
||||
}
|
||||
.chzn-disabled .chzn-single {
|
||||
cursor: default;
|
||||
}
|
||||
.chzn-disabled .chzn-choices .search-choice .search-choice-close {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/* @group Right to Left */
|
||||
.chzn-rtl { text-align: right; }
|
||||
.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
|
||||
.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
|
||||
|
||||
.chzn-rtl .chzn-single div { left: 3px; right: auto; }
|
||||
.chzn-rtl .chzn-single abbr {
|
||||
left: 26px;
|
||||
right: auto;
|
||||
}
|
||||
.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
|
||||
.chzn-rtl .chzn-choices li { float: right; }
|
||||
.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
|
||||
.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; background-position: right top;}
|
||||
.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
|
||||
.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
|
||||
.chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
|
||||
.chzn-rtl .chzn-search input {
|
||||
background: #fff url('img/chosen-sprite.png') no-repeat -38px -22px;
|
||||
background: url('img/chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
||||
background: url('img/chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('img/chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('img/chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('img/chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
background: url('img/chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%);
|
||||
padding: 4px 5px 4px 20px;
|
||||
direction: rtl;
|
||||
}
|
||||
/* @end */
|
@ -1,662 +0,0 @@
|
||||
html, body
|
||||
{
|
||||
font-family: 'Open Sans', sans-serif;
|
||||
background-color: #E4EAEA;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5
|
||||
{
|
||||
margin: 0px;
|
||||
color: #343352;
|
||||
}
|
||||
|
||||
h1
|
||||
{
|
||||
margin-bottom: 7px;
|
||||
}
|
||||
|
||||
h2
|
||||
{
|
||||
margin-bottom: 9px;
|
||||
}
|
||||
|
||||
h3
|
||||
{
|
||||
font-size: 20px;
|
||||
margin-top: 8px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
p
|
||||
{
|
||||
margin: 5px 0px;
|
||||
}
|
||||
|
||||
table
|
||||
{
|
||||
font-size: 15px;
|
||||
border-spacing: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
th
|
||||
{
|
||||
text-align: left;
|
||||
background-color: #31305E;
|
||||
color: white;
|
||||
padding: 3px 4px;
|
||||
}
|
||||
|
||||
td
|
||||
{
|
||||
vertical-align: top;
|
||||
padding: 4px 4px 0px 4px;
|
||||
}
|
||||
|
||||
table.vertical th
|
||||
{
|
||||
padding: 3px 7px;
|
||||
}
|
||||
|
||||
td.vps-status img
|
||||
{
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
table.vpsinfo, table.console
|
||||
{
|
||||
border: 2px solid #31305E;
|
||||
}
|
||||
|
||||
table.vertical td
|
||||
{
|
||||
padding: 2px 13px;
|
||||
}
|
||||
|
||||
table.console
|
||||
{
|
||||
margin: 12px 0px;
|
||||
}
|
||||
|
||||
table.vpsinfo th
|
||||
{
|
||||
width: 150px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.console th
|
||||
{
|
||||
width: 120px;
|
||||
}
|
||||
|
||||
table.userinfo th
|
||||
{
|
||||
width: 180px;
|
||||
}
|
||||
|
||||
table.nodeinfo th
|
||||
{
|
||||
width: 180px;
|
||||
}
|
||||
|
||||
table.userlist td
|
||||
{
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
||||
.clickable a
|
||||
{
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
tr.clickable:hover
|
||||
{
|
||||
background-color: #BABAD0;
|
||||
}
|
||||
|
||||
.clear
|
||||
{
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.clickable
|
||||
{
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.centered
|
||||
{
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.padded
|
||||
{
|
||||
padding: 10px 25px;
|
||||
}
|
||||
|
||||
.spaced
|
||||
{
|
||||
margin-top: 15px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.preload
|
||||
{
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
.wrapper
|
||||
{
|
||||
width: 900px;
|
||||
margin: 0px auto;
|
||||
}
|
||||
|
||||
.header
|
||||
{
|
||||
font-size: 40px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.userbox
|
||||
{
|
||||
font-size: 16px;
|
||||
font-weight: normal;
|
||||
float: right;
|
||||
margin-top: 28px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.userbox a, .userbox a:active, .vps-admin a, .vps-admin a:active
|
||||
{
|
||||
display: block;
|
||||
float: left;
|
||||
padding: 5px 8px;
|
||||
margin: 6px 3px 3px 3px;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
background-color: #31305E;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.userbox a:hover, .vps-admin a:hover
|
||||
{
|
||||
background-color: #15144E;
|
||||
}
|
||||
|
||||
.main
|
||||
{
|
||||
position: relative;
|
||||
background-color: #F1F1F1;
|
||||
padding: 9px 13px;
|
||||
border: 2px solid #817F9D;
|
||||
min-height: 400px;
|
||||
}
|
||||
|
||||
.main.shift
|
||||
{
|
||||
padding-left: 225px;
|
||||
}
|
||||
|
||||
.sidebar
|
||||
{
|
||||
position: absolute;
|
||||
top: 16px;
|
||||
left: 8px;
|
||||
width: 200px;
|
||||
background-color: #DCDCDC;
|
||||
}
|
||||
|
||||
.sidebar a.sidebutton
|
||||
{
|
||||
display: block;
|
||||
padding: 5px 8px;
|
||||
text-decoration: none;
|
||||
color: #343352;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
padding-left: 30px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 8px 10px;
|
||||
}
|
||||
|
||||
.sidebar a.sidebutton:hover
|
||||
{
|
||||
background-color: #CDCCDE;
|
||||
}
|
||||
|
||||
#button_overview
|
||||
{
|
||||
background-image: url(../images/menu/overview.png);
|
||||
}
|
||||
|
||||
#button_statistics
|
||||
{
|
||||
background-image: url(../images/menu/statistics.png);
|
||||
}
|
||||
|
||||
#button_webshell
|
||||
{
|
||||
background-image: url(../images/menu/console.png);
|
||||
}
|
||||
|
||||
#button_ip
|
||||
{
|
||||
background-image: url(../images/menu/ip.png);
|
||||
}
|
||||
|
||||
#button_reinstall
|
||||
{
|
||||
background-image: url(../images/menu/reinstall.png);
|
||||
}
|
||||
|
||||
#button_backup
|
||||
{
|
||||
background-image: url(../images/menu/backup.png);
|
||||
}
|
||||
|
||||
#button_api
|
||||
{
|
||||
background-image: url(../images/menu/api.png);
|
||||
}
|
||||
|
||||
#button_alerts
|
||||
{
|
||||
background-image: url(../images/menu/alerts.png);
|
||||
}
|
||||
|
||||
#button_password
|
||||
{
|
||||
background-image: url(../images/menu/lock.png);
|
||||
}
|
||||
|
||||
.quota-item
|
||||
{
|
||||
float: left;
|
||||
width: 203px;
|
||||
margin-right: 23px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.quota-bar
|
||||
{
|
||||
position: relative;
|
||||
border: 1px solid #343352;
|
||||
width: 100%;
|
||||
height: 18px;
|
||||
}
|
||||
|
||||
.quota-bar-inner
|
||||
{
|
||||
background-color: #12005E;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.quota-bar-label
|
||||
{
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
bottom: 0px;
|
||||
font-size: 13px;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
padding-left: 5px;
|
||||
/*text-shadow: 0px 0px 3px #000673, 0px 0px 1px #000000, 0px 0px 3px #000000, 0px 0px 2px #000673;
|
||||
-webkit-text-shadow: 0px 0px 3px #000673, 0px 0px 1px #000000, 0px 0px 3px #000000, 0px 0px 2px #000673;
|
||||
-moz-text-shadow: 0px 0px 3px #000673, 0px 0px 1px #000000, 0px 0px 3px #000000, 0px 0px 2px #000673;
|
||||
-o-text-shadow: 0px 0px 3px #000673, 0px 0px 1px #000000, 0px 0px 3px #000000, 0px 0px 2px #000673;
|
||||
-ms-text-shadow: 0px 0px 3px #000673, 0px 0px 1px #000000, 0px 0px 3px #000000, 0px 0px 2px #000673;*/
|
||||
text-shadow: 1px 0px 0px #000673, -1px 0px 0px #000673, 0px 1px 0px #000673, 0px -1px 0px #000673;
|
||||
-webkit-text-shadow: 1px 0px 0px #000673, -1px 0px 0px #000673, 0px 1px 0px #000673, 0px -1px 0px #000673;
|
||||
-moz-text-shadow: 1px 0px 0px #000673, -1px 0px 0px #000673, 0px 1px 0px #000673, 0px -1px 0px #000673;
|
||||
-o-text-shadow: 1px 0px 0px #000673, -1px 0px 0px #000673, 0px 1px 0px #000673, 0px -1px 0px #000673;
|
||||
-ms-text-shadow: 1px 0px 0px #000673, -1px 0px 0px #000673, 0px 1px 0px #000673, 0px -1px 0px #000673;
|
||||
}
|
||||
|
||||
.quota-item.wide
|
||||
{
|
||||
width: 316px;
|
||||
}
|
||||
|
||||
.quota-item.last
|
||||
{
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.quota
|
||||
{
|
||||
margin-bottom: 19px;
|
||||
}
|
||||
|
||||
.infobox
|
||||
{
|
||||
border: 1px solid #B0B0B0;
|
||||
background-color: #EDEDED;
|
||||
padding: 6px 9px;
|
||||
}
|
||||
|
||||
.controlbox
|
||||
{
|
||||
margin-bottom: 23px;
|
||||
}
|
||||
|
||||
.controlbutton
|
||||
{
|
||||
border: 2px solid #343352;
|
||||
font-size: 24px;
|
||||
color: #343352;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
float: left;
|
||||
text-decoration: none;
|
||||
padding: 9px;
|
||||
margin-right: 12px;
|
||||
width: 189px;
|
||||
}
|
||||
|
||||
.controlbutton.last
|
||||
{
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.controlbutton img
|
||||
{
|
||||
display: block;
|
||||
margin: 0px auto;
|
||||
}
|
||||
|
||||
.controlbutton:hover
|
||||
{
|
||||
background-color: #CDD0E1;
|
||||
}
|
||||
|
||||
.controlbutton.disabled, .constrolbutton.disabled:hover
|
||||
{
|
||||
border: 2px solid #737379;
|
||||
background-color: #9B9B9B;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.online
|
||||
{
|
||||
color: #078812;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.offline
|
||||
{
|
||||
color: #A7101C;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.suspended
|
||||
{
|
||||
color: #5B5F6B;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.unknown
|
||||
{
|
||||
color: black;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.footer
|
||||
{
|
||||
font-size: 14px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.nodename
|
||||
{
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.hostname
|
||||
{
|
||||
font-size: 13px;
|
||||
color: gray;
|
||||
}
|
||||
|
||||
.unit
|
||||
{
|
||||
color: gray;
|
||||
}
|
||||
|
||||
/* CPHPErrorHandler styles */
|
||||
|
||||
.errorhandler
|
||||
{
|
||||
margin: 10px 0px;
|
||||
padding: 8px 10px;
|
||||
padding-left: 46px;
|
||||
background-position: 8px 6px;
|
||||
background-repeat: no-repeat;
|
||||
min-height: 24px;
|
||||
}
|
||||
|
||||
.errorhandler .error-title
|
||||
{
|
||||
font-weight: bold;
|
||||
font-size: 120%;
|
||||
}
|
||||
|
||||
.errorhandler.error-error
|
||||
{
|
||||
background-color: #FCCBC9;
|
||||
border: 1px solid red;
|
||||
background-image: url(../images/error/error.png);
|
||||
}
|
||||
|
||||
.errorhandler.error-info
|
||||
{
|
||||
background-color: #C9F6FC;
|
||||
border: 1px solid blue;
|
||||
background-image: url(../images/error/info.png);
|
||||
}
|
||||
|
||||
.errorhandler.error-warning
|
||||
{
|
||||
background-color: #FBFCC9;
|
||||
border: 1px solid #C5BA00;
|
||||
background-image: url(../images/error/warning.png);
|
||||
}
|
||||
|
||||
.errorhandler.error-success
|
||||
{
|
||||
background-color: #DEFCC9;
|
||||
border: 1px solid #4CC500;
|
||||
background-image: url(../images/error/success.png);
|
||||
}
|
||||
|
||||
.errorhandler ul
|
||||
{
|
||||
margin: 0px;
|
||||
padding-left: 24px;
|
||||
}
|
||||
|
||||
|
||||
input
|
||||
{
|
||||
padding: 4px 6px;
|
||||
}
|
||||
|
||||
input, label
|
||||
{
|
||||
/*margin-top: 0px !important;
|
||||
margin-bottom: 0px !important;*/
|
||||
}
|
||||
|
||||
button.column
|
||||
{
|
||||
margin-left: 1.6% !important;
|
||||
margin-right: 1.6% !important;
|
||||
}
|
||||
|
||||
.template-option
|
||||
{
|
||||
border: 1px solid #31305E;
|
||||
margin: 11px 0px;
|
||||
}
|
||||
|
||||
.template-name
|
||||
{
|
||||
background-color: #31305E;
|
||||
padding: 4px 3px;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.template-name input
|
||||
{
|
||||
float: left;
|
||||
margin-top: 6px;
|
||||
margin-right: 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.template-description
|
||||
{
|
||||
padding: 6px 7px;
|
||||
}
|
||||
|
||||
.confirm-text
|
||||
{
|
||||
padding-left: 24px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.confirm input
|
||||
{
|
||||
float: left;
|
||||
margin-right: 4px;
|
||||
margin-top: 7px;
|
||||
}
|
||||
|
||||
.toolbar
|
||||
{
|
||||
background-color: #DDDDDF;
|
||||
padding: 3px;
|
||||
margin-bottom: 8px;
|
||||
margin-top: 7px;
|
||||
border: 2px solid #817F9D;
|
||||
padding-left: 38px;
|
||||
background-image: url(../images/misc/wrench.png);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 4px center;
|
||||
}
|
||||
|
||||
.toolbar a
|
||||
{
|
||||
display: block;
|
||||
float: left;
|
||||
color: white;
|
||||
padding: 4px 6px;
|
||||
text-decoration: none;
|
||||
background-color: #5D5C79;
|
||||
font-weight: bold;
|
||||
font-size: 15px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.toolbar a:hover
|
||||
{
|
||||
background-color: #4E4D69;
|
||||
}
|
||||
|
||||
.darkform
|
||||
{
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
form.dark, .darkform
|
||||
{
|
||||
background-color: #31305E;
|
||||
color: white;
|
||||
padding: 6px 0.5% 4px 0.5%;
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
form.dark label, form .filler, .darkform label
|
||||
{
|
||||
display: block;
|
||||
float: left;
|
||||
margin: 3px 1%;
|
||||
width: 45.8%;
|
||||
}
|
||||
|
||||
form.dark input, form.dark select, .darkform input
|
||||
{
|
||||
display: block;
|
||||
float: left;
|
||||
width: 48%;
|
||||
border: 0px;
|
||||
margin: 3px 0.4%;
|
||||
padding: 4px 2%;
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
form.dark input[type="checkbox"], .darkform input[type="checkbox"]
|
||||
{
|
||||
width: auto;
|
||||
margin-top: 7px;
|
||||
}
|
||||
|
||||
form.dark input[type="file"], .darkform input[type="file"]
|
||||
{
|
||||
height: 24px;
|
||||
font-size: 13px;
|
||||
margin-top: 4px;
|
||||
margin-bottom: 0px;
|
||||
padding: 0px 0px;
|
||||
}
|
||||
|
||||
form.dark button[type="submit"], .darkform button[type="submit"]
|
||||
{
|
||||
float: right;
|
||||
margin: 9px 7px 7px 7px;
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
form.dark .field.disabled, .darkform .field.disabled
|
||||
{
|
||||
background-color: #444452;
|
||||
color: #B5B5B5;
|
||||
}
|
||||
|
||||
form.dark .filler a, .darkform .filler a
|
||||
{
|
||||
display: block;
|
||||
color: white;
|
||||
font-size: 13px;
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
form.dark h3, .darkform h3
|
||||
{
|
||||
color: #F1F1F1;
|
||||
margin: 6px 1% 4px 1%;
|
||||
}
|
||||
|
||||
form.login
|
||||
{
|
||||
width: 40%;
|
||||
margin: 64px auto;
|
||||
}
|
||||
|
||||
form.login label, form.login .filler
|
||||
{
|
||||
width: 40.8%;
|
||||
}
|
||||
|
||||
form.login input
|
||||
{
|
||||
width: 52%;
|
||||
}
|
Binary file not shown.
@ -1,175 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="IcoMoonBase" horiz-adv-x="1433" >
|
||||
<font-face units-per-em="2048" ascent="1536" descent="-512" />
|
||||
<missing-glyph horiz-adv-x="500" />
|
||||
<glyph unicode=" " d="M0 716.5q0 147.5 56.5 278.5t154.5 228.5t228 154t277.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-277.5 56.5t-228 153.5t-154.5 228t-56.5 278.5zM150 717q0 -117 45 -220.5t121.5 -180t180 -121.5 t220.5 -45t220 45t180 121.5t122 180t45 220.5t-45 220t-122 180t-180 122t-220 45t-220.5 -45t-180 -122t-121.5 -180t-45 -220zM508 387v330v330l285 -164l284 -166l-284 -164z" />
|
||||
<glyph unicode="!" d="M10.5 129q-26.5 45 12.5 111l602 1048q39 66 92 66t90 -66l606 -1048q37 -66 10.5 -111t-102.5 -45h-1208q-76 0 -102.5 45zM596 270.5q0 -53.5 33 -87t86 -33.5h2q53 0 86 33.5t33 86.5q-2 53 -34 88t-85 35t-87 -34.5t-34 -88zM631 969l22 -494h125l25 494h-172z" />
|
||||
<glyph unicode=""" d="M0 817q0 86 46 161t126 130t187.5 88t230.5 33t229.5 -33t186 -88t126 -130t46.5 -161t-46.5 -160.5t-126 -130t-186 -87t-229.5 -31.5q-23 0 -43.5 1t-40.5 3q-53 -68 -122 -125.5t-124 -79.5q82 94 82 201q0 8 -1 18t-3 20q-74 25 -136.5 63t-107.5 86t-69.5 104.5 t-24.5 117.5zM842 387q86 27 156.5 70t123 97t83 118.5t32.5 136.5q90 -31 143.5 -91.5t53.5 -133.5q0 -76 -57.5 -137.5t-149.5 -92.5q-4 -16 -4 -22q0 -63 51 -125q-35 14 -77 49t-75 76q-12 0 -25.5 -1t-27.5 -1q-129 0 -227 57z" />
|
||||
<glyph unicode="#" d="M0 739q0 84 48 177.5t140.5 172t226.5 130t306 51.5t305 -52.5t224 -134.5t137.5 -182t46.5 -196q0 -63 -30 -99.5t-75 -52.5t-98 -17t-103.5 5t-89.5 14t-53 10q-23 2 -50.5 -2t-51 -22.5t-36.5 -56.5t-5 -103.5t1 -112.5t-38 -73.5t-90.5 -29.5t-153.5 21 q-96 25 -195.5 66t-180.5 106.5t-133 158.5t-52 222zM154 629q0 -33 24.5 -55.5t59 -22.5t59.5 22.5t25 55.5t-25 55.5t-59.5 22.5t-59 -22.5t-24.5 -55.5zM197 960.5q0 -34.5 26.5 -59t61.5 -24.5q39 0 64.5 24.5t25.5 59t-25.5 59t-64.5 24.5q-35 0 -61.5 -24.5t-26.5 -59 zM514 1091.5q0 -38.5 28.5 -65.5t69.5 -27t70 27t29 65.5t-29 65.5t-70 27t-69.5 -27t-28.5 -65.5zM571 643q0 -41 40 -68.5t96 -27.5q57 0 96 27.5t39 68.5q0 39 -39 65.5t-96 26.5q-55 0 -95.5 -26.5t-40.5 -65.5zM877 1012q0 -41 31.5 -71t74.5 -30q45 0 76 30t31 71 t-31 69.5t-76 28.5q-43 0 -74.5 -28.5t-31.5 -69.5z" />
|
||||
<glyph unicode="$" d="M0 1098v86h246v-2l67 -138h981l68 140l72 -43l-310 -621h-643l-286 578h-195zM354 963l66 -134h194v134h-260zM453 360q0 47 31.5 79t78.5 32t78 -31.5t31 -79.5q0 -45 -31 -77.5t-78 -32.5t-78.5 32.5t-31.5 77.5zM461 745l69 -141h84v141h-153zM698 604h220v141h-220 v-141zM698 829h220v134h-220v-134zM963 360q0 47 32.5 79t77.5 32q47 0 79 -31.5t32 -79.5q0 -45 -32 -77.5t-79 -32.5q-45 0 -77.5 32.5t-32.5 77.5zM1001 604h76l68 141h-144v-141zM1001 829h187l65 134h-252v-134z" />
|
||||
<glyph unicode="%" d="M231 29v1341q0 29 29 29h57q27 0 27 -29v-14q0 -10 8 -17.5t19 -3.5l350 99q27 4 27 -21v-72q0 -10 8 -17t18 -3l402 113q27 4 26 -21v-514q0 -27 -26 -35l-408 -114q-10 -4 -18.5 3t-8.5 17v72q0 29 -26 20l-344 -96q-27 -8 -27 -35v-702q0 -29 -27 -29h-57 q-29 0 -29 29z" />
|
||||
<glyph unicode="&" d="M303 985v6v10v19q0 86 33 161.5t88 131t131 88.5t162 33t161.5 -33t131 -88.5t88 -131t32.5 -161.5v-19v-10v-6q0 -2 -1 -5t-1 -5q-6 -63 -27.5 -139t-52 -156t-66.5 -162t-73 -158q-86 -178 -192 -360q-106 182 -193 360q-37 76 -73.5 158t-66.5 162t-51.5 155.5 t-27.5 139.5q0 2 -1 5t-1 5zM539 1028q0 -74 52 -126t126 -52t126 52t52 126t-52 126t-126 52t-126 -52t-52 -126z" />
|
||||
<glyph unicode="'" d="M0 870q0 113 56.5 211.5t153.5 172t228 115.5t278.5 42t278.5 -42t228.5 -115.5t154 -172t56.5 -211t-56.5 -211t-154 -172t-228.5 -115.5t-278 -42h-12q-33 -49 -74 -97.5t-84 -90.5t-86 -73.5t-80 -45.5q47 59 72.5 125.5t25.5 138.5q0 16 -2 37.5t-6 37.5 q-102 29 -189 79.5t-149.5 116t-97.5 145t-35 167.5z" />
|
||||
<glyph unicode="(" d="M0 59v445h209v-238h1018v238h207v-445h-1434zM403 924h211v450h207v-450h205l-311 -537z" />
|
||||
<glyph unicode=")" d="M0 59v445h209v-238h1018v238h207v-445h-1434zM403 836l312 538l311 -538h-209v-449h-209v449h-205z" />
|
||||
<glyph unicode="*" d="M0 604l113 113l-113 112l141 74l-71 144l157 26l-24 158l157 -25l27 158l143 -72l74 142l113 -113l112 113l74 -142l144 72l26 -158l158 25l-25 -158l158 -26l-72 -144l142 -74l-113 -112l113 -113l-142 -74l72 -143l-158 -27l25 -157l-158 24l-26 -157l-144 71l-74 -141 l-112 113l-113 -113l-74 141l-143 -71l-27 157l-157 -24l24 157l-157 27l71 143z" />
|
||||
<glyph unicode="+" d="M0 633v168q0 23 16.5 40t38.5 17h520v520q0 23 17.5 39.5t40.5 16.5h168q23 0 40 -16.5t17 -39.5v-520h520q23 0 39.5 -17.5t16.5 -39.5v-168q0 -23 -16.5 -40.5t-39.5 -17.5h-520v-520q0 -23 -17.5 -39t-39.5 -16h-168q-23 0 -40.5 16.5t-17.5 38.5v520h-520 q-23 0 -39 17.5t-16 40.5z" />
|
||||
<glyph unicode="," d="M0 88v1167h627l178 -180h629v-987h-1434z" />
|
||||
<glyph unicode="-" d="M0 633v168q0 23 16.5 40t38.5 17h1323q23 0 39.5 -17.5t16.5 -39.5v-168q0 -23 -16.5 -40.5t-39.5 -17.5h-1323q-23 0 -39 17.5t-16 40.5z" />
|
||||
<glyph unicode="." d="M88 0v1434h897l358 -359v-1075h-1255zM180 88h1075v987h-270v268h-805v-1255z" />
|
||||
<glyph unicode="/" d="M180 45v897q0 18 12.5 31.5t30.5 13.5h226q0 92 21.5 173t57 141.5t85 95.5t104.5 35t104 -35t85 -95.5t57.5 -141.5t21.5 -173h225q18 0 31.5 -13t13.5 -32v-897q0 -18 -13 -30.5t-32 -12.5h-987q-18 0 -30.5 12.5t-12.5 30.5zM537 987h360q0 82 -20 152q-16 68 -48 116 q-25 43 -59 70q-25 18 -53 18q-27 0 -53 -18q-35 -27 -60 -70q-31 -49 -47 -116q-20 -70 -20 -152z" />
|
||||
<glyph unicode="0" d="M0 207v1020h1434v-1020h-1434zM109 330h47l315 647l348 -467l172 152l299 -332h33v776h-1214v-776zM1001 854q0 47 31 78t78 31q43 0 75 -31t32 -78q0 -43 -32 -74.5t-75 -31.5q-47 0 -78 31.5t-31 74.5z" />
|
||||
<glyph unicode="1" d="M0 223v797q0 29 20.5 50.5t51.5 21.5h327l11 71l8 47q4 29 28.5 50.5t53.5 21.5h434q29 0 53.5 -21.5t28.5 -50.5l8 -47l10 -71h328q31 0 51.5 -21.5t20.5 -50.5v-797q0 -29 -20.5 -50t-51.5 -21h-1290q-31 0 -51.5 21t-20.5 50zM305 680q0 -86 33 -161t88 -131t130 -89 t161 -33t160.5 33t130 89t88 131t32.5 161q0 84 -32.5 158.5t-88 131t-130 89.5t-160.5 33t-161 -33t-130 -89.5t-88 -131t-33 -158.5zM395 680q0 68 25.5 126t68.5 101t101.5 68.5t126 25.5t126 -25.5t102.5 -68.5t69.5 -101t25.5 -126t-25.5 -127t-69.5 -102t-102.5 -69 t-126 -26t-126 26t-101.5 69t-68.5 102t-25.5 127zM1188 891h139v84h-139v-84z" />
|
||||
<glyph unicode="2" d="M0 178v1077h1434v-1077h-1434zM88 268h180v178h-180v-178zM88 627h180v178h-180v-178zM88 985h180v178h-180v-178zM358 268h717v895h-717v-895zM537 446v539l360 -268zM1163 268h180v178h-180v-178zM1163 627h180v178h-180v-178zM1163 985h180v178h-180v-178z" />
|
||||
<glyph unicode="3" d="M2 184q-6 41 8.5 80t45 71t73.5 54.5t96 28.5q47 8 93.5 1t80.5 -26l37 953l998 79q-12 -299 -23 -536q-4 -102 -9 -200.5t-8 -178.5t-6.5 -132t-3.5 -61q-4 -72 -65.5 -130t-157.5 -72q-53 -6 -100 3t-85 30.5t-62.5 55.5t-30.5 74.5t8 79.5t45 71t74 53.5t96 29.5 q51 8 97 -1t83 -30l35 674l-778 -82q-8 -211 -17 -385q-4 -74 -7 -148.5t-6 -138t-5 -109.5t-2 -65q0 -4 -2 -6v-2q-6 -72 -68.5 -127t-154.5 -69q-53 -8 -100.5 1t-85.5 31.5t-62.5 55t-30.5 73.5z" />
|
||||
<glyph unicode="4" d="M0 430v922h1434v-922h-1434zM94 524h1247v733h-1247v-733zM352 82l109 131l26 129h459l27 -129l108 -131h-729z" />
|
||||
<glyph unicode="5" d="M0 522v389q0 41 15.5 78t43 64.5t63.5 43t77 15.5h641q41 0 76.5 -15.5t63.5 -43t43 -64.5t15 -78v-389q0 -41 -15 -77.5t-43 -64.5t-63.5 -43t-76.5 -15h-641q-41 0 -77 15t-63.5 43t-43 64.5t-15.5 77.5zM1108 584v133v133l326 262v-395v-395z" />
|
||||
<glyph unicode="6" d="M0 0v1434h268v-91h178v91h539v-91h178v91h271v-1434h-1434zM88 88h1255v1075h-1255v-1075zM223 268v178h180v-178h-180zM223 539v178h180v-178h-180zM494 268v178h178v-178h-178zM494 539v178h178v-178h-178zM494 805v180h178v-180h-178zM762 268v178h178v-178h-178z M762 539v178h178v-178h-178zM762 805v180h178v-180h-178zM1030 539v178h180v-178h-180zM1030 805v180h180v-180h-180z" />
|
||||
<glyph unicode="7" d="M0 0l86 356l934 936l272 -270l-936 -936zM248 322l76 -74l784 786l-74 74zM1075 1348l55 55q41 39 109 28.5t125 -67.5q55 -57 67.5 -123.5t-28.5 -107.5l-57 -56z" />
|
||||
<glyph unicode="8" d="M0 893v10q0 25 3 52.5t17.5 58t46 63.5t87.5 64q121 70 262 89t301 23q49 0 117.5 -3t145.5 -14t154.5 -33.5t145.5 -61.5q55 -31 87 -64t46 -63.5t17.5 -58t3.5 -52.5v-10q0 -25 -27 -25h-338q-27 0 -27 25v31q0 31 -13 49t-31.5 29.5t-39 15.5t-34.5 8q-16 2 -42 4 t-55.5 4t-58.5 3t-51.5 1t-51 -1t-58 -3t-55.5 -4t-42 -4q-16 -4 -36.5 -8t-39 -15.5t-31 -30t-12.5 -48.5v-31q0 -25 -26 -25h-338q-27 0 -27 25zM207 315.5q4 59.5 25.5 131t49 140t56.5 123t51 81.5q31 37 75 56t90 26.5t89 7.5h74h74l90 -9l90 -24l73 -57 q23 -27 51.5 -81.5t56.5 -123t49.5 -140t26.5 -131t-11.5 -97.5t-63.5 -38h-436h-436q-47 0 -62.5 38t-11.5 97.5zM506 518q0 -43 16.5 -82t45 -67.5t67.5 -45t82 -16.5t82 16.5t67.5 45t45 67.5t16.5 82t-16.5 82t-45 67.5t-67.5 45t-82 16.5t-82 -16.5t-67.5 -45 t-45 -67.5t-16.5 -82z" />
|
||||
<glyph unicode="9" d="M324 715v110h86v-110q0 -70 24.5 -131.5t65.5 -107.5t97 -72.5t119.5 -26.5t120 26.5t98.5 72.5t66.5 107.5t24.5 131.5v110h84v-110q0 -82 -26.5 -155t-73.5 -130t-111.5 -93t-138.5 -44v-207h180v-86h-444v86h178v207q-74 8 -138.5 44t-111.5 93t-73.5 130t-26.5 155z M496 715v467q0 51 17 97t47 81t70 54.5t87 19.5q45 0 86 -19.5t71.5 -54.5t48 -81t17.5 -97v-467q0 -53 -17.5 -98.5t-48 -80t-71.5 -54t-86 -19.5q-47 0 -87 19.5t-70 54t-47 80t-17 98.5z" />
|
||||
<glyph unicode=":" d="M123 901l539 533v-349q188 4 318 -44t208 -134t105.5 -198.5t10 -234.5t-78 -245t-158.5 -229q39 72 68.5 154t37 162.5t-13 154.5t-79 129t-161 87t-257.5 28v-350z" />
|
||||
<glyph unicode=";" d="M130 474q-17 122 10.5 234.5t105.5 198.5t208 134.5t318 43.5v349l539 -533l-539 -536v350q-156 4 -258 -28t-160.5 -87t-78 -129t-12.5 -154.5t36 -162.5t68 -154q-98 106 -159 229t-78 245z" />
|
||||
<glyph unicode="<" d="M176 894q-12 93 9.5 181t75.5 164t138 127q84 49 177.5 61.5t181.5 -9t164.5 -76t126.5 -138.5q47 -78 61 -163t-1 -166.5t-59 -155.5t-112 -129l322 -471q6 -10 3 -23.5t-14 -19.5l-121 -72q-10 -8 -23 -4t-18 16l-268 506q-80 -31 -163 -33t-160.5 24t-144 77 t-111.5 127q-52 84 -64 177zM325.5 916.5q8.5 -62.5 43 -120t86 -95t112 -52t123 -6.5t119.5 43q57 33 94 85t52.5 111.5t7 123t-43 121t-86 94t-111.5 51t-122.5 6.5t-120 -43t-94.5 -86t-52.5 -110.5t-7 -122zM426 918v90h168v190h90v-190h190v-90h-190v-191h-90v191h-168 z" />
|
||||
<glyph unicode="=" d="M0 221v991q0 55 39 94.5t96 39.5h1163q57 0 96.5 -39t39.5 -95v-991q0 -55 -39 -94t-97 -39h-1163q-57 0 -96 39t-39 94zM88 231q0 -18 13.5 -31.5t29.5 -13.5h1172q18 0 30.5 13.5t12.5 31.5v983q0 18 -12.5 32t-30.5 14h-1172q-16 0 -29.5 -13.5t-13.5 -32.5v-983z M225 846v88q0 33 33 33h184q33 0 33 -33v-88q0 -33 -33 -33h-184q-33 0 -33 33zM301 307v484h98v-484h-98zM301 989v150h98v-150h-98zM592 514v88q0 33 33 33h186q12 0 21.5 -9.5t9.5 -23.5v-88q0 -16 -9.5 -24.5t-21.5 -8.5h-186q-33 0 -33 33zM668 307v152h98v-152h-98z M668 657v482h98v-482h-98zM958 733v88q0 33 33 33h185q33 0 32 -33v-88q0 -33 -32 -33h-185q-33 0 -33 33zM1034 307v371h99v-371h-99zM1034 877v262h99v-262h-99z" />
|
||||
<glyph unicode=">" d="M174 894q-12 93 10.5 181t76.5 164t138 127q84 49 177.5 61.5t181.5 -9t163.5 -76t127.5 -138.5q45 -78 59 -163t-1 -166.5t-58 -155.5t-113 -129l321 -471q8 -10 5.5 -23.5t-15.5 -19.5l-119 -72q-12 -8 -24 -4t-19 16l-266 506q-80 -31 -164 -33t-161.5 24t-144 77 t-111.5 127q-52 84 -64 177zM323.5 916.5q8.5 -62.5 43 -120t87 -95t112 -52t123 -6.5t120.5 43q57 33 94 85t51.5 111.5t6 123t-43 121t-86 94t-112 51t-122.5 6.5t-119.5 -43t-94.5 -86t-52.5 -110.5t-7 -122zM410 920v84h467v-84h-467z" />
|
||||
<glyph unicode="?" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM393 963h178q27 172 152 172q29 0 55 -11 q23 -8 45 -26q14 -14 29 -43q10 -27 10 -54q0 -14 -4 -30q0 -16 -10 -33q-6 -12 -29 -37l-22 -22l-29 -27q-78 -63 -106 -123q-31 -61 -31 -211h170q0 111 14 141q4 14 29 39q20 25 57 52q14 14 28.5 27.5t28.5 27.5q23 25 43 59q18 31 29 68q12 37 12 76q0 57 -24.5 110 t-65.5 88q-37 35 -100 58q-31 10 -63.5 15t-69.5 5q-68 0 -123 -24q-57 -20 -100 -62q-23 -23 -39.5 -47.5t-30.5 -52.5q-12 -31 -20.5 -64.5t-12.5 -70.5zM590 278.5q0 -53.5 37 -90t90 -36.5t91 36.5t38 90t-38 91.5t-91 38t-90 -38t-37 -91.5z" />
|
||||
<glyph unicode="@" d="M0 274l592 355l125 -113l125 113l592 -355h-1434zM0 332v827l522 -469zM43 1159h1348l-674 -502zM911 690l523 469v-827z" />
|
||||
<glyph unicode="A" d="M0 655l1434 709l-904 -885zM647 70v297l148 -56zM647 440l787 924l-256 -1116z" />
|
||||
<glyph unicode="B" d="M0 627l805 807h629v-625l-805 -809l-183 449zM1036 1167.5q0 -53.5 37 -90.5t90.5 -37t89 37t35.5 90.5t-35.5 90t-89 36.5t-90.5 -36.5t-37 -90z" />
|
||||
<glyph unicode="C" d="M0 715l217 215l330 -330l670 670l217 -217l-887 -887z" />
|
||||
<glyph unicode="D" d="M0 223v180q0 18 8 35t25 33q35 -35 101.5 -63.5t155.5 -49t197.5 -33t229.5 -12.5t230.5 12.5t198.5 33t154.5 49t100.5 63.5q16 -16 24.5 -32.5t8.5 -35.5v-180q0 -47 -56.5 -87t-154 -70.5t-228.5 -48t-278.5 -17.5t-278.5 17.5t-228 48t-153.5 70.5t-56.5 87zM0 627 v178q0 39 33 67q35 -35 101.5 -62.5t155.5 -49t197.5 -32.5t229.5 -11t230.5 11t198.5 32.5t154.5 49.5t100.5 62q33 -29 33 -67v-178q0 -47 -56.5 -87t-154 -71t-228.5 -48.5t-278.5 -17.5t-278.5 17.5t-228 48.5t-153.5 71t-56.5 87zM0 1030v180q0 45 56.5 86t153.5 72 t228 48.5t278.5 17.5t278.5 -17.5t228.5 -48.5t154 -72t56.5 -86v-180q0 -47 -56.5 -88t-154 -71.5t-228.5 -48t-278.5 -17.5t-278.5 17.5t-228 48t-153.5 71.5t-56.5 88z" />
|
||||
<glyph unicode="E" d="M117 0v59q0 100 19.5 195.5t56 180.5t89 157t117.5 125q-66 51 -118 122.5t-88.5 156.5t-56 180.5t-19.5 197.5v60h1200v-60q0 -102 -19.5 -197.5t-56.5 -180.5t-89 -156.5t-118 -122.5q131 -106 207 -280.5t76 -377.5v-59h-1200zM238 117h958q-6 90 -28.5 174 t-60.5 154.5t-90 127t-114 93.5l-88 51l88 51q125 72 204 218.5t89 330.5h-958q12 -184 91 -330.5t203 -218.5l86 -51l-86 -51q-61 -37 -113 -93.5t-90 -127t-61.5 -154.5t-29.5 -174zM391 219q31 72 68 137q33 55 78 110.5t102 84.5v2h2q2 0 2 2q20 12 34.5 54t16.5 92 q0 8 1 17q0 41 -9 80q-10 46 -39 64q-41 23 -74.5 66t-56.5 84q-27 49 -49 102h502q-23 -53 -49 -102q-25 -41 -59 -84t-75 -66q-29 -18 -38 -64q-8 -35 -8 -74v-23q3 -50 16.5 -92t34.5 -54q0 -2 2 -2h4v-2q55 -29 100 -84t78 -111q37 -66 67 -137h-651z" />
|
||||
<glyph unicode="F" d="M102 398q-3 24 -2 50q0 51 11 107q12 61 38.5 117.5t54 113t49 112.5t26.5 118q37 -66 46 -118t13 -122q57 70 111.5 150t94.5 165t59 172q12 53 12 105q0 33 -5 66q106 -55 191 -134q37 -33 71.5 -74.5t64.5 -91t49.5 -106.5t25.5 -123q12 27 18 60.5t6 68.5t-6 69 t-18 62q18 -14 57 -53t84 -98.5t87 -134t68 -159.5q28 -92 27 -187q0 -87 -36 -176q-38 -93 -121.5 -184t-229.5 -173q55 106 64 226q2 25 1 51q0 94 -24 184q-31 115 -96.5 215t-159.5 166q5 -22 5 -54q0 -11 -1 -23q-2 -48 -14 -104.5t-38 -114t-69 -104.5q7 34 8 63 q0 12 -1 23q-4 39 -15 68q-10 33 -28 57q-8 -35 -21 -71q-12 -33 -31.5 -75t-50.5 -87q-29 -41 -49 -83t-28 -92q-3 -21 -3 -43q0 -32 6 -68q10 -60 46 -134q-115 63 -188 126.5t-112 131t-47 140.5z" />
|
||||
<glyph unicode="G" d="M27 481q49 29 80.5 72t45.5 94q9 35 9 71q0 17 -2 34q-6 53 -33 102q-41 63 -100 98l139 246q49 -29 103 -36q19 -3 38 -2q34 0 67 8q50 13 94 46t73 82q35 61 34 138h283q0 -57 21.5 -107.5t58.5 -87.5t87 -58.5t105 -21.5q37 0 72 10.5t66 26.5l139 -244 q-49 -29 -81 -71.5t-46 -94.5q-10 -36 -10 -72q0 -16 2 -32q6 -53 35 -102q18 -33 44.5 -57.5t55.5 -43.5l-141 -243q-49 29 -103 34q-17 2 -33 2q-36 0 -71 -9q-51 -13 -94 -46t-72 -82q-18 -33 -26.5 -66.5t-8.5 -68.5h-283q0 55 -21.5 105.5t-58 87t-87 58t-105.5 21.5 q-76 0 -137 -36zM428 716.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113z" />
|
||||
<glyph unicode="H" d="M0 1004q0 82 30.5 153.5t85 124.5t126 85t153.5 32q98 0 182.5 -44t139.5 -120q55 76 140 120t181 44q82 0 154 -32t125 -85t85 -125t32 -153q0 -94 -29 -171t-77 -143.5t-110.5 -126t-130.5 -119.5q-88 -78 -175 -162.5t-160 -197.5l-33 -49l-35 49q-78 111 -166 194.5 t-170 155.5q-70 61 -133 120.5t-110.5 126.5t-76 146t-28.5 177zM82 1004q0 -86 24.5 -154t67.5 -127t101.5 -114.5t125.5 -112.5q78 -66 159 -144t155 -176q76 102 158.5 181t160.5 149q66 59 124.5 113.5t101.5 113t67.5 125t24.5 146.5q0 66 -24.5 123t-67.5 99 t-100.5 66.5t-121.5 24.5q-92 0 -168.5 -48t-115.5 -132l-37 -78l-37 78q-39 84 -116 132t-169 48q-66 0 -122 -24.5t-99 -66.5t-67.5 -99t-24.5 -123z" />
|
||||
<glyph unicode="I" d="M0 475l717 717l252 -254v104h180v-284l285 -283h-174v-475h-453v293h-180v-293h-453v475h-174z" />
|
||||
<glyph unicode="J" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM332 997q0 -41 30.5 -70.5t71.5 -29.5t71 29.5 t30 70.5q0 43 -30 73t-71 30t-71.5 -30t-30.5 -73zM446 358h539v88h-539v-88zM899 997q0 -41 29.5 -70.5t70.5 -29.5t72 29.5t31 70.5q0 43 -31 73t-72 30t-70.5 -30t-29.5 -73z" />
|
||||
<glyph unicode="K" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM285 555l4 -8q66 -117 181.5 -182.5t246.5 -65.5 t246.5 65.5t181.5 182.5l4 8l-88 51l-6 -8q-53 -92 -143.5 -144.5t-195 -52.5t-194.5 52.5t-143 144.5l-6 8zM332 997q0 -41 30.5 -70.5t71.5 -29.5t71 29.5t30 70.5q0 43 -30 73t-71 30t-71.5 -30t-30.5 -73zM899 997q0 -41 29.5 -70.5t70.5 -29.5t72 29.5t31 70.5 q0 43 -31 73t-72 30t-70.5 -30t-29.5 -73z" />
|
||||
<glyph unicode="L" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM285 387l88 -51l6 10q53 92 143 143.5t194.5 51.5 t194.5 -51.5t144 -143.5l6 -10l88 51l-4 8q-66 117 -181.5 182.5t-246.5 65.5t-247 -65.5t-181 -182.5zM332 997q0 -41 30.5 -70.5t71.5 -29.5t71 29.5t30 70.5q0 43 -30 73t-71 30t-71.5 -30t-30.5 -73zM899 997q0 -41 29.5 -70.5t70.5 -29.5t72 29.5t31 70.5q0 43 -31 73 t-72 30t-70.5 -30t-29.5 -73z" />
|
||||
<glyph unicode="M" d="M20 836q0 31 46.5 59.5t125 50t185 33.5t227.5 12t226.5 -12t184.5 -33.5t125 -50.5t46 -59v-21q98 -20 162.5 -86.5t64.5 -153.5q0 -51 -23.5 -96t-63.5 -78.5t-93 -53t-115 -19.5q-8 0 -14 1t-14 1q-70 -152 -191 -241t-295 -89q-150 0 -259 65.5t-182 179t-108 266.5 t-35 325zM76 836q10 -10 43 -27.5t108 -36.5q78 -18 175.5 -27.5t202 -9.5t199.5 9.5t173 27.5q76 18 109.5 35.5t43.5 28.5q-10 10 -43.5 27.5t-109.5 35.5q-78 16 -173 26.5t-199.5 10.5t-202 -10.5t-175.5 -26.5q-76 -18 -108.5 -35.5t-42.5 -27.5zM513 1222 q5 24 25.5 44t59.5 32q-29 -29 -33 -55t5.5 -51t26.5 -48.5t32.5 -47t24 -47t-0.5 -48.5q-8 31 -21.5 50.5t-29.5 33t-31.5 24.5t-27.5 24q-18 18 -27 42q-5 14 -5 29q0 9 2 18zM601 1339q0 22 11 41q12 20 41 35t76 19q-39 -27 -49 -55.5t-5 -57.5t19.5 -58.5t25.5 -60.5 t13 -61.5t-18 -59.5q0 41 -11.5 71t-28 53.5t-33.5 43t-28 39.5q-13 25 -13 51zM1116 391q104 8 152.5 60.5t48.5 113.5q0 47 -36 88t-99 58q-6 -88 -23.5 -168t-42.5 -152z" />
|
||||
<glyph unicode="N" d="M0 629q0 147 56.5 278t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278q0 -152 -60.5 -289t-171.5 -240l-14 -12h-942l-15 12q-111 102 -171 239.5t-60 289.5zM94 602q0 -74 23 -151l100 32q4 -8 6 -15t4 -15l-100 -33q49 -135 154 -240 h872q104 104 154 240l-101 33q2 8 4 15t7 15l100 -32q20 74 24 151h-208q0 6 1 12.5t1 14.5q0 6 -1 12t-1 12h208q-4 82 -24 152l-100 -33q-4 8 -7 16l-4 17l101 33q-29 78 -70 135l-170 -121q-12 20 -29 41l168 123q-49 61 -110 108l-62 -86q-6 4 -12 9.5t-14 11.5l63 84 q-61 43 -137 71l-64 -198l-24 8l-27 8l66 199q-37 10 -74 15t-78 7v-106h-16h-17v106q-41 -2 -77.5 -7t-73.5 -15l65 -199q-14 -4 -26 -8l-25 -8l-63 198q-76 -29 -138 -71l64 -84q-8 -6 -14 -11.5t-13 -9.5l-61 86q-61 -47 -111 -108l168 -123q-16 -20 -28 -41l-170 121 q-41 -57 -70 -135l100 -33l-4 -17l-6 -16l-100 33q-23 -74 -23 -152h207q0 -6 -1 -12t-1 -12q0 -8 1 -14.5t1 -12.5h-207zM389 322l574 688l41 -31l-478 -758z" />
|
||||
<glyph unicode="O" d="M0 279l600 602q-15 55 -15 111q0 52 13 105q27 110 111 193q61 61 139 92t158.5 31t159.5 -31.5t141 -93.5q63 -63 95 -142t32 -160t-30 -159.5t-91 -140.5q-86 -84 -195 -108q-50 -11 -100 -12l-117 16l-119 -123h-192v-146h-141v-145h-146v-148h-252q-27 2 -38 13.5 t-11 40.5zM1026 1123q0 -46 33 -81q35 -35 81 -34.5t81 32.5q33 35 32.5 81t-34.5 79q-35 35 -81 35t-79 -33t-33 -79z" />
|
||||
<glyph unicode="P" d="M0 539v446q0 37 26.5 63.5t61.5 26.5h1255q37 0 64 -26.5t27 -63.5v-446q0 -37 -27 -65t-64 -28h-268v-358h-717v358h-270q-35 0 -61.5 28t-26.5 65zM358 1163v180h717v-180h-717zM446 178h539v449h-539v-449zM1235 940q0 -27 18.5 -45t44.5 -18q29 0 46.5 18t17.5 45 q0 29 -17.5 46.5t-46.5 17.5q-27 0 -45 -17.5t-18 -46.5z" />
|
||||
<glyph unicode="Q" d="M113 604q0 -125 48 -235.5t130 -192.5t191.5 -129t234.5 -47t234.5 47t191.5 129t130 192.5t48 235.5q0 94 -27.5 181t-79 160t-121 129t-153.5 89v-164q104 -59 167.5 -163.5t63.5 -231.5q0 -94 -35.5 -177t-97 -144.5t-144.5 -97t-177 -35.5t-177 35.5t-144.5 97 t-97.5 144.5t-36 177q0 127 63.5 231.5t168.5 163.5v164q-84 -33 -154 -89t-121 -129t-78.5 -160t-27.5 -181zM643 741v693h148v-693h-148z" />
|
||||
<glyph unicode="R" d="M80 324v671l573 -323v-672zM156 1110l565 324l565 -324l-565 -324zM797 0v672l555 323v-671z" />
|
||||
<glyph unicode="S" d="M20 498q0 88 25 129t61 50q14 3 29 3q25 0 52 -9q44 -15 83 -38t64.5 -24t40 11.5t19.5 33t5 42.5v267q0 39 27 65.5t66 26.5h217q23 0 43 5t31.5 19.5t10.5 40t-23.5 64.5t-37.5 83q-9 28 -9 53q0 14 3 28q8 37 49 61.5t129 24.5q90 0 131 -25t50 -61q3 -14 4 -29 q0 -25 -10 -52q-15 -44 -36 -83q-23 -39 -24.5 -64.5t9.5 -40t32.5 -19.5t44.5 -5h215q39 0 65.5 -27t26.5 -65v-871q0 -39 -26.5 -65.5t-65.5 -26.5h-215q-23 0 -44.5 5t-32.5 19.5t-9 40t24 64.5q20 39 36 83q10 28 10 53q0 15 -4 29q-9 38 -50 62.5t-131 24.5 q-88 0 -129 -24.5t-49 -62.5q-3 -14 -3 -28q0 -26 9 -54q14 -44 37 -83t24 -64.5t-10.5 -40t-33 -19.5t-43.5 -5h-215q-39 0 -66 26.5t-27 65.5v207q0 23 -5 44.5t-19.5 32.5t-40 9t-64.5 -24.5t-83 -36.5q-27 -9 -51 -9q-16 0 -30 3q-37 9 -61.5 49.5t-24.5 130.5z" />
|
||||
<glyph unicode="T" d="M59 1094l43 180h392v72q0 35 25.5 61.5t62.5 26.5h270q37 0 62.5 -27t25.5 -61v-72h391l43 -180h-106l-123 -1094h-856l-123 1094h-107zM338 932l76 -717h106l-76 717h-106zM563 1274h307v72q0 16 -18 16h-270q-18 0 -19 -16v-72zM657 215h119v717h-119v-717zM913 215 h107l76 717h-107z" />
|
||||
<glyph unicode="U" d="M0 446q10 63 80 110.5t172 57.5v11q-33 20 -52.5 62t-19.5 95q0 72 36 123t89 51t90 -51t37 -123q0 -53 -20.5 -95t-53.5 -62v-11q29 -4 54.5 -10t48.5 -14q-121 -53 -172 -144h-289zM303 326q6 43 35 88t74 84t104 66.5t127 33.5q2 6 2 16q-45 29 -71.5 86.5 t-26.5 128.5q0 49 13 91.5t35.5 74t54.5 50t67 18.5t65.5 -18.5t54 -50t37 -73.5t13.5 -92q0 -72 -26.5 -129t-72.5 -86v-16q70 -6 129.5 -33.5t104.5 -66.5t73.5 -84t34.5 -88h-827zM971 590q23 8 49.5 14t54.5 10v11q-33 20 -53.5 62t-20.5 95q0 72 37 123t90 51 q51 0 89 -51t38 -123q0 -53 -20.5 -95t-52.5 -62v-11q102 -10 171.5 -57t80.5 -111h-289q-27 43 -71 80t-103 64z" />
|
||||
<glyph unicode="V" d="M178 614l828 820l-226 -615h475l-827 -819l225 614h-475z" />
|
||||
<glyph unicode="W" d="M150 1229q74 6 143 20.5t137 40t138.5 61t148.5 83.5q78 -47 148.5 -83t138 -61.5t137 -40t143.5 -20.5q5 -78 5 -150q0 -129 -16 -238q-26 -171 -77 -301t-117.5 -223.5t-135.5 -157t-129 -101.5t-97 -58q-37 20 -97.5 58t-128 101.5t-135 157t-118 223.5t-76.5 300 q-17 110 -18 241q1 71 6 148zM246 1139q-1 -26 -1 -53q0 -431 193 -711q72 -102 149 -165t130 -93q51 31 129 93t149 165q193 280 194 711q0 26 -1 53q-117 16 -228.5 58t-242.5 120q-131 -78 -242.5 -120t-228.5 -58zM313 1081q98 18 195.5 57.5t208.5 100.5 q111 -61 208 -100t195 -58q0 -408 -180 -667q-94 -133 -223 -219q-131 88 -221 219q-183 259 -183 667z" />
|
||||
<glyph unicode="X" d="M0 420v594l420 420h594l420 -420v-594l-420 -420h-594zM299 461l160 -162l258 258l258 -258l160 162l-256 256l256 258l-160 162l-258 -258l-258 258l-160 -162l258 -258z" />
|
||||
<glyph unicode="Y" d="M0 0v627h627v-627h-627zM0 805v629h627v-629h-627zM805 0v627h629v-627h-629zM805 805v629h629v-629h-629z" />
|
||||
<glyph unicode="Z" d="M9 924q-8 41 -8 81q0 65 22 130l309 -295l262 264l-295 307q66 22 132 22q39 0 79 -8q106 -20 186 -98q45 -47 72 -103.5t34 -116.5q3 -23 3 -47q0 -37 -7 -75q-11 -61 -42 -119l628 -567q25 -23 37.5 -51.5t12.5 -58t-11.5 -58.5t-33.5 -53l-33 -33q-25 -23 -53.5 -34 t-58.5 -11t-58.5 12.5t-50.5 36.5l-566 629q-94 -48 -194 -48q-24 0 -48 3q-126 14 -218 106q-78 79 -100 185z" />
|
||||
<glyph unicode="[" d="M0 696.5q0 55.5 21.5 104.5t58.5 86t86 58.5t104 21.5h25l24 -4q-2 10 -2 28q0 78 54.5 132.5t132.5 54.5q47 0 85 -19.5t64 -54.5q47 59 115 93t147 34q68 0 127.5 -25.5t104.5 -69.5t71.5 -103.5t28.5 -127.5q82 -18 134.5 -83.5t52.5 -151.5q0 -51 -19.5 -95.5 t-52.5 -77t-77 -52t-95 -19.5h-318v-223h-311v223h-291q-55 0 -104 21.5t-86 58.5t-58.5 86t-21.5 104.5zM446 618h177v-354h188v354h176l-270 267z" />
|
||||
<glyph unicode="\" d="M0 585.5q0 55.5 21.5 104.5t58.5 86t86 58.5t104 21.5q14 0 25.5 -1t23.5 -3q-2 8 -2 27q0 39 14.5 72.5t40 59t59.5 40t73 14.5q47 0 85 -19.5t64 -52.5q47 57 115 92t147 35q68 0 127.5 -25.5t104.5 -69.5t71.5 -102.5t28.5 -125.5q82 -23 134.5 -88.5t52.5 -151.5 q0 -49 -19.5 -94t-52.5 -78t-77 -52.5t-95 -19.5h-920q-55 0 -104 21.5t-86 58.5t-58.5 87t-21.5 105.5z" />
|
||||
<glyph unicode="]" d="M0 702q0 57 21.5 106.5t58.5 86.5t86 58.5t104 21.5q25 0 49 -6q-2 10 -2 28q0 78 54.5 132.5t132.5 54.5q47 0 85 -19.5t64 -52.5q47 57 115 91t147 34q68 0 127.5 -25.5t104.5 -69.5t71.5 -102.5t28.5 -126.5q82 -20 134.5 -85.5t52.5 -151.5q0 -51 -19.5 -95 t-52.5 -77t-77 -52.5t-95 -19.5h-234l-239 -235l-240 235h-207q-55 0 -104 21.5t-86 58.5t-58.5 86t-21.5 104zM446 549l271 -266l270 266h-176v354h-188v-354h-177z" />
|
||||
<glyph unicode="^" d="M0 717l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149z" />
|
||||
<glyph unicode="_" d="M0 344.5q0 65.5 24.5 128t73.5 111.5l215 213q-2 -90 33 -185l-137 -137q-27 -27 -40 -61.5t-13 -69.5t13 -68.5t40 -60.5l6 -6q27 -27 60.5 -40t68.5 -13t70 13t61 40l305 305q27 27 39 60.5t12 69.5t-12 70t-39 60l-6 6q-10 8 -18 15.5t-19 11.5l111 113 q10 -8 18 -14.5t17 -16.5l6 -6q49 -49 73.5 -111.5t24.5 -127t-24.5 -128t-73.5 -113.5l-305 -305q-49 -49 -111.5 -73.5t-127 -24.5t-128 24.5t-113.5 73.5l-6 6q-49 49 -73.5 112t-24.5 128.5zM446 789.5q0 64.5 25 128t74 112.5l305 305q49 49 111.5 74t128 25t128 -25 t111.5 -74l6 -6q49 -49 74 -111.5t25 -127t-25 -128t-74 -112.5l-215 -213q2 90 -33 184l138 137q27 27 40 62t13 69.5t-13.5 68.5t-39.5 61l-6 6q-27 27 -61 40t-68.5 13t-69.5 -13.5t-62 -39.5l-305 -305q-27 -27 -40 -61t-13 -69.5t13.5 -69.5t39.5 -61l6 -6 q10 -8 18.5 -15t18.5 -11l-110 -113q-10 8 -18.5 14.5t-16.5 16.5l-6 6q-49 49 -74 111.5t-25 127z" />
|
||||
<glyph unicode="`" d="M0 717q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM190 257q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48zM190 1176.5 q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM313 717q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86t-157.5 -32 t-157 32t-128 86t-87 128t-32 158zM428 716.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM651 66v114q0 29 19.5 47.5 t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM651 1253v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1030 338q0 27 19 47q20 18 46.5 18 t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1030 1095.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1188 717q0 29 18.5 47t46.5 18h115 q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5z" />
|
||||
<glyph unicode="a" d="M16 678q-15 18 -15 37t15 39q10 14 23 26l24 25q68 66 144 124t160 101q53 29 110.5 50.5t116.5 31.5q33 4 62.5 6t60.5 2t61.5 -2t61.5 -6q59 -10 116.5 -31.5t110.5 -50.5q84 -43 161 -101.5t142 -123.5q14 -12 25.5 -24.5t23.5 -26.5q14 -19 14.5 -38.5t-14.5 -37.5 q-35 -41 -74.5 -77t-80.5 -69q-90 -72 -191.5 -127t-214.5 -79q-66 -14 -141 -15q-72 0 -142 15q-113 25 -214 80t-191 126q-41 33 -80 69t-74 77zM442 716.5q0 -57.5 21.5 -107.5t58.5 -88t87 -59.5t107.5 -21.5t107.5 21.5t87 59.5t58.5 88t21.5 107.5t-21.5 107.5 t-58.5 87t-87 58.5t-107.5 21.5t-107.5 -21.5t-87 -58.5t-58.5 -87t-21.5 -107.5zM610 717q0 45 31 75.5t76 30.5t75.5 -30.5t30.5 -75.5t-30.5 -76t-75.5 -31t-76 31t-31 76z" />
|
||||
<glyph unicode="b" d="M268 0v1434h899v-1434l-450 451z" />
|
||||
<glyph unicode="c" d="M0 946q51 -53 111 -115q51 -53 114.5 -118.5t130.5 -130.5q117 139 259.5 259t289 215t283.5 164.5t246 106.5q-297 -231 -504 -451.5t-338 -390.5q-154 -201 -252 -379z" />
|
||||
<glyph unicode="d" d="M0 877l539 12l178 510l178 -510l539 -12l-430 -324l155 -518l-442 309l-443 -309l156 518zM250 797l280 -213l-102 -338l289 203l289 -203l-103 338l281 213l-350 8l-117 332l-117 -332z" />
|
||||
<glyph unicode="e" d="M0 877l539 12l178 510l178 -510l539 -12l-430 -324l155 -518l-442 307l-443 -307l156 518zM717 449l289 -201l-103 336l281 213l-350 8l-117 332v-688z" />
|
||||
<glyph unicode="f" d="M0 877l541 12l176 510l178 -510l539 -12l-430 -326l155 -516l-442 307l-443 -307l156 516z" />
|
||||
<glyph unicode="g" d="M0 717q0 49 6 96l111 10q16 84 53 160l-86 74q25 43 53.5 82t61.5 73l94 -57q57 55 139 100l-26 109q43 20 89 34.5t95 22.5l43 -102q20 4 40.5 6t43 2t43 -2t41.5 -6l43 102q49 -8 95 -22.5t89 -34.5l-27 -109q78 -43 138 -100l96 57q33 -35 61.5 -73.5t51.5 -81.5 l-84 -74q37 -76 53 -160l110 -10q6 -47 7 -96q0 -51 -7 -96l-110 -11q-16 -84 -53 -159l84 -74q-23 -43 -51.5 -82t-61.5 -74l-96 58q-59 -57 -138 -101l27 -106q-88 -45 -184 -60l-43 103q-41 -6 -84 -6q-45 0 -84 6l-43 -103q-96 14 -184 60l26 106q-82 45 -139 101 l-94 -58q-33 35 -61.5 74t-53.5 82l86 74q-37 76 -53 159l-111 11q-6 45 -6 96zM510 717q0 -43 16.5 -81t44 -66.5t65.5 -45t81 -16.5t81 16.5t66.5 45t45 66.5t16.5 81t-16.5 81t-45 65.5t-66.5 44t-81 16.5t-81 -16.5t-65.5 -44t-44 -65.5t-16.5 -81z" />
|
||||
<glyph unicode="h" d="M0 1006q0 78 29.5 146.5t80 118.5t119 79.5t146.5 29.5q117 0 207 -59t135 -158q45 98 135 157.5t205 59.5q78 0 146.5 -29.5t119.5 -79.5t81 -119t30 -146q0 -102 -34 -184.5t-91.5 -153t-131 -137t-153.5 -138t-160 -153.5t-147 -187q-74 104 -155 186.5t-160.5 153 t-152.5 135t-128 135t-88 154t-33 189.5z" />
|
||||
<glyph unicode="i" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -227t-228.5 -152.5t-278.5 -56.5t-278.5 56.5t-228 152.5t-153.5 227t-56.5 278.5zM477 786q10 0 23.5 -2t26 -6t22.5 -7t16 -7 q10 -4 16.5 -11.5t12.5 -15.5q12 -18 12 -41v-329q0 -29 -10 -39q-10 -16 -31 -23q-8 -2 -15 -4t-17.5 -2t-18.5 -1t-18 -3v-88h460v88q-10 2 -19 3t-17 5q-10 2 -17.5 4t-15.5 6q-20 6 -31 23q-12 14 -12 39v467l-367 -8v-48zM561 1094q0 -55 43 -95q41 -39 103 -38 q59 0 100 38.5t41 94t-41 94.5t-100 39q-61 0 -103 -39q-43 -41 -43 -94z" />
|
||||
<glyph unicode="j" d="M88 0v446h180v-446h-180zM90 627l539 536l178 -178l358 358l-90 91h268v-271l-88 92l-448 -450l-178 180l-449 -446zM446 0v627h181v-627h-181zM805 0v717h180v-717h-180zM1163 0v985h180v-985h-180z" />
|
||||
<glyph unicode="k" d="M0 627q0 129 49 243.5t134 200.5t200 135t244 49v-628h628q0 -129 -49 -244t-135 -200t-200.5 -134t-243.5 -49t-244 49t-200 134t-134 200t-49 244zM805 805v629q131 0 245.5 -49.5t199.5 -134.5t134.5 -199.5t49.5 -245.5h-629z" />
|
||||
<glyph unicode="l" d="M88 88v629q0 37 27.5 62.5t64.5 25.5h88v270q0 74 35 139.5t96.5 114.5t143.5 77t174 28t174 -28t142.5 -77t95 -114.5t34.5 -139.5v-270h92q35 0 61.5 -25.5t26.5 -62.5v-629q0 -35 -26.5 -61.5t-61.5 -26.5h-1075q-37 0 -64.5 26.5t-27.5 61.5zM446 805h539v270 q0 41 -22.5 70t-40.5 43q-39 33 -88 47q-53 20 -117 20t-117 -20q-49 -14 -88 -47q-18 -14 -42 -43t-24 -70v-270z" />
|
||||
<glyph unicode="m" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM311 592h809v250h-809v-250z" />
|
||||
<glyph unicode="n" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t277.5 -56.5t227.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-227.5 -153.5t-277.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM31 717q0 -72 14 -137.5t39 -124.5l317 131 q-27 66 -26 131q0 35 7 66.5t19 62.5l-317 133q-25 -59 -39 -125.5t-14 -136.5zM408 716.5q0 -63.5 24.5 -119.5t66.5 -98t98 -66.5t119.5 -24.5t120 24.5t98.5 66.5t66.5 98t24.5 119.5t-24.5 120t-66.5 98.5t-98.5 66.5t-120 24.5t-119.5 -24.5t-98 -66.5t-66.5 -98.5 t-24.5 -120zM453 84q125 -53 264 -53q137 0 262 53l-133 317q-31 -12 -62.5 -19t-66.5 -7q-66 0 -131 26zM453 1350l133 -320q59 27 131 27q70 0 129 -27l133 320q-121 51 -262 51q-143 0 -264 -51zM1030 586l320 -131q51 125 51 262t-51 262l-320 -133q27 -59 27 -129 q0 -72 -27 -131z" />
|
||||
<glyph unicode="o" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM160 716.5q0 -114.5 44 -216t119.5 -177t177 -119.5 t216 -44t216 44t177.5 119.5t120 177t44 216t-44 216t-120 177.5t-177.5 120t-216 44t-216 -44t-177 -120t-119.5 -177.5t-44 -216zM317 717q0 82 32 154.5t86 127t127 86t155 31.5t154.5 -31.5t127 -86t86 -127t31.5 -154.5t-31.5 -155t-86 -127t-127 -86t-154.5 -32 t-155 32t-127 86t-86 127t-32 155zM477 717q0 -49 19.5 -93t51.5 -76t76 -51.5t93 -19.5t93 19.5t76 51.5t51 76t19 93t-19 93t-51 76t-76 51t-93 19t-93 -19t-76 -51t-51.5 -76t-19.5 -93zM637 717q0 35 22.5 57.5t57.5 22.5t57.5 -22.5t22.5 -57.5t-22.5 -57.5 t-57.5 -22.5t-57.5 22.5t-22.5 57.5z" />
|
||||
<glyph unicode="p" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM313 592h279v-279h250v279h280v252h-280v278h-250 v-278h-279v-252z" />
|
||||
<glyph unicode="q" d="M150 70v587h135q14 2 36.5 16.5t50 49.5t61.5 96.5t73 157.5q14 33 34.5 53.5t49.5 40.5q23 16 42 40t34.5 61.5t25.5 96t17 144.5q0 12 17 17q9 2 19.5 2t22.5 -2q25 -4 51.5 -18.5t46.5 -41.5q16 -23 25.5 -53.5t11.5 -65.5q1 -10 1 -20q0 -25 -4 -50q-5 -36 -17 -69 q-10 -23 -27.5 -56.5t-34 -70.5t-25 -69.5t4.5 -53.5q90 2 168 2q66 0 130 -3t89 -13q14 -6 31.5 -23.5t31 -39t22.5 -43t9 -37.5q-2 -16 -23.5 -40t-23.5 -42q-2 -10 5 -24.5t16.5 -30t17.5 -30t8 -24.5t-9 -22.5t-20.5 -25.5t-21.5 -25.5t-10 -22.5q-2 -23 14 -53.5 t16 -51.5q0 -16 -10 -30.5t-24 -28.5l-25 -25l-18 -22q-8 -16 -5.5 -45t-3.5 -45q-6 -12 -19 -28.5t-29.5 -31t-35 -26t-32.5 -15.5q-45 -14 -126 -16q-27 -1 -54 -1q-54 0 -109 3q-96 4 -201 14z" />
|
||||
<glyph unicode="r" d="M150 780v584l409 53q106 8 203 13q55 3 109 2h54q81 -2 126 -15q14 -4 31.5 -15t34 -26.5t30.5 -32t20 -28.5q6 -16 2 -45t5 -43q6 -10 18 -22.5t25.5 -27t23.5 -28.5t10 -29q0 -23 -16 -52.5t-14 -51.5q0 -10 10 -22.5t21.5 -26t20.5 -25.5t9 -22q0 -12 -8 -26.5 t-17.5 -29t-16.5 -29t-5 -24.5q2 -18 23.5 -42t23.5 -40q0 -16 -9 -38.5t-22.5 -44t-31 -38t-31.5 -22.5q-25 -10 -88.5 -13.5t-128.5 -3.5q-78 0 -170 2q-12 -20 -4 -54t24.5 -69.5t33.5 -69.5l28 -56q12 -33 17 -69q4 -26 4 -51q0 -10 -1 -20q-2 -35 -11 -66.5t-26 -52.5 q-20 -27 -46.5 -42t-51.5 -19q-12 -2 -22.5 -2t-18.5 2q-16 4 -16 16q-6 86 -17.5 144.5t-27 96.5t-35 61.5t-41.5 39.5q-27 23 -48.5 43.5t-35.5 53.5q-39 96 -73 155.5t-61.5 94t-50 50t-36.5 23.5h-127h-8z" />
|
||||
<glyph unicode="s" d="M176 894q-4 34 -4 67q0 58 13 114q22 88 76 164t138 127q84 49 178 61q34 4 67 5q58 0 114 -14q88 -22 164.5 -76t126.5 -138q47 -78 61 -163q7 -41 7 -81q0 -43 -8 -86q-15 -82 -59 -155.5t-112 -128.5l322 -471q4 -7 4 -15q0 -4 -1 -9q-3 -13 -14 -19l-121 -72 q-7 -5 -15 -5q-4 0 -8 1q-13 4 -18 16l-268 506q-80 -31 -163 -33h-12q-76 0 -148 24q-78 26 -144.5 77t-111.5 127q-52 84 -64 177zM326 916q8 -62 42.5 -119.5t86 -95t111.5 -52.5q38 -9 78 -9q22 0 45 3q62 8 120 43q57 33 94 85t52 112q10 39 10 79q0 22 -2 44 q-8 63 -43 120.5t-86.5 94t-111.5 51.5q-38 9 -78 9q-22 0 -45 -3q-62 -8 -119.5 -43t-94.5 -86t-52 -111q-10 -39 -10 -78q0 -22 3 -44z" />
|
||||
<glyph unicode="t" d="M0 717q0 147 56.5 278t153.5 228.5t228 154t279 56.5q150 0 279.5 -56.5t227 -154t154 -228.5t56.5 -278q0 -150 -56.5 -280t-154 -227t-227.5 -153.5t-279 -56.5q-147 0 -278.5 56.5t-228.5 153.5t-153.5 227t-56.5 280zM117 717q0 -125 47 -234.5t128 -191.5 t190.5 -129t234.5 -47t234.5 47t191.5 129t129 191.5t47 234.5t-47 233.5t-129 190.5t-191.5 129t-234.5 47t-234.5 -47t-190.5 -129t-128 -190.5t-47 -233.5zM604 717q0 33 17.5 59.5t46.5 40.5v395h100v-395q12 -6 23 -14l18 -21l258 45l16 -100l-258 -43 q-10 -35 -39.5 -57.5t-68.5 -22.5q-47 0 -80 33t-33 80z" />
|
||||
<glyph unicode="u" d="M0 92q0 74 37 139.5t101.5 121t154.5 95t196 60.5q51 -37 107.5 -57.5t120 -20.5t120 20.5t107.5 57.5q106 -20 195.5 -60t155 -95.5t102.5 -121t37 -139.5h-1434zM422 938q0 84 22.5 157.5t62.5 129t94 87t115.5 31.5t115 -31.5t93.5 -87t63.5 -129t23.5 -157.5 t-23.5 -158.5t-63.5 -130t-93.5 -87.5t-115 -32t-115.5 32t-94 87.5t-62.5 130t-22.5 158.5z" />
|
||||
<glyph unicode="v" d="M180 45v1165q0 18 12.5 31.5t30.5 13.5h90v-92h-45v-1075h895v1075h-43v92h90q18 0 31.5 -13t13.5 -32v-1165q0 -18 -13 -31.5t-32 -13.5h-987q-18 0 -30.5 13.5t-12.5 31.5zM358 268v90h717v-90h-717zM358 539v88h717v-88h-717zM358 805v90h717v-90h-717zM358 1075v180 h179v88q0 37 26.5 64t63.5 27h178q39 0 65.5 -27t26.5 -64v-88h178v-180h-717zM627 1255h178v88h-176h-2v-88z" />
|
||||
<glyph unicode="w" d="M0 225v889q49 41 150.5 67.5t218.5 26.5q94 0 185 -20.5t163 -73.5q49 41 150.5 67.5t217.5 26.5q94 0 185.5 -20.5t163.5 -73.5v-889q-72 51 -163 72.5t-186 21.5q-117 0 -218 -26.5t-150 -67.5q-72 51 -163 72.5t-185 21.5q-117 0 -218.5 -26.5t-150.5 -67.5zM72 342 q63 25 140 38t157 13q59 0 130.5 -10t145.5 -39v729q-53 33 -123.5 48.5t-152.5 15.5q-94 0 -173 -18.5t-124 -43.5v-733zM788 342q63 25 140.5 38t156.5 13q59 0 131 -10t146 -39v729q-53 33 -124 48.5t-153 15.5q-94 0 -172.5 -18.5t-124.5 -43.5v-733z" />
|
||||
<glyph unicode="x" d="M-2 214q0 28 22 50l453 453l-453 452q-23 23 -22.5 50.5t22.5 50.5l146 143q20 20 49 20.5t49 -20.5l453 -452l452 452q20 20 49 20.5t52 -20.5l143 -143q23 -23 23 -50.5t-23 -50.5l-452 -452l452 -453q23 -23 23 -50.5t-23 -49.5l-143 -144q-23 -23 -51.5 -22.5 t-49.5 22.5l-452 453l-453 -453q-20 -23 -49 -22.5t-49 22.5l-146 144q-22 22 -22 50z" />
|
||||
<glyph unicode="y" d="M0 88v1077l446 181v-1078zM494 268v1078l446 -181v-1077zM987 88v1077l447 181v-1078z" />
|
||||
<glyph unicode="z" d="M-1 265q0 21 17 38q8 8 27.5 26.5t43.5 43t52 53.5l56 55l141 142q33 2 61 16q25 12 48.5 37.5t33.5 75.5q23 14 46.5 -2.5t43.5 -34.5q8 10 27.5 29.5t48.5 46.5l-55 57q-52 -25 -109 -25q-22 0 -45 3q-82 13 -141 73q-51 51 -69 120q-8 32 -8 62q0 36 11 72l205 -195 l160 160l-195 205q36 10 72 10q30 0 61 -7q68 -15 121 -69q59 -59 72 -141q3 -21 3 -42q0 -59 -26 -111l60 -58q35 35 68.5 68t61.5 60.5t48.5 47t28.5 27.5q14 16 23 31.5t18 29.5q8 16 14 31l90 64l25 -25l24 -25l-65 -88q-14 -6 -31 -14q-14 -8 -29.5 -18.5t-29.5 -24.5 l-29 -29l-45 -45l-62 -61l-65 -70l592 -561q33 -29 35 -70v-5q0 -37 -27 -64l-21 -19q-27 -27 -64 -26h-5q-41 2 -70 35l-559 589q-27 -25 -45 -44t-29 -29q18 -20 35 -43t2 -47q-49 -10 -75.5 -34t-38.5 -48q-14 -29 -17 -62l-141 -141l-55 -57l-54 -52l-41 -43l-26 -26 q-17 -17 -39 -18h-2q-23 1 -44.5 11.5t-39 23.5t-23.5 22q-8 6 -21.5 23.5t-23.5 38.5q-11 24 -11 47zM98 199q11 -9 20.5 -9.5t16.5 9.5l416 415q9 8 9 17q0 10 -11 20q-9 9 -19 9l-18 -9l-414 -415q-9 -7 -9 -16.5t9 -20.5z" />
|
||||
<glyph unicode="{" d="M332 717l385 221l385 221v-442v-443l-385 220z" />
|
||||
<glyph unicode="|" d="M274 1102h443h442l-219 -385l-223 -385l-221 385z" />
|
||||
<glyph unicode="}" d="M332 274v443v442l385 -221l385 -221l-385 -223z" />
|
||||
<glyph unicode="~" d="M274 332l222 385l221 385l223 -385l219 -385h-442h-443z" />
|
||||
<glyph unicode=" " d="M0 716.5q0 147.5 56.5 278.5t154.5 228.5t228 154t277.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-277.5 56.5t-228 153.5t-154.5 228t-56.5 278.5zM150 717q0 -117 45 -220.5t121.5 -180t180 -121.5 t220.5 -45t220 45t180 121.5t122 180t45 220.5t-45 220t-122 180t-180 122t-220 45t-220.5 -45t-180 -122t-121.5 -180t-45 -220zM508 387v330v330l285 -164l284 -166l-284 -164z" />
|
||||
<glyph unicode="ª" d="M16 678q-15 18 -15 37t15 39q10 14 23 26l24 25q68 66 144 124t160 101q53 29 110.5 50.5t116.5 31.5q33 4 62.5 6t60.5 2t61.5 -2t61.5 -6q59 -10 116.5 -31.5t110.5 -50.5q84 -43 161 -101.5t142 -123.5q14 -12 25.5 -24.5t23.5 -26.5q14 -19 14.5 -38.5t-14.5 -37.5 q-35 -41 -74.5 -77t-80.5 -69q-90 -72 -191.5 -127t-214.5 -79q-66 -14 -141 -15q-72 0 -142 15q-113 25 -214 80t-191 126q-41 33 -80 69t-74 77zM442 716.5q0 -57.5 21.5 -107.5t58.5 -88t87 -59.5t107.5 -21.5t107.5 21.5t87 59.5t58.5 88t21.5 107.5t-21.5 107.5 t-58.5 87t-87 58.5t-107.5 21.5t-107.5 -21.5t-87 -58.5t-58.5 -87t-21.5 -107.5zM610 717q0 45 31 75.5t76 30.5t75.5 -30.5t30.5 -75.5t-30.5 -76t-75.5 -31t-76 31t-31 76z" />
|
||||
<glyph unicode="­" d="M0 633v168q0 23 16.5 40t38.5 17h1323q23 0 39.5 -17.5t16.5 -39.5v-168q0 -23 -16.5 -40.5t-39.5 -17.5h-1323q-23 0 -39 17.5t-16 40.5z" />
|
||||
<glyph unicode="²" d="M0 178v1077h1434v-1077h-1434zM88 268h180v178h-180v-178zM88 627h180v178h-180v-178zM88 985h180v178h-180v-178zM358 268h717v895h-717v-895zM537 446v539l360 -268zM1163 268h180v178h-180v-178zM1163 627h180v178h-180v-178zM1163 985h180v178h-180v-178z" />
|
||||
<glyph unicode="³" d="M2 184q-6 41 8.5 80t45 71t73.5 54.5t96 28.5q47 8 93.5 1t80.5 -26l37 953l998 79q-12 -299 -23 -536q-4 -102 -9 -200.5t-8 -178.5t-6.5 -132t-3.5 -61q-4 -72 -65.5 -130t-157.5 -72q-53 -6 -100 3t-85 30.5t-62.5 55.5t-30.5 74.5t8 79.5t45 71t74 53.5t96 29.5 q51 8 97 -1t83 -30l35 674l-778 -82q-8 -211 -17 -385q-4 -74 -7 -148.5t-6 -138t-5 -109.5t-2 -65q0 -4 -2 -6v-2q-6 -72 -68.5 -127t-154.5 -69q-53 -8 -100.5 1t-85.5 31.5t-62.5 55t-30.5 73.5z" />
|
||||
<glyph unicode="¹" d="M0 223v797q0 29 20.5 50.5t51.5 21.5h327l11 71l8 47q4 29 28.5 50.5t53.5 21.5h434q29 0 53.5 -21.5t28.5 -50.5l8 -47l10 -71h328q31 0 51.5 -21.5t20.5 -50.5v-797q0 -29 -20.5 -50t-51.5 -21h-1290q-31 0 -51.5 21t-20.5 50zM305 680q0 -86 33 -161t88 -131t130 -89 t161 -33t160.5 33t130 89t88 131t32.5 161q0 84 -32.5 158.5t-88 131t-130 89.5t-160.5 33t-161 -33t-130 -89.5t-88 -131t-33 -158.5zM395 680q0 68 25.5 126t68.5 101t101.5 68.5t126 25.5t126 -25.5t102.5 -68.5t69.5 -101t25.5 -126t-25.5 -127t-69.5 -102t-102.5 -69 t-126 -26t-126 26t-101.5 69t-68.5 102t-25.5 127zM1188 891h139v84h-139v-84z" />
|
||||
<glyph unicode="º" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM160 716.5q0 -114.5 44 -216t119.5 -177t177 -119.5 t216 -44t216 44t177.5 119.5t120 177t44 216t-44 216t-120 177.5t-177.5 120t-216 44t-216 -44t-177 -120t-119.5 -177.5t-44 -216zM317 717q0 82 32 154.5t86 127t127 86t155 31.5t154.5 -31.5t127 -86t86 -127t31.5 -154.5t-31.5 -155t-86 -127t-127 -86t-154.5 -32 t-155 32t-127 86t-86 127t-32 155zM477 717q0 -49 19.5 -93t51.5 -76t76 -51.5t93 -19.5t93 19.5t76 51.5t51 76t19 93t-19 93t-51 76t-76 51t-93 19t-93 -19t-76 -51t-51.5 -76t-19.5 -93zM637 717q0 35 22.5 57.5t57.5 22.5t57.5 -22.5t22.5 -57.5t-22.5 -57.5 t-57.5 -22.5t-57.5 22.5t-22.5 57.5z" />
|
||||
<glyph unicode="À" d="M805 2253q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM995 1793q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48z M995 2712.5q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM1118 2253q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86 t-157.5 -32t-157 32t-128 86t-87 128t-32 158zM1233 2252.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM1456 1602v114 q0 29 19.5 47.5t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM1456 2789v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1835 1874q0 27 19 47 q20 18 46.5 18t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1835 2631.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1993 2253q0 29 18.5 47 t46.5 18h115q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5zM0 655l1434 709l-904 -885zM647 70v297l148 -56zM647 440l787 924l-256 -1116z" />
|
||||
<glyph unicode="Â" d="M1042 2253l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149zM0 655l1434 709l-904 -885zM647 70v297l148 -56zM647 440l787 924l-256 -1116z" />
|
||||
<glyph unicode="Ã" d="M1054 1536l222 385l221 385l223 -385l219 -385h-442h-443zM0 655l1434 709l-904 -885zM647 70v297l148 -56zM647 440l787 924l-256 -1116z" />
|
||||
<glyph unicode="È" d="M70 2273q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM260 1813q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48z M260 2732.5q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM383 2273q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86 t-157.5 -32t-157 32t-128 86t-87 128t-32 158zM498 2272.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM721 1622v114 q0 29 19.5 47.5t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM721 2809v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1100 1894q0 27 19 47 q20 18 46.5 18t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1100 2651.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1258 2273q0 29 18.5 47 t46.5 18h115q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5zM117 0v59q0 100 19.5 195.5t56 180.5t89 157t117.5 125q-66 51 -118 122.5t-88.5 156.5t-56 180.5t-19.5 197.5v60h1200v-60q0 -102 -19.5 -197.5t-56.5 -180.5 t-89 -156.5t-118 -122.5q131 -106 207 -280.5t76 -377.5v-59h-1200zM238 117h958q-6 90 -28.5 174t-60.5 154.5t-90 127t-114 93.5l-88 51l88 51q125 72 204 218.5t89 330.5h-958q12 -184 91 -330.5t203 -218.5l86 -51l-86 -51q-61 -37 -113 -93.5t-90 -127t-61.5 -154.5 t-29.5 -174zM391 219q31 72 68 137q33 55 78 110.5t102 84.5v2h2q2 0 2 2q20 12 34.5 54t16.5 92q0 8 1 17q0 41 -9 80q-10 46 -39 64q-41 23 -74.5 66t-56.5 84q-27 49 -49 102h502q-23 -53 -49 -102q-25 -41 -59 -84t-75 -66q-29 -18 -38 -64q-8 -35 -8 -74v-23 q3 -50 16.5 -92t34.5 -54q0 -2 2 -2h4v-2q55 -29 100 -84t78 -111q37 -66 67 -137h-651z" />
|
||||
<glyph unicode="Ê" d="M307 2273l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149zM117 0v59q0 100 19.5 195.5t56 180.5t89 157t117.5 125q-66 51 -118 122.5t-88.5 156.5t-56 180.5t-19.5 197.5 v60h1200v-60q0 -102 -19.5 -197.5t-56.5 -180.5t-89 -156.5t-118 -122.5q131 -106 207 -280.5t76 -377.5v-59h-1200zM238 117h958q-6 90 -28.5 174t-60.5 154.5t-90 127t-114 93.5l-88 51l88 51q125 72 204 218.5t89 330.5h-958q12 -184 91 -330.5t203 -218.5l86 -51 l-86 -51q-61 -37 -113 -93.5t-90 -127t-61.5 -154.5t-29.5 -174zM391 219q31 72 68 137q33 55 78 110.5t102 84.5v2h2q2 0 2 2q20 12 34.5 54t16.5 92q0 8 1 17q0 41 -9 80q-10 46 -39 64q-41 23 -74.5 66t-56.5 84q-27 49 -49 102h502q-23 -53 -49 -102q-25 -41 -59 -84 t-75 -66q-29 -18 -38 -64q-8 -35 -8 -74v-23q3 -50 16.5 -92t34.5 -54q0 -2 2 -2h4v-2q55 -29 100 -84t78 -111q37 -66 67 -137h-651z" />
|
||||
<glyph unicode="Ì" d="M152 2253q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM342 1793q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48z M342 2712.5q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM465 2253q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86 t-157.5 -32t-157 32t-128 86t-87 128t-32 158zM580 2252.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM803 1602v114 q0 29 19.5 47.5t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM803 2789v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1182 1874q0 27 19 47 q20 18 46.5 18t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1182 2631.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1340 2253q0 29 18.5 47 t46.5 18h115q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5zM0 475l717 717l252 -254v104h180v-284l285 -283h-174v-475h-453v293h-180v-293h-453v475h-174z" />
|
||||
<glyph unicode="Î" d="M389 2253l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149zM0 475l717 717l252 -254v104h180v-284l285 -283h-174v-475h-453v293h-180v-293h-453v475h-174z" />
|
||||
<glyph unicode="Ñ" d="M344 1536l222 385l221 385l223 -385l219 -385h-442h-443zM0 629q0 147 56.5 278t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278q0 -152 -60.5 -289t-171.5 -240l-14 -12h-942l-15 12q-111 102 -171 239.5t-60 289.5zM94 602 q0 -74 23 -151l100 32q4 -8 6 -15t4 -15l-100 -33q49 -135 154 -240h872q104 104 154 240l-101 33q2 8 4 15t7 15l100 -32q20 74 24 151h-208q0 6 1 12.5t1 14.5q0 6 -1 12t-1 12h208q-4 82 -24 152l-100 -33q-4 8 -7 16l-4 17l101 33q-29 78 -70 135l-170 -121 q-12 20 -29 41l168 123q-49 61 -110 108l-62 -86q-6 4 -12 9.5t-14 11.5l63 84q-61 43 -137 71l-64 -198l-24 8l-27 8l66 199q-37 10 -74 15t-78 7v-106h-16h-17v106q-41 -2 -77.5 -7t-73.5 -15l65 -199q-14 -4 -26 -8l-25 -8l-63 198q-76 -29 -138 -71l64 -84 q-8 -6 -14 -11.5t-13 -9.5l-61 86q-61 -47 -111 -108l168 -123q-16 -20 -28 -41l-170 121q-41 -57 -70 -135l100 -33l-4 -17l-6 -16l-100 33q-23 -74 -23 -152h207q0 -6 -1 -12t-1 -12q0 -8 1 -14.5t1 -12.5h-207zM389 322l574 688l41 -31l-478 -758z" />
|
||||
<glyph unicode="Ò" d="M360 2253q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM550 1793q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48z M550 2712.5q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM673 2253q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86 t-157.5 -32t-157 32t-128 86t-87 128t-32 158zM788 2252.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM1011 1602v114 q0 29 19.5 47.5t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM1011 2789v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1390 1874q0 27 19 47 q20 18 46.5 18t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1390 2631.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1548 2253q0 29 18.5 47 t46.5 18h115q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5zM0 279l600 602q-15 55 -15 111q0 52 13 105q27 110 111 193q61 61 139 92t158.5 31t159.5 -31.5t141 -93.5q63 -63 95 -142t32 -160t-30 -159.5t-91 -140.5 q-86 -84 -195 -108q-50 -11 -100 -12l-117 16l-119 -123h-192v-146h-141v-145h-146v-148h-252q-27 2 -38 13.5t-11 40.5zM1026 1123q0 -46 33 -81q35 -35 81 -34.5t81 32.5q33 35 32.5 81t-34.5 79q-35 35 -81 35t-79 -33t-33 -79z" />
|
||||
<glyph unicode="Ô" d="M598 2253l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149zM0 279l600 602q-15 55 -15 111q0 52 13 105q27 110 111 193q61 61 139 92t158.5 31t159.5 -31.5t141 -93.5 q63 -63 95 -142t32 -160t-30 -159.5t-91 -140.5q-86 -84 -195 -108q-50 -11 -100 -12l-117 16l-119 -123h-192v-146h-141v-145h-146v-148h-252q-27 2 -38 13.5t-11 40.5zM1026 1123q0 -46 33 -81q35 -35 81 -34.5t81 32.5q33 35 32.5 81t-34.5 79q-35 35 -81 35t-79 -33 t-33 -79z" />
|
||||
<glyph unicode="Õ" d="M610 1536l222 385l221 385l223 -385l219 -385h-442h-443zM0 279l600 602q-15 55 -15 111q0 52 13 105q27 110 111 193q61 61 139 92t158.5 31t159.5 -31.5t141 -93.5q63 -63 95 -142t32 -160t-30 -159.5t-91 -140.5q-86 -84 -195 -108q-50 -11 -100 -12l-117 16 l-119 -123h-192v-146h-141v-145h-146v-148h-252q-27 2 -38 13.5t-11 40.5zM1026 1123q0 -46 33 -81q35 -35 81 -34.5t81 32.5q33 35 32.5 81t-34.5 79q-35 35 -81 35t-79 -33t-33 -79z" />
|
||||
<glyph unicode="Ù" d="M199 2253q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM389 1793q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48z M389 2712.5q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM512 2253q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86 t-157.5 -32t-157 32t-128 86t-87 128t-32 158zM627 2252.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM850 1602v114 q0 29 19.5 47.5t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM850 2789v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1229 1874q0 27 19 47 q20 18 46.5 18t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1229 2631.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1387 2253q0 29 18.5 47 t46.5 18h115q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5zM0 446q10 63 80 110.5t172 57.5v11q-33 20 -52.5 62t-19.5 95q0 72 36 123t89 51t90 -51t37 -123q0 -53 -20.5 -95t-53.5 -62v-11q29 -4 54.5 -10t48.5 -14 q-121 -53 -172 -144h-289zM303 326q6 43 35 88t74 84t104 66.5t127 33.5q2 6 2 16q-45 29 -71.5 86.5t-26.5 128.5q0 49 13 91.5t35.5 74t54.5 50t67 18.5t65.5 -18.5t54 -50t37 -73.5t13.5 -92q0 -72 -26.5 -129t-72.5 -86v-16q70 -6 129.5 -33.5t104.5 -66.5t73.5 -84 t34.5 -88h-827zM971 590q23 8 49.5 14t54.5 10v11q-33 20 -53.5 62t-20.5 95q0 72 37 123t90 51q51 0 89 -51t38 -123q0 -53 -20.5 -95t-52.5 -62v-11q102 -10 171.5 -57t80.5 -111h-289q-27 43 -71 80t-103 64z" />
|
||||
<glyph unicode="Û" d="M436 2253l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149zM0 446q10 63 80 110.5t172 57.5v11q-33 20 -52.5 62t-19.5 95q0 72 36 123t89 51t90 -51t37 -123 q0 -53 -20.5 -95t-53.5 -62v-11q29 -4 54.5 -10t48.5 -14q-121 -53 -172 -144h-289zM303 326q6 43 35 88t74 84t104 66.5t127 33.5q2 6 2 16q-45 29 -71.5 86.5t-26.5 128.5q0 49 13 91.5t35.5 74t54.5 50t67 18.5t65.5 -18.5t54 -50t37 -73.5t13.5 -92q0 -72 -26.5 -129 t-72.5 -86v-16q70 -6 129.5 -33.5t104.5 -66.5t73.5 -84t34.5 -88h-827zM971 590q23 8 49.5 14t54.5 10v11q-33 20 -53.5 62t-20.5 95q0 72 37 123t90 51q51 0 89 -51t38 -123q0 -53 -20.5 -95t-52.5 -62v-11q102 -10 171.5 -57t80.5 -111h-289q-27 43 -71 80t-103 64z" />
|
||||
<glyph unicode="à" d="M184 2273q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM374 1813q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48z M374 2732.5q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM497 2273q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86 t-157.5 -32t-157 32t-128 86t-87 128t-32 158zM612 2272.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM835 1622v114 q0 29 19.5 47.5t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM835 2809v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1214 1894q0 27 19 47 q20 18 46.5 18t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1214 2651.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1372 2273q0 29 18.5 47 t46.5 18h115q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5zM16 678q-15 18 -15 37t15 39q10 14 23 26l24 25q68 66 144 124t160 101q53 29 110.5 50.5t116.5 31.5q33 4 62.5 6t60.5 2t61.5 -2t61.5 -6q59 -10 116.5 -31.5 t110.5 -50.5q84 -43 161 -101.5t142 -123.5q14 -12 25.5 -24.5t23.5 -26.5q14 -19 14.5 -38.5t-14.5 -37.5q-35 -41 -74.5 -77t-80.5 -69q-90 -72 -191.5 -127t-214.5 -79q-66 -14 -141 -15q-72 0 -142 15q-113 25 -214 80t-191 126q-41 33 -80 69t-74 77zM442 716.5 q0 -57.5 21.5 -107.5t58.5 -88t87 -59.5t107.5 -21.5t107.5 21.5t87 59.5t58.5 88t21.5 107.5t-21.5 107.5t-58.5 87t-87 58.5t-107.5 21.5t-107.5 -21.5t-87 -58.5t-58.5 -87t-21.5 -107.5zM610 717q0 45 31 75.5t76 30.5t75.5 -30.5t30.5 -75.5t-30.5 -76t-75.5 -31 t-76 31t-31 76z" />
|
||||
<glyph unicode="â" d="M422 2273l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149zM16 678q-15 18 -15 37t15 39q10 14 23 26l24 25q68 66 144 124t160 101q53 29 110.5 50.5t116.5 31.5 q33 4 62.5 6t60.5 2t61.5 -2t61.5 -6q59 -10 116.5 -31.5t110.5 -50.5q84 -43 161 -101.5t142 -123.5q14 -12 25.5 -24.5t23.5 -26.5q14 -19 14.5 -38.5t-14.5 -37.5q-35 -41 -74.5 -77t-80.5 -69q-90 -72 -191.5 -127t-214.5 -79q-66 -14 -141 -15q-72 0 -142 15 q-113 25 -214 80t-191 126q-41 33 -80 69t-74 77zM442 716.5q0 -57.5 21.5 -107.5t58.5 -88t87 -59.5t107.5 -21.5t107.5 21.5t87 59.5t58.5 88t21.5 107.5t-21.5 107.5t-58.5 87t-87 58.5t-107.5 21.5t-107.5 -21.5t-87 -58.5t-58.5 -87t-21.5 -107.5zM610 717 q0 45 31 75.5t76 30.5t75.5 -30.5t30.5 -75.5t-30.5 -76t-75.5 -31t-76 31t-31 76z" />
|
||||
<glyph unicode="ã" d="M434 1557l222 385l221 385l223 -385l219 -385h-442h-443zM16 678q-15 18 -15 37t15 39q10 14 23 26l24 25q68 66 144 124t160 101q53 29 110.5 50.5t116.5 31.5q33 4 62.5 6t60.5 2t61.5 -2t61.5 -6q59 -10 116.5 -31.5t110.5 -50.5q84 -43 161 -101.5t142 -123.5 q14 -12 25.5 -24.5t23.5 -26.5q14 -19 14.5 -38.5t-14.5 -37.5q-35 -41 -74.5 -77t-80.5 -69q-90 -72 -191.5 -127t-214.5 -79q-66 -14 -141 -15q-72 0 -142 15q-113 25 -214 80t-191 126q-41 33 -80 69t-74 77zM442 716.5q0 -57.5 21.5 -107.5t58.5 -88t87 -59.5 t107.5 -21.5t107.5 21.5t87 59.5t58.5 88t21.5 107.5t-21.5 107.5t-58.5 87t-87 58.5t-107.5 21.5t-107.5 -21.5t-87 -58.5t-58.5 -87t-21.5 -107.5zM610 717q0 45 31 75.5t76 30.5t75.5 -30.5t30.5 -75.5t-30.5 -76t-75.5 -31t-76 31t-31 76z" />
|
||||
<glyph unicode="è" d="M82 2273q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM272 1813q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48z M272 2732.5q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM395 2273q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86 t-157.5 -32t-157 32t-128 86t-87 128t-32 158zM510 2272.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM733 1622v114 q0 29 19.5 47.5t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM733 2809v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1112 1894q0 27 19 47 q20 18 46.5 18t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1112 2651.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1270 2273q0 29 18.5 47 t46.5 18h115q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5zM0 877l539 12l178 510l178 -510l539 -12l-430 -324l155 -518l-442 307l-443 -307l156 518zM717 449l289 -201l-103 336l281 213l-350 8l-117 332v-688z" />
|
||||
<glyph unicode="ê" d="M322 2273l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149zM0 877l539 12l178 510l178 -510l539 -12l-430 -324l155 -518l-442 307l-443 -307l156 518zM717 449l289 -201 l-103 336l281 213l-350 8l-117 332v-688z" />
|
||||
<glyph unicode="ì" d="M70 2273q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM260 1813q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48z M260 2732.5q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM383 2273q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86 t-157.5 -32t-157 32t-128 86t-87 128t-32 158zM498 2272.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM721 1622v114 q0 29 19.5 47.5t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM721 2809v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1100 1894q0 27 19 47 q20 18 46.5 18t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1100 2651.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1258 2273q0 29 18.5 47 t46.5 18h115q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5zM0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -227t-228.5 -152.5t-278.5 -56.5 t-278.5 56.5t-228 152.5t-153.5 227t-56.5 278.5zM477 786q10 0 23.5 -2t26 -6t22.5 -7t16 -7q10 -4 16.5 -11.5t12.5 -15.5q12 -18 12 -41v-329q0 -29 -10 -39q-10 -16 -31 -23q-8 -2 -15 -4t-17.5 -2t-18.5 -1t-18 -3v-88h460v88q-10 2 -19 3t-17 5q-10 2 -17.5 4t-15.5 6 q-20 6 -31 23q-12 14 -12 39v467l-367 -8v-48zM561 1094q0 -55 43 -95q41 -39 103 -38q59 0 100 38.5t41 94t-41 94.5t-100 39q-61 0 -103 -39q-43 -41 -43 -94z" />
|
||||
<glyph unicode="î" d="M307 2273l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149zM0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5 t-56.5 -278.5t-154 -227t-228.5 -152.5t-278.5 -56.5t-278.5 56.5t-228 152.5t-153.5 227t-56.5 278.5zM477 786q10 0 23.5 -2t26 -6t22.5 -7t16 -7q10 -4 16.5 -11.5t12.5 -15.5q12 -18 12 -41v-329q0 -29 -10 -39q-10 -16 -31 -23q-8 -2 -15 -4t-17.5 -2t-18.5 -1t-18 -3 v-88h460v88q-10 2 -19 3t-17 5q-10 2 -17.5 4t-15.5 6q-20 6 -31 23q-12 14 -12 39v467l-367 -8v-48zM561 1094q0 -55 43 -95q41 -39 103 -38q59 0 100 38.5t41 94t-41 94.5t-100 39q-61 0 -103 -39q-43 -41 -43 -94z" />
|
||||
<glyph unicode="ñ" d="M581 1557l222 385l221 385l223 -385l219 -385h-442h-443zM0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t277.5 -56.5t227.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-227.5 -153.5t-277.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228 t-56.5 278.5zM31 717q0 -72 14 -137.5t39 -124.5l317 131q-27 66 -26 131q0 35 7 66.5t19 62.5l-317 133q-25 -59 -39 -125.5t-14 -136.5zM408 716.5q0 -63.5 24.5 -119.5t66.5 -98t98 -66.5t119.5 -24.5t120 24.5t98.5 66.5t66.5 98t24.5 119.5t-24.5 120t-66.5 98.5 t-98.5 66.5t-120 24.5t-119.5 -24.5t-98 -66.5t-66.5 -98.5t-24.5 -120zM453 84q125 -53 264 -53q137 0 262 53l-133 317q-31 -12 -62.5 -19t-66.5 -7q-66 0 -131 26zM453 1350l133 -320q59 27 131 27q70 0 129 -27l133 320q-121 51 -262 51q-143 0 -264 -51zM1030 586 l320 -131q51 125 51 262t-51 262l-320 -133q27 -59 27 -129q0 -72 -27 -131z" />
|
||||
<glyph unicode="ò" d="M70 2273q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM260 1813q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48z M260 2732.5q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM383 2273q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86 t-157.5 -32t-157 32t-128 86t-87 128t-32 158zM498 2272.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM721 1622v114 q0 29 19.5 47.5t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM721 2809v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1100 1894q0 27 19 47 q20 18 46.5 18t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1100 2651.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1258 2273q0 29 18.5 47 t46.5 18h115q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5zM0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5 t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM160 716.5q0 -114.5 44 -216t119.5 -177t177 -119.5t216 -44t216 44t177.5 119.5t120 177t44 216t-44 216t-120 177.5t-177.5 120t-216 44t-216 -44t-177 -120t-119.5 -177.5t-44 -216zM317 717q0 82 32 154.5t86 127 t127 86t155 31.5t154.5 -31.5t127 -86t86 -127t31.5 -154.5t-31.5 -155t-86 -127t-127 -86t-154.5 -32t-155 32t-127 86t-86 127t-32 155zM477 717q0 -49 19.5 -93t51.5 -76t76 -51.5t93 -19.5t93 19.5t76 51.5t51 76t19 93t-19 93t-51 76t-76 51t-93 19t-93 -19t-76 -51 t-51.5 -76t-19.5 -93zM637 717q0 35 22.5 57.5t57.5 22.5t57.5 -22.5t22.5 -57.5t-22.5 -57.5t-57.5 -22.5t-57.5 22.5t-22.5 57.5z" />
|
||||
<glyph unicode="ô" d="M307 2273l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149zM0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5 t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM160 716.5q0 -114.5 44 -216t119.5 -177t177 -119.5t216 -44t216 44t177.5 119.5t120 177t44 216t-44 216t-120 177.5t-177.5 120t-216 44t-216 -44t-177 -120 t-119.5 -177.5t-44 -216zM317 717q0 82 32 154.5t86 127t127 86t155 31.5t154.5 -31.5t127 -86t86 -127t31.5 -154.5t-31.5 -155t-86 -127t-127 -86t-154.5 -32t-155 32t-127 86t-86 127t-32 155zM477 717q0 -49 19.5 -93t51.5 -76t76 -51.5t93 -19.5t93 19.5t76 51.5t51 76 t19 93t-19 93t-51 76t-76 51t-93 19t-93 -19t-76 -51t-51.5 -76t-19.5 -93zM637 717q0 35 22.5 57.5t57.5 22.5t57.5 -22.5t22.5 -57.5t-22.5 -57.5t-57.5 -22.5t-57.5 22.5t-22.5 57.5z" />
|
||||
<glyph unicode="õ" d="M319 1557l222 385l221 385l223 -385l219 -385h-442h-443zM0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228 t-56.5 278.5zM160 716.5q0 -114.5 44 -216t119.5 -177t177 -119.5t216 -44t216 44t177.5 119.5t120 177t44 216t-44 216t-120 177.5t-177.5 120t-216 44t-216 -44t-177 -120t-119.5 -177.5t-44 -216zM317 717q0 82 32 154.5t86 127t127 86t155 31.5t154.5 -31.5t127 -86 t86 -127t31.5 -154.5t-31.5 -155t-86 -127t-127 -86t-154.5 -32t-155 32t-127 86t-86 127t-32 155zM477 717q0 -49 19.5 -93t51.5 -76t76 -51.5t93 -19.5t93 19.5t76 51.5t51 76t19 93t-19 93t-51 76t-76 51t-93 19t-93 -19t-76 -51t-51.5 -76t-19.5 -93zM637 717 q0 35 22.5 57.5t57.5 22.5t57.5 -22.5t22.5 -57.5t-22.5 -57.5t-57.5 -22.5t-57.5 22.5t-22.5 57.5z" />
|
||||
<glyph unicode="ù" d="M102 2273q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM292 1813q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48z M292 2732.5q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM415 2273q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86 t-157.5 -32t-157 32t-128 86t-87 128t-32 158zM530 2272.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM753 1622v114 q0 29 19.5 47.5t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM753 2809v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1132 1894q0 27 19 47 q20 18 46.5 18t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1132 2651.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1290 2273q0 29 18.5 47 t46.5 18h115q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5zM0 92q0 74 37 139.5t101.5 121t154.5 95t196 60.5q51 -37 107.5 -57.5t120 -20.5t120 20.5t107.5 57.5q106 -20 195.5 -60t155 -95.5t102.5 -121t37 -139.5h-1434z M422 938q0 84 22.5 157.5t62.5 129t94 87t115.5 31.5t115 -31.5t93.5 -87t63.5 -129t23.5 -157.5t-23.5 -158.5t-63.5 -130t-93.5 -87.5t-115 -32t-115.5 32t-94 87.5t-62.5 130t-22.5 158.5z" />
|
||||
<glyph unicode="û" d="M342 2273l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149zM0 92q0 74 37 139.5t101.5 121t154.5 95t196 60.5q51 -37 107.5 -57.5t120 -20.5t120 20.5t107.5 57.5 q106 -20 195.5 -60t155 -95.5t102.5 -121t37 -139.5h-1434zM422 938q0 84 22.5 157.5t62.5 129t94 87t115.5 31.5t115 -31.5t93.5 -87t63.5 -129t23.5 -157.5t-23.5 -158.5t-63.5 -130t-93.5 -87.5t-115 -32t-115.5 32t-94 87.5t-62.5 130t-22.5 158.5z" />
|
||||
<glyph unicode="Œ" horiz-adv-x="2867" d="M1551 0v59q0 100 19.5 195.5t56 180.5t89 157t117.5 125q-66 51 -118 122.5t-88.5 156.5t-56 180.5t-19.5 197.5v60h1200v-60q0 -102 -19.5 -197.5t-56.5 -180.5t-89 -156.5t-118 -122.5q131 -106 207 -280.5t76 -377.5v-59h-1200zM1672 117h958q-6 90 -28.5 174 t-60.5 154.5t-90 127t-114 93.5l-88 51l88 51q125 72 204 218.5t89 330.5h-958q12 -184 91 -330.5t203 -218.5l86 -51l-86 -51q-61 -37 -113 -93.5t-90 -127t-61.5 -154.5t-29.5 -174zM1825 219q31 72 68 137q33 55 78 110.5t102 84.5v2h2q2 0 2 2q20 12 34.5 54t16.5 92 q0 8 1 17q0 41 -9 80q-10 46 -39 64q-41 23 -74.5 66t-56.5 84q-27 49 -49 102h502q-23 -53 -49 -102q-25 -41 -59 -84t-75 -66q-29 -18 -38 -64q-8 -35 -8 -74v-23q3 -50 16.5 -92t34.5 -54q0 -2 2 -2h4v-2q55 -29 100 -84t78 -111q37 -66 67 -137h-651zM0 279l600 602 q-15 55 -15 111q0 52 13 105q27 110 111 193q61 61 139 92t158.5 31t159.5 -31.5t141 -93.5q63 -63 95 -142t32 -160t-30 -159.5t-91 -140.5q-86 -84 -195 -108q-50 -11 -100 -12l-117 16l-119 -123h-192v-146h-141v-145h-146v-148h-252q-27 2 -38 13.5t-11 40.5zM1026 1123 q0 -46 33 -81q35 -35 81 -34.5t81 32.5q33 35 32.5 81t-34.5 79q-35 35 -81 35t-79 -33t-33 -79z" />
|
||||
<glyph unicode="œ" horiz-adv-x="2867" d="M1434 877l539 12l178 510l178 -510l539 -12l-430 -324l155 -518l-442 307l-443 -307l156 518zM2151 449l289 -201l-103 336l281 213l-350 8l-117 332v-688zM0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5 t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM160 716.5q0 -114.5 44 -216t119.5 -177t177 -119.5t216 -44t216 44t177.5 119.5t120 177t44 216t-44 216t-120 177.5t-177.5 120t-216 44t-216 -44t-177 -120 t-119.5 -177.5t-44 -216zM317 717q0 82 32 154.5t86 127t127 86t155 31.5t154.5 -31.5t127 -86t86 -127t31.5 -154.5t-31.5 -155t-86 -127t-127 -86t-154.5 -32t-155 32t-127 86t-86 127t-32 155zM477 717q0 -49 19.5 -93t51.5 -76t76 -51.5t93 -19.5t93 19.5t76 51.5t51 76 t19 93t-19 93t-51 76t-76 51t-93 19t-93 -19t-76 -51t-51.5 -76t-19.5 -93zM637 717q0 35 22.5 57.5t57.5 22.5t57.5 -22.5t22.5 -57.5t-22.5 -57.5t-57.5 -22.5t-57.5 22.5t-22.5 57.5z" />
|
||||
<glyph unicode="ˆ" d="M0 717l360 207v-148h297v297h-147l207 361l209 -361h-150v-297h297v148l361 -207l-361 -209v149h-297v-297h150l-209 -360l-207 360h147v297h-297v-149z" />
|
||||
<glyph unicode="˜" d="M-398 123l222 385l221 385l223 -385l219 -385h-442h-443z" />
|
||||
<glyph unicode=" " horiz-adv-x="1495" />
|
||||
<glyph unicode=" " horiz-adv-x="2990" />
|
||||
<glyph unicode=" " horiz-adv-x="1495" />
|
||||
<glyph unicode=" " horiz-adv-x="2990" />
|
||||
<glyph unicode=" " horiz-adv-x="995" />
|
||||
<glyph unicode=" " horiz-adv-x="747" />
|
||||
<glyph unicode=" " horiz-adv-x="497" />
|
||||
<glyph unicode=" " horiz-adv-x="497" />
|
||||
<glyph unicode=" " horiz-adv-x="372" />
|
||||
<glyph unicode=" " horiz-adv-x="598" />
|
||||
<glyph unicode=" " horiz-adv-x="165" />
|
||||
<glyph unicode="‐" d="M0 633v168q0 23 16.5 40t38.5 17h1323q23 0 39.5 -17.5t16.5 -39.5v-168q0 -23 -16.5 -40.5t-39.5 -17.5h-1323q-23 0 -39 17.5t-16 40.5z" />
|
||||
<glyph unicode="‑" d="M0 633v168q0 23 16.5 40t38.5 17h1323q23 0 39.5 -17.5t16.5 -39.5v-168q0 -23 -16.5 -40.5t-39.5 -17.5h-1323q-23 0 -39 17.5t-16 40.5z" />
|
||||
<glyph unicode="‒" d="M0 633v168q0 23 16.5 40t38.5 17h1323q23 0 39.5 -17.5t16.5 -39.5v-168q0 -23 -16.5 -40.5t-39.5 -17.5h-1323q-23 0 -39 17.5t-16 40.5z" />
|
||||
<glyph unicode="–" horiz-adv-x="1024" d="M0 575v283h1024v-283h-1024z" />
|
||||
<glyph unicode="—" horiz-adv-x="2048" d="M0 575v283h2048v-283h-2048z" />
|
||||
<glyph unicode="‘" d="M0 717q0 29 19.5 47t46.5 18h114q29 0 47.5 -18.5t18.5 -46.5q0 -27 -18.5 -46.5t-47.5 -19.5h-114q-27 0 -46.5 19.5t-19.5 46.5zM190 257q0 28 19 46l82 82q20 18 47 18t47 -18q18 -20 18 -47t-18 -47l-82 -82q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 48zM190 1176.5 q0 27.5 19 48.5q20 18 48 18t46 -18l82 -82q18 -20 18 -47t-18 -47q-23 -18 -47 -19q-29 0 -47 19l-82 81q-19 19 -19 46.5zM313 717q0 82 32 155.5t87 129t128 87t157 31.5t157.5 -31.5t128 -87t86 -129t31.5 -155.5q0 -84 -31.5 -158t-86 -128t-128 -86t-157.5 -32 t-157 32t-128 86t-87 128t-32 158zM428 716.5q0 -59.5 22.5 -112.5t61.5 -92t92 -61.5t112.5 -22.5t113 22.5t92.5 61.5t61.5 92t22.5 112.5t-22.5 113t-61.5 92.5t-92.5 61.5t-113 22.5t-112.5 -22.5t-92 -61.5t-61.5 -92.5t-22.5 -113zM651 66v114q0 29 19.5 47.5 t46.5 18.5q29 0 47 -18.5t18 -47.5v-114q0 -27 -18.5 -46.5t-46.5 -19.5q-27 0 -46.5 19.5t-19.5 46.5zM651 1253v115q0 27 19.5 46.5t46.5 19.5q29 0 47 -19.5t18 -46.5v-115q0 -29 -18.5 -47t-46.5 -18q-27 0 -46.5 18t-19.5 47zM1030 338q0 27 19 47q20 18 46.5 18 t47.5 -18l82 -82q18 -18 18 -46t-18 -48q-23 -18 -47 -19q-29 0 -48 19l-81 82q-19 20 -19 47zM1030 1095.5q0 26.5 19 47.5l81 82q18 18 46 18t49 -18q18 -20 18 -48t-18 -47l-82 -81q-18 -18 -47 -19q-27 0 -47 19q-19 20 -19 46.5zM1188 717q0 29 18.5 47t46.5 18h115 q27 0 46.5 -18.5t19.5 -46.5q0 -27 -19.5 -46.5t-46.5 -19.5h-115q-29 0 -47 19.5t-18 46.5z" />
|
||||
<glyph unicode="’" d="M0 870q0 113 56.5 211.5t153.5 172t228 115.5t278.5 42t278.5 -42t228.5 -115.5t154 -172t56.5 -211t-56.5 -211t-154 -172t-228.5 -115.5t-278 -42h-12q-33 -49 -74 -97.5t-84 -90.5t-86 -73.5t-80 -45.5q47 59 72.5 125.5t25.5 138.5q0 16 -2 37.5t-6 37.5 q-102 29 -189 79.5t-149.5 116t-97.5 145t-35 167.5z" />
|
||||
<glyph unicode="“" d="M0 817q0 86 46 161t126 130t187.5 88t230.5 33t229.5 -33t186 -88t126 -130t46.5 -161t-46.5 -160.5t-126 -130t-186 -87t-229.5 -31.5q-23 0 -43.5 1t-40.5 3q-53 -68 -122 -125.5t-124 -79.5q82 94 82 201q0 8 -1 18t-3 20q-74 25 -136.5 63t-107.5 86t-69.5 104.5 t-24.5 117.5zM842 387q86 27 156.5 70t123 97t83 118.5t32.5 136.5q90 -31 143.5 -91.5t53.5 -133.5q0 -76 -57.5 -137.5t-149.5 -92.5q-4 -16 -4 -22q0 -63 51 -125q-35 14 -77 49t-75 76q-12 0 -25.5 -1t-27.5 -1q-129 0 -227 57z" />
|
||||
<glyph unicode="”" d="M0 817q0 86 46 161t126 130t187.5 88t230.5 33t229.5 -33t186 -88t126 -130t46.5 -161t-46.5 -160.5t-126 -130t-186 -87t-229.5 -31.5q-23 0 -43.5 1t-40.5 3q-53 -68 -122 -125.5t-124 -79.5q82 94 82 201q0 8 -1 18t-3 20q-74 25 -136.5 63t-107.5 86t-69.5 104.5 t-24.5 117.5zM842 387q86 27 156.5 70t123 97t83 118.5t32.5 136.5q90 -31 143.5 -91.5t53.5 -133.5q0 -76 -57.5 -137.5t-149.5 -92.5q-4 -16 -4 -22q0 -63 51 -125q-35 14 -77 49t-75 76q-12 0 -25.5 -1t-27.5 -1q-129 0 -227 57z" />
|
||||
<glyph unicode="…" horiz-adv-x="4300" d="M2955 0v1434h897l358 -359v-1075h-1255zM3047 88h1075v987h-270v268h-805v-1255zM1522 0v1434h897l358 -359v-1075h-1255zM1614 88h1075v987h-270v268h-805v-1255zM88 0v1434h897l358 -359v-1075h-1255zM180 88h1075v987h-270v268h-805v-1255z" />
|
||||
<glyph unicode=" " horiz-adv-x="598" />
|
||||
<glyph unicode="‹" d="M176 894q-12 93 9.5 181t75.5 164t138 127q84 49 177.5 61.5t181.5 -9t164.5 -76t126.5 -138.5q47 -78 61 -163t-1 -166.5t-59 -155.5t-112 -129l322 -471q6 -10 3 -23.5t-14 -19.5l-121 -72q-10 -8 -23 -4t-18 16l-268 506q-80 -31 -163 -33t-160.5 24t-144 77 t-111.5 127q-52 84 -64 177zM325.5 916.5q8.5 -62.5 43 -120t86 -95t112 -52t123 -6.5t119.5 43q57 33 94 85t52.5 111.5t7 123t-43 121t-86 94t-111.5 51t-122.5 6.5t-120 -43t-94.5 -86t-52.5 -110.5t-7 -122zM426 918v90h168v190h90v-190h190v-90h-190v-191h-90v191h-168 z" />
|
||||
<glyph unicode="›" d="M174 894q-12 93 10.5 181t76.5 164t138 127q84 49 177.5 61.5t181.5 -9t163.5 -76t127.5 -138.5q45 -78 59 -163t-1 -166.5t-58 -155.5t-113 -129l321 -471q8 -10 5.5 -23.5t-15.5 -19.5l-119 -72q-12 -8 -24 -4t-19 16l-266 506q-80 -31 -164 -33t-161.5 24t-144 77 t-111.5 127q-52 84 -64 177zM323.5 916.5q8.5 -62.5 43 -120t87 -95t112 -52t123 -6.5t120.5 43q57 33 94 85t51.5 111.5t6 123t-43 121t-86 94t-112 51t-122.5 6.5t-119.5 -43t-94.5 -86t-52.5 -110.5t-7 -122zM410 920v84h467v-84h-467z" />
|
||||
<glyph unicode=" " horiz-adv-x="747" />
|
||||
<glyph unicode="™" horiz-adv-x="2867" d="M1454 836q0 31 46.5 59.5t125 50t185 33.5t227.5 12t226.5 -12t184.5 -33.5t125 -50.5t46 -59v-21q98 -20 162.5 -86.5t64.5 -153.5q0 -51 -23.5 -96t-63.5 -78.5t-93 -53t-115 -19.5q-8 0 -14 1t-14 1q-70 -152 -191 -241t-295 -89q-150 0 -259 65.5t-182 179 t-108 266.5t-35 325zM1510 836q10 -10 43 -27.5t108 -36.5q78 -18 175.5 -27.5t202 -9.5t199.5 9.5t173 27.5q76 18 109.5 35.5t43.5 28.5q-10 10 -43.5 27.5t-109.5 35.5q-78 16 -173 26.5t-199.5 10.5t-202 -10.5t-175.5 -26.5q-76 -18 -108.5 -35.5t-42.5 -27.5z M1947 1222q5 24 25.5 44t59.5 32q-29 -29 -33 -55t5.5 -51t26.5 -48.5t32.5 -47t24 -47t-0.5 -48.5q-8 31 -21.5 50.5t-29.5 33t-31.5 24.5t-27.5 24q-18 18 -27 42q-5 14 -5 29q0 9 2 18zM2035 1339q0 22 11 41q12 20 41 35t76 19q-39 -27 -49 -55.5t-5 -57.5t19.5 -58.5 t25.5 -60.5t13 -61.5t-18 -59.5q0 41 -11.5 71t-28 53.5t-33.5 43t-28 39.5q-13 25 -13 51zM2550 391q104 8 152.5 60.5t48.5 113.5q0 47 -36 88t-99 58q-6 -88 -23.5 -168t-42.5 -152zM59 1094l43 180h392v72q0 35 25.5 61.5t62.5 26.5h270q37 0 62.5 -27t25.5 -61v-72h391 l43 -180h-106l-123 -1094h-856l-123 1094h-107zM338 932l76 -717h106l-76 717h-106zM563 1274h307v72q0 16 -18 16h-270q-18 0 -19 -16v-72zM657 215h119v717h-119v-717zM913 215h107l76 717h-107z" />
|
||||
<glyph unicode="" horiz-adv-x="1435" d="M0 1435h1435v-1435h-1435v1435z" />
|
||||
<glyph unicode="fi" horiz-adv-x="2867" d="M1434 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -227t-228.5 -152.5t-278.5 -56.5t-278.5 56.5t-228 152.5t-153.5 227t-56.5 278.5zM1911 786q10 0 23.5 -2t26 -6t22.5 -7t16 -7 q10 -4 16.5 -11.5t12.5 -15.5q12 -18 12 -41v-329q0 -29 -10 -39q-10 -16 -31 -23q-8 -2 -15 -4t-17.5 -2t-18.5 -1t-18 -3v-88h460v88q-10 2 -19 3t-17 5q-10 2 -17.5 4t-15.5 6q-20 6 -31 23q-12 14 -12 39v467l-367 -8v-48zM1995 1094q0 -55 43 -95q41 -39 103 -38 q59 0 100 38.5t41 94t-41 94.5t-100 39q-61 0 -103 -39q-43 -41 -43 -94zM0 877l541 12l176 510l178 -510l539 -12l-430 -326l155 -516l-442 307l-443 -307l156 516z" />
|
||||
<glyph unicode="fl" horiz-adv-x="2867" d="M1522 88v629q0 37 27.5 62.5t64.5 25.5h88v270q0 74 35 139.5t96.5 114.5t143.5 77t174 28t174 -28t142.5 -77t95 -114.5t34.5 -139.5v-270h92q35 0 61.5 -25.5t26.5 -62.5v-629q0 -35 -26.5 -61.5t-61.5 -26.5h-1075q-37 0 -64.5 26.5t-27.5 61.5zM1880 805h539v270 q0 41 -22.5 70t-40.5 43q-39 33 -88 47q-53 20 -117 20t-117 -20q-49 -14 -88 -47q-18 -14 -42 -43t-24 -70v-270zM0 877l541 12l176 510l178 -510l539 -12l-430 -326l155 -516l-442 307l-443 -307l156 516z" />
|
||||
<glyph unicode="ffi" horiz-adv-x="4300" d="M2867 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -227t-228.5 -152.5t-278.5 -56.5t-278.5 56.5t-228 152.5t-153.5 227t-56.5 278.5zM3344 786q10 0 23.5 -2t26 -6t22.5 -7t16 -7 q10 -4 16.5 -11.5t12.5 -15.5q12 -18 12 -41v-329q0 -29 -10 -39q-10 -16 -31 -23q-8 -2 -15 -4t-17.5 -2t-18.5 -1t-18 -3v-88h460v88q-10 2 -19 3t-17 5q-10 2 -17.5 4t-15.5 6q-20 6 -31 23q-12 14 -12 39v467l-367 -8v-48zM3428 1094q0 -55 43 -95q41 -39 103 -38 q59 0 100 38.5t41 94t-41 94.5t-100 39q-61 0 -103 -39q-43 -41 -43 -94zM1434 877l541 12l176 510l178 -510l539 -12l-430 -326l155 -516l-442 307l-443 -307l156 516zM0 877l541 12l176 510l178 -510l539 -12l-430 -326l155 -516l-442 307l-443 -307l156 516z" />
|
||||
<glyph unicode="ffl" horiz-adv-x="4300" d="M2955 88v629q0 37 27.5 62.5t64.5 25.5h88v270q0 74 35 139.5t96.5 114.5t143.5 77t174 28t174 -28t142.5 -77t95 -114.5t34.5 -139.5v-270h92q35 0 61.5 -25.5t26.5 -62.5v-629q0 -35 -26.5 -61.5t-61.5 -26.5h-1075q-37 0 -64.5 26.5t-27.5 61.5zM3313 805h539v270 q0 41 -22.5 70t-40.5 43q-39 33 -88 47q-53 20 -117 20t-117 -20q-49 -14 -88 -47q-18 -14 -42 -43t-24 -70v-270zM1434 877l541 12l176 510l178 -510l539 -12l-430 -326l155 -516l-442 307l-443 -307l156 516zM0 877l541 12l176 510l178 -510l539 -12l-430 -326l155 -516 l-442 307l-443 -307l156 516z" />
|
||||
</font>
|
||||
</defs></svg>
|
Before Width: | Height: | Size: 80 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,91 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="IcoMoonSocial" horiz-adv-x="1433" >
|
||||
<font-face units-per-em="2048" ascent="1536" descent="-512" />
|
||||
<missing-glyph horiz-adv-x="500" />
|
||||
<glyph unicode="1" d="M138 723q9 98 56.5 180t125 131t169.5 49q35 0 68 -9t63.5 -21.5t57.5 -22.5t49 -10q20 0 50 12t66 25.5t75.5 24t82.5 5.5q18 0 49 -5t68 -20t75 -43t71 -75q-4 -2 -29 -18.5t-53.5 -50t-51 -85t-22.5 -118.5q0 -82 30.5 -137.5t65.5 -89t66 -48.5l30 -16 q-2 -4 -24.5 -65.5t-73.5 -137.5q-23 -33 -46 -64.5t-50 -56t-56.5 -40t-66.5 -15.5t-62.5 8t-51 19.5t-54.5 20.5t-69.5 9t-70.5 -9t-55.5 -19.5t-51 -19.5t-58.5 -11q-35 0 -66.5 15.5t-59.5 42t-52.5 59.5t-46.5 65q-47 68 -85 158t-54.5 187.5t-7.5 195.5zM715 1104 q-8 61 16.5 120.5t59.5 100.5q41 47 99 77t111 32q8 -63 -14 -123t-59 -107q-39 -45 -95.5 -74.5t-117.5 -25.5z" />
|
||||
<glyph unicode="2" d="M0 274l127 437q14 4 37 14q35 12 85 25.5t109 17.5h27q92 0 193 -51q12 -8 25 -15.5t26 -15.5q-10 -29 -26.5 -87t-37 -125.5t-39 -132.5t-30.5 -105q-51 33 -115 59.5t-150 26.5q-51 0 -108 -11.5t-123 -36.5zM170 866l123 437q135 53 242 55q55 0 108 -12 q41 -10 86 -34t66 -34l-131 -444q-49 31 -110.5 56t-143.5 28q-107 -1 -240 -52zM614 166l125 440q45 -31 116 -58.5t173 -27.5q106 0 234 41l-121 -424q-152 -61 -269 -61q-37 0 -75.5 11t-74.5 26.5t-65 30t-43 22.5zM782 750l129 446q45 -33 115 -60.5t168 -27.5 q117 0 240 49l-125 -430l-4 -2v-2q-127 -55 -246 -55q-150 0 -277 82z" />
|
||||
<glyph unicode="3" d="M0 285l57 288h242l-25 -118l342 -131l396 131l55 274h-981l47 240h981l31 157h-979l47 240h1221l-113 -561l-16 -86l-86 -434l-654 -217z" />
|
||||
<glyph unicode="4" d="M330 1030l88 86l254 -254v572l430 -428l-287 -287l289 -287l-432 -432v575l-252 -253l-88 88l311 309zM795 295l135 137l-135 135v-272zM795 872l133 134l-133 133v-267z" />
|
||||
<glyph unicode="5" d="M84 1434h1266l-115 -1291l-520 -143l-516 143zM319 1169l43 -479h549l-18 -205l-176 -47h-2l-174 47l-13 127h-157l20 -247l324 -91h2l323 91l43 485h-575l-14 162h604l14 157h-793z" />
|
||||
<glyph unicode="6" d="M84 1434h1266l-115 -1291l-520 -143l-516 143zM203 1327l98 -1102l416 -114v-2l2 2v-2v2l416 114l98 1102h-1030zM319 1169h793l-14 -157h-604l14 -162h575l-43 -485l-323 -91h-2l-324 91l-20 247h157l13 -127l174 -47h2l176 47l18 205h-549z" />
|
||||
<glyph unicode="7" d="M0 717q0 55 20.5 102t56.5 83t83 56.5t102 20.5q49 0 92 -16.5t78 -44.5l479 241q0 4 -1 6t-1 6q0 55 20.5 102.5t56.5 83.5t83 56.5t102.5 20.5t102.5 -20.5t83 -56.5t56.5 -83t20.5 -103q0 -53 -20.5 -101t-56.5 -84t-83 -56.5t-103 -20.5q-49 0 -92 17.5t-78 46.5 l-477 -240v-16v-17l477 -239q35 29 78 46t92 17q55 0 102.5 -20.5t83.5 -56t56.5 -84t20.5 -101.5q0 -55 -20.5 -102t-56.5 -83t-83 -56.5t-102.5 -20.5t-102.5 20.5t-83 56.5t-56.5 83t-20.5 102q0 4 1 6t1 6l-479 242q-35 -29 -78 -45t-92 -16q-55 0 -102 20.5t-83 56 t-56.5 83t-20.5 102.5z" />
|
||||
<glyph unicode="8" d="M0 240v477v477q0 49 19.5 93t51 77t75.5 51.5t94 18.5h477h477q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-477v-477q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-477h-477q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM72 717h645v-645h477q72 0 120 48t48 120 v477h-645v645h-477q-72 0 -120 -48t-48 -120v-477z" />
|
||||
<glyph unicode="A" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM170 433q-2 -3 -2 -5q0 -5 6 -10q109 -98 246 -151.5t297 -53.5 q98 0 203.5 25.5t193.5 78.5q12 8 23.5 14.5t21.5 16.5q14 10 6 22.5t-24 4.5q-6 -2 -13.5 -4t-13.5 -4q-96 -39 -193.5 -56.5t-191.5 -17.5q-147 0 -286.5 38t-256.5 105q-10 4 -16 -3zM471 719q0 -90 50 -135t124 -45q25 0 45.5 2t38.5 6q29 10 55.5 27.5t55.5 48.5 q16 -23 26.5 -38.5t38.5 -37.5q18 -6 29 0q18 16 46 38.5t46 39.5q14 14 0 30q-16 23 -29.5 45.5t-13.5 63.5v184q0 59 -5 110.5t-48 90.5q-35 33 -84 46t-92 13h-25q-39 -2 -78 -12t-71.5 -31.5t-57 -54.5t-33.5 -80q-2 -14 5.5 -19t13.5 -5l113 -15q14 0 22 21 q8 35 31.5 51t54.5 20h8q18 0 37 -7t29 -21q12 -18 13 -42t1 -46v-15q-20 -4 -42.5 -4t-45.5 -4q-35 -4 -69.5 -11t-63.5 -24q-55 -23 -90 -70.5t-35 -119.5zM643 739q0 49 25.5 75t60.5 36q20 4 43 6t45 2v-24q0 -35 -2 -65t-20 -60q-23 -43 -66 -54q-4 0 -8 -1t-8 -1 q-35 0 -52.5 23.5t-17.5 62.5zM1067 410q10 2 21.5 3t25.5 1q29 4 57.5 2t36.5 -13q6 -6 4 -23.5t-8 -37.5t-13 -40.5t-13 -33.5q-4 -8 1 -10q2 -1 3 -1q4 0 10 3q37 33 54.5 81t17.5 77v8q0 14 -4 18q-8 8 -54 14q-12 1 -24 1q-34 0 -68 -10q-29 -10 -47 -23q-9 -5 -9 -10 q0 -6 9 -6z" />
|
||||
<glyph unicode="B" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM276 559q0 -59 23 -111.5t61.5 -90.5t91 -60.5t111.5 -22.5h309 q59 0 111.5 22.5t90.5 60.5t60.5 90.5t22.5 111.5v203q0 25 -17.5 41t-39.5 16h-49q-23 0 -38.5 15.5t-19.5 37.5q0 59 -22.5 111.5t-61.5 91.5t-91 61.5t-111 22.5h-144q-59 0 -111.5 -22.5t-91 -61.5t-61.5 -91t-23 -112v-313zM500 872.5q0 22.5 17.5 39t39.5 16.5h162 q23 0 38 -16.5t15 -39t-15.5 -39t-37.5 -16.5h-162q-23 0 -40 16.5t-17 39zM504 552.5q0 22.5 14 37t37 14.5h326q23 0 38 -14.5t15 -37t-15.5 -36.5t-37.5 -14h-326q-23 0 -37 14t-14 36.5z" />
|
||||
<glyph unicode="C" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM274 213h400v227l-150 84l29 47l121 -65v188h88v-119l106 48 l27 -48l-133 -63v-68l192 88l23 -47l-215 -100v-172h397l-440 1014z" />
|
||||
<glyph unicode="D" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM184 716.5q0 -110.5 42 -206.5t115 -169t169 -115t206.5 -42 t208 42t169 115t113.5 169t42 206.5t-42 208t-113.5 169t-169 113.5t-208 42t-206.5 -42t-169 -113.5t-115 -169t-42 -208zM279 717v16q131 8 240.5 22.5t201.5 43.5q10 -20 18.5 -39t18.5 -41q-104 -29 -196.5 -96.5t-178.5 -190.5q-49 57 -76.5 130t-27.5 155zM287 811 q23 98 84 176t147 123q47 -59 90 -118.5t78 -123.5q-94 -29 -194.5 -41t-204.5 -16zM446 371q70 106 153 173.5t187 98.5q57 -150 88 -336q-74 -31 -157 -31q-78 0 -146 25t-125 70zM604 1143q29 6 56.5 10t56.5 4q84 0 155.5 -28.5t131.5 -79.5q-104 -98 -232 -150 q-76 146 -168 244zM805 829q143 57 252 166q90 -111 98 -256q-82 10 -159 12h-11q-71 0 -141 -12q-10 23 -19.5 45t-19.5 45zM872 662q61 11 131.5 11t149.5 -11q-14 -98 -65.5 -179.5t-129.5 -132.5q-35 169 -86 312z" />
|
||||
<glyph unicode="E" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM88 524q47 -63 104.5 -108t129.5 -80q94 -43 181 -50 q41 -3 82 -4q48 0 97 5q94 8 185 46t177 113q66 59 100 122t48 128q9 -1 17 0q26 0 54 4q36 6 83 52q-25 -3 -49 -3q-12 0 -23 1q-35 2 -70 14q39 2 76 18q18 6 32.5 20.5t26.5 31.5q-8 -4 -15 -6.5t-17 -2.5q-25 -5 -50 -5q-34 0 -69 9q-6 51 -37 101q-45 72 -101.5 106.5 t-127.5 36.5q23 8 45 12.5t45 20.5q10 8 10 19.5t-21 7.5q-41 -10 -79 -25q35 14 45 45q-31 0 -51.5 -15.5t-43.5 -25.5q12 10 13 29q-37 -23 -68 -62t-55.5 -84t-42 -88t-27.5 -69q-47 45 -142 97t-276 122q-4 -23 2 -41q10 -35 33 -65.5t66 -53.5h-10q-30 0 -64 -10 q4 -16 9 -30.5t26 -37.5q20 -20 48 -34.5t60 -24.5q-35 4 -52 -6.5t-34 -24.5q6 -27 27 -42t43 -25q24 -12 55 -12q12 0 25 1q-31 -12 -41 -33q-16 -31 8 -55q23 -22 59 -21q8 0 17 1q-63 -63 -132 -85q-55 -17 -108 -18q-12 0 -24 1q-63 5 -115.5 29.5t-83.5 53.5z" />
|
||||
<glyph unicode="F" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-254v539h225v223h-225v115q0 29 15.5 48t31.5 19h178v221h-178q-55 0 -104 -22.5t-86 -62.5t-58.5 -93t-21.5 -115 v-110h-180v-223h180v-539h-477q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5z" />
|
||||
<glyph unicode="G" d="M0 88v96q49 59 132 97q79 35 171 35q5 0 10 -1q70 -4 125 -20q39 -29 72 -50.5t59.5 -44t44 -47t25.5 -55.5q4 -10 4 -24v-25v-24l-4 -25h-551q-35 0 -61.5 26.5t-26.5 61.5zM0 303v379q49 -43 114.5 -66.5t143.5 -23.5h25l20 2q-10 -23 -17 -46.5t-7 -47.5q0 -41 19 -75 t48 -63q-23 0 -43 -1t-43 -1q-145 0 -260 -57zM0 1202v141q0 37 26.5 64t61.5 27h1255q37 0 64 -27t27 -64v-268h-271v268h-88v-268h-270v-90h270v-268h88v268h271v-897q0 -35 -27 -61.5t-64 -26.5h-579q8 31 8 70q0 53 -9 97t-28.5 83t-53.5 73.5t-83 69.5 q-18 12 -40.5 30.5t-42 40t-34 44t-14.5 39.5q0 41 17.5 68.5t76.5 74.5q63 47 102 114.5t39 145.5q0 96 -40.5 177t-118.5 112h157l113 80h-500q-90 0 -171 -32t-142 -85zM57 954q-4 28 -3 55q0 33 5 63q10 54 37 94t66 63q36 21 80 20h8q49 -2 94 -26.5t82 -65.5t62.5 -97 t35.5 -120q3 -27 4 -52q0 -35 -7 -67q-11 -55 -37.5 -95t-65.5 -62q-36 -21 -80 -21h-8q-49 2 -94.5 26.5t-82 67.5t-62.5 98.5t-34 118.5z" />
|
||||
<glyph unicode="H" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM256 365q0 -80 68 -119q53 -29 137 -29q201 0 201 170 q0 102 -156 131q-37 2 -55 25q-12 14 -13 28q0 41 43 47q66 10 109 62q41 53 41 121q0 29 -8 47q14 4 24 7t21 7v111q-72 -25 -123 -25q-47 25 -99 25q-80 0 -129 -49q-55 -53 -55 -131q0 -53 31 -97q31 -47 61 -55v-4q-35 -12 -35 -76q0 -45 37 -69v-3q-100 -32 -100 -124z M369 370.5q0 57.5 88 57.5q92 0 92 -55q0 -59 -84 -60q-96 0 -96 57.5zM381 793q0 80 70 79q33 0 51 -24q14 -20 14 -55q0 -76 -65 -76q-70 0 -70 76zM705 1134.5q0 -32.5 24 -57.5q20 -23 53 -22q31 0 52 22q25 25 24.5 57.5t-24.5 57.5q-23 25 -52 25q-33 0 -53 -25 q-24 -25 -24 -57.5zM719 483h125q-2 12 -2 33v47v336v41l2 27h-125q2 -10 2 -27v-43v-340v-45zM897 862q10 2 19.5 3t15.5 1l16 -4v-194q0 -96 23 -136q31 -57 110 -57q55 0 97 23v108q-29 -18 -62 -18q-47 0 -47 74v202h47h14l15 -2h18v105h-94v47q0 12 1 23.5t3 21.5h-127 q2 -8 2 -21v-26v-45h-51v-105z" />
|
||||
<glyph unicode="I" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM211 1087.5q0 -47.5 32.5 -80t88.5 -32.5q59 0 91 32.5t32 79.5 q-2 47 -33 80t-88 33q-55 0 -89 -32.5t-34 -80zM223 233h217v654h-217v-654zM561 233h215v365q0 35 8 53q12 29 39 53.5t74 24.5q59 0 84 -41t25 -106v-349h217v375q0 150 -71 221.5t-179 71.5q-43 0 -75 -10t-55.5 -26.5t-40 -36t-26.5 -35.5v94h-215v-350v-304z" />
|
||||
<glyph unicode="J" d="M0 242v950q0 49 18.5 93t50 77t75.5 52.5t94 19.5h958q49 0 92 -19.5t76 -52.5t51.5 -77t18.5 -93v-950q0 -51 -18.5 -95.5t-51.5 -77t-76 -51t-92 -18.5h-958q-49 0 -93.5 18.5t-76 51t-50 77t-18.5 95.5zM43 1186h295v205h-100q-82 0 -138.5 -58.5t-56.5 -140.5v-6z M293 492h336v-322h176v322h336v190h-336v324h-176v-324h-336v-190zM381 1186h307v205h-307v-205zM733 1186h320v205h-320v-205zM1098 1186h293v6q0 41 -15.5 77t-42 63.5t-62.5 43t-75 15.5h-98v-205z" />
|
||||
<glyph unicode="K" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM233 717q0 -43 16.5 -82t45.5 -67.5t67.5 -45t81.5 -16.5 t82 16.5t68 45t45 67.5t16 82t-16 82t-45 67.5t-68 45t-82 16.5t-81.5 -16.5t-67.5 -45t-45.5 -67.5t-16.5 -82zM778 717q0 -43 16.5 -82t45 -67.5t67.5 -45t82 -16.5t82 16.5t67.5 45t45 67.5t16.5 82t-16.5 82t-45 67.5t-67.5 45t-82 16.5t-82 -16.5t-67.5 -45t-45 -67.5 t-16.5 -82z" />
|
||||
<glyph unicode="L" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM180 711q0 -68 25.5 -126.5t68.5 -101.5t101.5 -68.5 t124.5 -25.5q76 0 139 33t109 86l-43 94q-29 -55 -83.5 -90t-121.5 -35q-49 0 -91 18.5t-74 50.5t-50.5 74t-18.5 91t18.5 91t50.5 73.5t74 50t91 18.5q72 0 129 -39t84 -100l102 -234l12 -26q31 -72 79 -112t134 -40q92 0 153.5 52.5t61.5 136.5q0 78 -39.5 114.5 t-123.5 65.5q-31 10 -57.5 18t-45 18.5t-30 26t-11.5 39.5q0 35 24.5 58.5t63.5 23.5q55 0 90 -51l68 35q-51 94 -154 94q-80 0 -127 -45t-47 -117q0 -76 48.5 -113.5t142.5 -68.5q53 -16 81.5 -33.5t28.5 -62.5t-37 -77q-35 -30 -89 -30h-7q-59 4 -84.5 34t-48.5 79 q-18 39 -35.5 81t-33 76.5t-24.5 58t-11 28.5q-41 94 -119 145t-178 51q-66 0 -124.5 -25.5t-101.5 -68.5t-68.5 -101t-25.5 -124z" />
|
||||
<glyph unicode="M" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM82 588l8 -70q0 -4 6 -4q4 0 4 4l13 70l-13 69q0 4 -4 5 q-6 0 -6 -5zM154 588l12 -113q0 -4 4 -4q2 0 6 4l14 113l-14 112q-4 6 -6 7q-4 0 -4 -7zM223 586l13 -133q0 -8 6 -8.5t10 8.5l12 133l-12 141q-6 6 -10 6q-6 0 -6 -6zM295 586l12 -133q0 -10 8.5 -10.5t8.5 10.5l12 133l-12 131q0 8 -8.5 8t-8.5 -8zM367 586l10 -133 q0 -10 10 -11q6 0 10 11l11 133l-11 211q-4 10 -10 10q-10 0 -10 -10zM438 586l11 -133q0 -10 10 -10.5t10 10.5l12 133l-12 258q0 12 -10 12t-10 -12zM510 586l8 -131q0 -12 14 -13q10 0 11 13l10 131l-10 291q0 12 -11 12q-14 0 -14 -12zM582 586l8 -129q0 -14 14 -14.5 t14 14.5l9 129l-9 272q0 14 -14 14t-14 -14zM653 586l9 -127q0 -16 16 -17q6 0 12 5.5t6 11.5l6 127l-6 352q0 8 -6 13t-12 5q-16 0 -16 -18zM745 461q0 -18 17 -19q119 -2 215 -2h219q66 0 111 46t45 112t-45 111t-111 45q-35 0 -61 -13q-4 53 -28 99.5t-60.5 80t-84 53 t-102.5 19.5q-57 0 -98 -20q-16 -4 -17 -17v-495z" />
|
||||
<glyph unicode="P" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM223 717q0 -33 3 -64.5t14 -64.5l438 399l-186 170 q-125 -63 -197 -181t-72 -259zM256 532q31 -74 84 -135t121 -104v426zM514 264q94 -43 203 -43q70 0 137.5 19.5t124.5 56.5t104 89t78 116h-647v-238zM543 1180l377 -342v329q-47 23 -98.5 34t-104.5 11q-90 1 -174 -32zM973 553h211q29 82 28 164q0 129 -64.5 241.5 t-174.5 182.5v-588z" />
|
||||
<glyph unicode="Q" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM109 624q-9 -34 -9 -68q0 -47 17 -95q12 -31 30 -64l586 160 l-162 303q6 2 19 2q84 16 153 16h23q78 -3 136.5 -19.5t101.5 -42t71 -54.5l-201 -49l-83 133q-17 1 -36.5 1t-40.5 -1q-42 -2 -89 -12l147 -267l588 162q-6 10 -12.5 22.5t-16.5 22.5q-59 70 -157.5 110t-208.5 57q-104 16 -210 16h-13q-112 -1 -197 -13q-4 -2 -8.5 -2 t-8.5 -2l-53 96q-74 -10 -141 -30l51 -105q-119 -45 -197 -129q-59 -67 -79 -148zM315 575q-6 27 -6 54q0 37 12 73q19 63 105 111l90 -188z" />
|
||||
<glyph unicode="R" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM260 381q0 -49 35 -85t86 -36t87 36t36 85q0 51 -36 87t-87 36 t-86 -36t-35 -87zM260 688q86 0 164 -32.5t137 -94.5q61 -59 93 -137t32 -164h176q0 125 -47 234.5t-129 191.5t-191.5 129t-234.5 47v-174zM260 999q154 0 288 -58t233.5 -158.5t157.5 -234.5t58 -288h177q0 188 -72 355t-196 291t-290.5 196t-355.5 72v-175z" />
|
||||
<glyph unicode="S" d="M0 1030q0 82 30.5 153.5t84 125t125 84t153.5 30.5q59 0 113.5 -17t101.5 -46q27 4 52.5 6t54.5 2q135 0 255 -51t209 -140.5t141 -208t52 -253.5q0 -51 -8 -90q33 -47 51.5 -103.5t18.5 -118.5q0 -82 -31 -153.5t-84 -124.5t-125 -84t-154 -31q-117 0 -206 60 q-29 -4 -60 -7.5t-59 -3.5q-137 0 -257 51.5t-209 140.5t-141.5 208t-52.5 256q0 25 2 50.5t6 51.5q-63 94 -63 213zM321 487l-2 -16q0 -22 10 -49q13 -37 50 -72q33 -31 69.5 -55.5t83 -39.5t105.5 -22q36 -4 79 -3q29 0 60 1q78 4 148.5 38t118 85.5t64.5 115.5q7 26 7 51 q0 39 -16 79q-27 66 -77 104.5t-112.5 63.5t-134.5 39t-143.5 32.5t-90.5 53.5q-11 19 -11 39q0 15 7 30q15 34 60 59.5t102 25.5q55 0 99.5 -26t79 -54.5t62.5 -52t52 -19.5q27 2 48.5 20.5t28.5 47.5q3 11 3 22q0 20 -8 41q-12 35 -51 70q-70 59 -162 88q-68 21 -159 21 q-33 0 -68 -3q-53 -6 -102.5 -25.5t-89.5 -54.5t-66.5 -85t-32.5 -115q-1 -11 -1 -22q0 -54 26 -96q32 -50 85.5 -85t120 -57.5t127.5 -30.5q43 -6 90 -20.5t79 -37t39 -53.5q1 -5 1 -11q0 -27 -29 -60q-33 -37 -76 -48q-31 -7 -63 -7q-12 0 -24 1q-43 4 -80 18.5t-53.5 25 t-34 30.5t-39 39.5t-46 35t-55 13.5t-52 -21.5t-26.5 -48.5z" />
|
||||
<glyph unicode="T" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM358 653q0 -80 28 -149.5t77 -121.5t113.5 -82t138.5 -30h248 q47 0 79.5 33t32.5 80t-30.5 79t-77.5 32h-248q-27 0 -52.5 13t-45 34.5t-30.5 50.5t-11 61v64h383q47 0 79.5 32.5t32.5 80t-32.5 79t-79.5 31.5h-383v111q0 47 -31 79.5t-78 32.5t-80 -32.5t-33 -79.5v-398z" />
|
||||
<glyph unicode="U" d="M0 240v254v700q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-700v-254q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM45 627q31 41 77 65.5t101 24.5h987q55 0 101.5 -24.5 t77.5 -65.5v567q0 82 -56.5 138.5t-138.5 56.5h-954q-82 0 -138.5 -56.5t-56.5 -138.5v-567zM231 557h78v-377h72v377h76v64h-226v-64zM309 1298h84l53 -192h5l51 192h84l-97 -282v-201h-81v191zM492 233q0 -29 12 -43t32.5 -14t38.5 10q18 8 37 31v-37h64v324h-64v-244 q-10 -12 -20 -18q-6 -6 -17 -6q-12 0 -14 4q-4 8 -4 16v248h-65v-271zM590 905v187q0 41 31 65q27 25 79 25q45 0 74 -27q29 -25 29 -68v-182q0 -47 -29 -71q-29 -29 -78 -29q-45 0 -78 29q-28 28 -28 71zM666 899q0 -14 8 -22q6 -8 22 -9q14 0 23 9q10 10 10 22v195 q0 12 -10 18q-12 8 -22.5 8t-22.5 -8q-8 -6 -8 -18v-195zM741 180h66v27q12 -16 27 -23q8 -4 16 -5t18 -1q27 0 43 17q16 20 17 53v180q0 39 -17 61q-16 18 -47 19q-16 0 -30 -6q-6 -4 -13.5 -9.5t-13.5 -13.5v142h-66v-441zM807 242v202q8 8 12 11q6 2 15 2q12 0 20 -8 q6 -10 6 -25v-168q0 -14 -6 -20q-4 -8 -16 -9q-4 0 -17 4q-8 5 -14 11zM862 874v300h72v-275q0 -12 6 -18q2 -6 14 -7q10 0 19 9q10 4 24 18v273h72v-359h-72v39q-18 -18 -43 -33q-25 -10 -43 -10q-25 0 -37 14q-12 18 -12 49zM969 272q0 -47 24 -73q27 -27 70 -27 q51 0 72 27q25 20 24 73v17h-67v-15q0 -31 -5 -36q-8 -8 -24 -8.5t-21 10.5q-8 12 -8 34v62h125v82q0 43 -24 71q-25 25 -68 25q-39 0 -70 -27q-29 -27 -28 -69v-146zM1034 385v33q0 20 8 28q6 10 23 11q12 0 22 -11q4 -4 5 -28v-33h-58z" />
|
||||
<glyph unicode="V" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM291 887l35 -47q20 16 39 24q16 8 31.5 11.5t25.5 -7.5 q6 -6 16.5 -36.5t23.5 -73.5t28.5 -92.5t28.5 -94.5t25.5 -80.5t20.5 -52.5q10 -20 28.5 -41.5t42 -35t51.5 -15.5h5q25 0 53 19q31 18 89.5 68t120 123t113.5 163t71 190q5 26 4 48q0 35 -11 60q-19 40 -57 57q-28 13 -63 14q-10 0 -21 -2q-47 -5 -90 -29.5t-76.5 -67.5 t-44.5 -100q34 19 59 18h5q27 -2 41 -20.5t13 -49t-19 -65.5q-37 -72 -69 -113t-50 -41q-16 0 -31.5 45.5t-38.5 124.5q-10 43 -18 97.5t-21.5 100.5t-37.5 75q-18 22 -48 22q-9 0 -18 -2q-41 -10 -87 -40.5t-83 -65.5q-45 -39 -86 -88z" />
|
||||
<glyph unicode="W" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM86 717q0 -131 49 -246t135 -201t201 -135t246 -49t245.5 49 t200.5 135t135.5 201t49.5 246t-49.5 245.5t-135.5 200.5t-200.5 135.5t-245.5 49.5t-246 -49.5t-201 -135.5t-135 -200.5t-49 -245.5zM150 717q0 123 49 231l270 -741q-143 70 -231 205t-88 305zM242 1028q78 117 201.5 186.5t273.5 69.5q111 0 209 -39t174 -110h-8 q-41 0 -68 -30t-27 -71q0 -35 17.5 -66.5t38.5 -66.5q16 -29 31.5 -65.5t15.5 -90.5q0 -37 -12.5 -80.5t-30.5 -103.5l-56 -188l-204 610q12 0 22 1t20.5 1t20.5 2q12 2 17.5 9.5t4.5 16.5t-7.5 15t-18.5 6l-53 -4q-23 -2 -49 -2h-49h-48l-47 2l-53 4q-12 0 -18.5 -6 t-7.5 -15t4.5 -16.5t15.5 -9.5q8 -2 18 -2q8 0 19.5 -1t23.5 -1l88 -242l-125 -372l-206 614q12 0 23 1t21.5 1t20.5 2q12 2 17.5 9.5t4.5 16.5t-7.5 15t-18.5 6l-53 -4q-23 -2 -49 -2h-49h-37zM557 172l170 496l174 -480l4 -8q-90 -31 -188 -30q-80 -1 -160 22zM1001 227 l175 500q25 61 34 110.5t9 92.5q0 16 -1 30.5t-4 28.5q70 -123 70 -272q0 -158 -77 -288t-206 -202z" />
|
||||
<glyph unicode="X" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM403 809h134v-348q0 -33 4 -58.5t10 -44.5q14 -35 53 -67 q37 -31 88 -49q27 -8 49.5 -12.5t57.5 -4.5q31 0 58.5 3t51.5 8q51 14 117 43v155q-39 -23 -76 -36t-75.5 -13t-73.5 21q-29 16 -39 43q-4 12 -4 38v68v254h227v176h-227v229h-142q-6 -39 -14 -70.5t-20 -56.5q-25 -51 -68 -83q-20 -18 -51 -32t-60 -24v-139z" />
|
||||
<glyph unicode="Y" d="M0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM180 973h142q20 -16 64 -66.5t90 -107t81 -103.5t39 -57 q2 -10 3 -38t1 -58.5t-2 -55t-6 -28.5q-8 -8 -27.5 -12.5t-41 -5.5t-40.5 -1h-28l-9 -45h48l63 2h64l47 2h247l3 45q-8 2 -31 2h-47h-45l-29 3q-2 8 -3 36.5t-2 61.5t-1 60.5t2 33.5q6 16 47 55t90 79t92 71t53 33l25 6h80l43 65h-420l16 -65h115l-192 -174q-14 20 -38 51 t-51.5 65.5t-55 72.5t-52.5 73h143v65h-477v-65zM1104 401l33 -2l37 -4l8 70l-37 2l-41 4v-70zM1114 817l2 -299l64 -4l75 289q-6 0 -26.5 2t-44 4t-44 5t-26.5 3z" />
|
||||
<glyph unicode="a" d="M-1 521q7 9 19 3q154 -90 335.5 -139t375.5 -49q129 0 268.5 26.5t272.5 83.5q20 8 30.5 -7t-8.5 -29q-59 -43 -129.5 -77t-146.5 -56.5t-154 -34t-151 -11.5q-205 0 -386.5 72t-322.5 199q-6 6 -6 11q0 4 3 8zM403 711q0 72 36 121t89 73q49 20 110.5 27.5t113.5 11.5 v17q0 20 -1 43.5t-14 42.5q-10 16 -28.5 23t-36.5 7q-35 0 -61.5 -17.5t-35.5 -53.5q-4 -18 -18 -23l-115 14q-20 4 -18 23q10 51 36.5 87t63.5 56.5t79 29.5t85 9t93 -12t85 -47q43 -41 47.5 -92.5t4.5 -110.5v-184q0 -41 14 -63.5t31 -45.5q4 -8 5 -17t-5 -16 q-18 -14 -46 -37.5t-45 -39.5l-2 2q-14 -14 -26 -4q-29 25 -40 40t-28 39q-49 -51 -91 -68.5t-105 -17.5q-74 0 -125.5 45.5t-51.5 137.5zM575 731q0 -37 18.5 -60.5t53.5 -23.5q51 0 82 53q18 31 20.5 61t2.5 64v25q-31 0 -63 -4t-57.5 -17.5t-41 -37t-15.5 -60.5z M1161 498q0 7 8 14q33 25 75 34t80 9t66.5 -6t34.5 -14q5 -7 6 -29v-7q-1 -28 -12.5 -65t-32 -74.5t-51.5 -64.5q-7 -5 -12 -6q-3 0 -4 2q-6 4 -2 14q6 18 16 45t18.5 53.5t11.5 49t-5 32.5q-8 8 -30.5 11.5t-50.5 2.5t-56.5 -4t-46.5 -6q-13 -2 -13 9z" />
|
||||
<glyph unicode="b" d="M4 463v508q0 96 37 180t100.5 147.5t146.5 99.5t179 36h233q96 0 181.5 -36t148 -99.5t98 -147.5t35.5 -180v-2q4 -35 31 -60.5t63 -25.5h3h75q41 0 68 -27t27 -65v-328q0 -96 -37 -180t-99.5 -147.5t-147.5 -99.5t-179 -36h-500q-96 0 -180 36t-146.5 99.5t-99.5 147.5 t-37 180zM367 969q0 -37 26.5 -62.5t63.5 -25.5h262q37 0 62.5 25.5t25.5 62.5t-25.5 63.5t-62.5 26.5h-262q-37 0 -63.5 -26.5t-26.5 -63.5zM371 452.5q0 -34.5 25.5 -59t60.5 -24.5h526q35 0 59.5 24.5t24.5 59t-24.5 59.5t-59.5 25h-526q-35 0 -60.5 -25t-25.5 -59.5z " />
|
||||
<glyph unicode="c" d="M92 0l627 1434l622 -1434h-561v244l303 143l-32 70l-271 -127v94l187 90l-39 68l-148 -68v168h-125v-264l-170 90l-43 -66l213 -118v-324h-563z" />
|
||||
<glyph unicode="d" d="M2 716.5q0 147.5 56.5 278.5t152.5 228.5t227 154t278.5 56.5t278.5 -56.5t227.5 -154t153 -228.5t56.5 -278.5t-56.5 -278.5t-153 -228t-227.5 -153.5t-278.5 -56.5t-278.5 56.5t-227 153.5t-152.5 228t-56.5 278.5zM127 717q0 -111 38 -208t103 -175q113 166 238 256 t264 131q-10 29 -22.5 54.5t-24.5 51.5q-125 -39 -271.5 -58t-324.5 -30v-22zM139 842q141 6 275.5 23.5t259.5 54.5q-47 86 -102.5 166.5t-118.5 158.5q-121 -59 -203 -164.5t-111 -238.5zM354 250q76 -59 167 -92t196 -33q106 0 213 39q-43 252 -119 454 q-141 -43 -253 -133t-204 -235zM567 1288q125 -137 224 -325q86 35 164.5 85t146.5 115q-78 70 -176.5 108t-208.5 38q-82 -1 -150 -21zM838 868q12 -29 25.5 -59.5t23.5 -60.5q89 15 181 14h24q104 -2 215 -14q-12 199 -133 344q-72 -74 -155 -129.5t-181 -94.5zM926 643 q72 -195 114 -422q106 72 176 180.5t87 241.5q-104 12 -198 13h-12q-87 0 -167 -13z" />
|
||||
<glyph unicode="e" d="M0 496q35 -33 94.5 -59.5t130.5 -33.5q14 -1 29 -1q58 0 122 20q79 25 152 96q-10 -1 -18 -1q-44 0 -68 26q-20 19 -20 38q0 12 8 23q8 12 20.5 21.5t26.5 17.5q-15 -3 -29 -2q-32 0 -61 12q-27 14 -49.5 30.5t-28.5 45.5q16 18 37 29.5t60 7.5q-37 12 -69 28.5t-56 39.5 q-23 25 -29 42t-10 33q23 8 43 12.5t43 0.5q-51 29 -76 62.5t-37 74.5q-8 18 -4 45q104 -39 182 -73t134.5 -64.5t95.5 -58t65 -54.5q12 33 32.5 81t48.5 99t62.5 96.5t75.5 69.5q4 -16 -10 -33q25 12 47.5 29.5t56.5 17.5q-10 -35 -51 -51q51 20 92 29q23 4 24 -8.5 t-11 -22.5q-27 -16 -51.5 -22t-53.5 -15q82 -4 146.5 -42t115.5 -121q35 -55 43 -113q41 -13 84 -13q26 0 52 5q10 2 18 3t18 5q-16 -18 -30.5 -33.5t-36.5 -23.5q-23 -6 -43.5 -12.5t-42.5 -6.5q37 -14 78 -17q18 -1 35 -2l47 3q-53 -49 -94 -58q-32 -7 -64 -6h-16 q-16 -72 -55.5 -144.5t-112.5 -137.5q-98 -88 -203 -131t-213 -54q-58 -6 -114 -5q-45 0 -89 3q-98 8 -209 60q-162 76 -264 213z" />
|
||||
<glyph unicode="f" d="M332 664v274h219v137q0 74 26.5 139.5t71.5 114.5t105.5 77t128.5 28h219v-275h-219q-20 0 -38 -22.5t-18 -59.5v-139h275v-274h-275v-664h-276v664h-219z" />
|
||||
<glyph unicode="g" d="M0 332q0 51 28.5 100t78 87t117 60.5t145.5 22.5h63q-20 20 -34.5 46t-14.5 57q0 37 18 71h-34q-66 0 -118 20.5t-90 57.5t-58.5 87t-20.5 108q0 55 27.5 105t73.5 87t104.5 59.5t122.5 22.5h374l-84 -61h-118q59 -23 89.5 -84.5t30.5 -133.5q0 -59 -29.5 -109t-76.5 -87 q-45 -35 -57.5 -55.5t-12.5 -49.5q0 -12 10.5 -29.5t25.5 -33.5t32.5 -31.5t30.5 -23.5q74 -53 102.5 -107.5t28.5 -136.5q0 -51 -24.5 -99.5t-71 -86t-116 -61t-157.5 -23.5q-80 0 -149.5 15t-122 44t-83 70t-30.5 92zM135 371q0 -41 18.5 -77t51.5 -63.5t79 -44t99 -16.5 q152 0 213 56.5t61 140.5q0 10 -1 18t-3 18q-12 47 -52 78t-99 72q-23 6 -45.5 10t-46.5 4q-55 0 -104.5 -15t-87.5 -42t-60.5 -62.5t-22.5 -76.5zM217 1049q6 -47 24.5 -90.5t46 -75t62.5 -51t72 -19.5t65.5 16.5t48 47t27.5 71.5q5 23 5 50q0 20 -3 40q-6 47 -25.5 89 t-47 73t-61.5 50.5t-71 19.5h-8q-32 0 -57 -15q-29 -16 -49.5 -46.5t-27.5 -71.5q-4 -22 -4 -46q0 -20 3 -42zM887 1020v59h243v244h62v-244h242v-59h-242v-244h-62v244h-243z" />
|
||||
<glyph unicode="h" d="M55 211q0 133 144 178v4q-51 33 -52 101q0 90 52 110v2q-51 18 -88 80q-45 63 -45 141q0 109 79 189q78 70 185 69q74 0 141 -36q76 0 172 36v-161q-23 -6 -61 -19q14 -39 14 -65q0 -98 -59 -176q-59 -72 -156 -89q-63 -8 -64 -67q0 -20 21 -41q29 -31 78 -37 q223 -33 223 -186q0 -244 -289 -244q-121 0 -196 43q-99 51 -99 168zM219 219q0 -82 139 -82q121 0 121 84q0 82 -133 82q-127 0 -127 -84zM238 825q0 -109 98 -108q96 0 96 110q0 43 -22 78q-27 35 -74 35q-98 0 -98 -115zM702 1317q0 45 33 82q35 35 78 35q45 0 76 -35 q31 -31 31 -82t-31 -82q-31 -35 -76 -35q-43 0 -78 35q-33 37 -33 82zM723 487v490q0 37 1 59.5t1 38.5h176q-2 -16 -5 -38.5t-3 -57.5v-481q0 -41 3 -71t5 -46h-176q0 12 -1 40.5t-1 65.5zM973 926v149h78v64v39l-2 26h182q-4 -10 -6 -26.5t-2 -34.5v-68h135v-149 q-6 0 -11.5 -1t-15.5 1h-39h-69v-289q0 -104 69 -105q25 0 44.5 6.5t41.5 18.5v-156q-53 -31 -137 -30q-113 0 -158 82q-33 66 -32 192v285h-25h-22z" />
|
||||
<glyph unicode="i" d="M143 551q0 7 7 10q8 6 28 6q29 -4 50.5 -16t37.5 -27q18 -16 31 -37q27 -47 60.5 -65.5t67.5 -19.5t61.5 8.5t41.5 15.5q8 41 26.5 65.5t41.5 38.5q-96 12 -173 41t-130 81.5t-82 129t-29 185.5q0 72 24.5 130t65.5 103q-4 8 -9 28.5t-7 51.5q-1 9 -1 18q0 23 4 51 q5 38 24 83q10 3 21 2q16 0 36 -4q29 -6 75 -27t109 -62q109 29 219 29q100 0 197 -24q59 41 104.5 59t73.5 25q20 5 35 4q11 0 21 -2q28 -69 27 -122v-11q-3 -56 -13 -82q47 -47 75.5 -110t28.5 -140q0 -86 -16 -164t-59 -136.5t-120 -95t-200 -41.5q27 -18 49.5 -56 t22.5 -103v-226q0 -16 8 -30q6 -12 17.5 -24.5t31.5 -18.5q6 -6 10 -13q2 -4 0 -10t-14 -10h-13q-33 0 -59 8q-27 10 -48 30.5t-21 65.5v172q0 18 -2 35q-2 14 -7.5 28.5t-17.5 24.5v-278q0 -18 4 -37q4 -16 11.5 -31.5t21.5 -25.5q4 -10 4 -19q0 -6 -7 -10q-4 -2 -10.5 -2 t-15.5 2q-27 4 -49 21q-18 14 -34.5 39.5t-18.5 68.5l-2 285h-25l-2 -285q-2 -43 -18.5 -68.5t-34.5 -39.5q-23 -16 -49 -21q-10 -2 -17 -2t-10 2q-6 4 -6 10q0 8 6 19q12 10 19.5 25.5t11.5 31.5q4 18 6 37v283q-14 -10 -19.5 -24.5t-7.5 -31.5q-2 -18 -2 -37v-172 q0 -45 -22.5 -65.5t-48.5 -30.5q-26 -9 -57 -8h-13q-12 4 -14 10t2 10q4 6 10 13q18 6 29.5 18t17.5 25q8 14 10 30v158q-47 -10 -84 -10q-29 0 -52 6q-52 14 -81 39q-35 29 -49 70q-14 33 -28.5 55t-26.5 35q-14 14 -31 22q-29 20 -29 31zM324 825q0 -84 32.5 -134 t89 -76.5t133 -36t162.5 -9.5t162 5.5t132.5 30t89 75.5t32.5 145q0 80 -72 146q-29 25 -65.5 33t-81.5 8t-94 -5.5t-103 -5.5q-55 0 -105 5.5t-94 5.5t-81 -8.5t-66 -34.5q-33 -29 -52 -66t-19 -78zM428 813q0 53 25.5 89t62.5 36q35 0 60.5 -36t25.5 -89t-25.5 -89 t-60.5 -36q-37 0 -62.5 36t-25.5 89zM690 647q0 6 6 10q8 0 9 -6q10 -25 36.5 -24.5t36.5 24.5q2 6 10 6q4 -4 3 -10q-10 -35 -50 -35q-35 0 -51 35zM719 702q0 23 24 23q20 0 21 -23q0 -20 -21 -20q-24 0 -24 20zM893 813q0 53 25.5 89t62.5 36q35 0 60.5 -36t25.5 -89 t-25.5 -89t-60.5 -36q-37 0 -62.5 36t-25.5 89z" />
|
||||
<glyph unicode="j" d="M0 717v188h203q29 80 80 145.5t117.5 112.5t147.5 74t169 27q115 0 214 -43t173 -117l-123 -123q-51 51 -118.5 80t-145.5 29t-145.5 -30t-118 -80t-80 -118.5t-29.5 -144.5h-174h-170zM330 330l123 123q51 -51 118.5 -80t145.5 -29q76 0 144.5 29.5t118.5 80t80 118 t30 145.5h174h170v-189h-203q-29 -80 -80 -145.5t-117.5 -112.5t-147.5 -73.5t-169 -26.5q-115 0 -214 43t-173 117zM537 717q0 74 53 126t127 52t127 -52t53 -126t-53 -126t-127 -52t-127 52t-53 126z" />
|
||||
<glyph unicode="k" d="M0 717q0 63 24.5 120.5t67.5 100.5t99.5 67.5t121.5 24.5q63 0 121 -24.5t99.5 -67.5t66.5 -100.5t25 -120.5q0 -66 -25 -123t-66.5 -99t-99 -67t-121.5 -25q-66 0 -122 25t-99 67t-67.5 99t-24.5 123zM809 717q0 63 24.5 120.5t66.5 100.5t98.5 67.5t121.5 24.5 q63 0 120.5 -24.5t100.5 -67.5t68 -100.5t25 -120.5q0 -66 -25 -123t-68 -99t-100 -67t-121 -25q-66 0 -122 25t-98 67t-66.5 99t-24.5 123z" />
|
||||
<glyph unicode="l" d="M0 717q0 88 34 166t91 136t135 92t168 34q133 0 235.5 -68.5t157.5 -195.5q2 -4 15.5 -36t34 -78t44 -101.5t48.5 -108.5q29 -66 63.5 -106.5t114.5 -42.5q7 0 13 -1q69 0 114 38q49 42 49 102q0 31 -10.5 50t-28.5 33.5t-46 25t-63 20.5q-63 20 -110 42.5t-79 50.5 t-48.5 64.5t-16.5 86.5q0 98 62.5 156.5t169.5 58.5q72 0 122 -31t87 -92l-92 -47q-49 68 -121 67q-51 0 -83 -30.5t-32 -77.5q0 -35 14.5 -55.5t39 -34t59.5 -24.5t76 -24q111 -37 164 -88t53 -153q0 -55 -22.5 -101.5t-60.5 -80t-90.5 -52t-113.5 -18.5q-113 2 -177.5 54 t-107.5 151l-14 34l-137 312q-35 82 -112 132t-171 50q-66 0 -122 -24.5t-98 -65.5t-66.5 -98.5t-24.5 -120.5q0 -66 24.5 -122t66.5 -98t98 -66.5t122 -24.5q90 0 163 47t111 120l56 -127q-59 -72 -144.5 -114.5t-185.5 -42.5q-90 0 -168 33.5t-135 92t-91 136.5t-34 166z " />
|
||||
<glyph unicode="m" d="M0 571l10 78q2 6 6 6q6 0 7 -4l12 -80l-12 -79q0 -6 -7 -7q-4 0 -4 2t-2 5zM80 571l14 129q0 4 6 4.5t6 -4.5l17 -129l-17 -127q0 -6 -6 -6t-6 6zM162 571l12 156q0 8 8 8t8 -8l15 -156l-15 -153q0 -8 -8 -8t-8 8zM242 571l12 144q0 10 10 10q8 0 8 -8l15 -146l-15 -153 q0 -8 -8 -8q-10 0 -10 8zM324 571l10 236q0 12 10 12q12 0 12 -12l13 -236l-13 -153q0 -10 -10 -10q-12 0 -12 10zM403 571l11 291q0 10 12 10t12 -10l13 -291l-13 -153q0 -12 -12 -12t-12 12zM485 571l9 324q0 14 14 14t16 -14l8 -324l-8 -151q0 -14 -14 -14q-16 0 -16 14z M565 571l6 306q0 16 19 16q16 0 16 -16l8 -306l-8 -147q0 -18 -16 -18q-18 0 -19 18zM645 571l8 396q0 20 19 20q20 0 20 -20l8 -396l-6 -145q0 -18 -20.5 -18t-20.5 18zM750 428v559q0 12 18 19q51 23 111 22q61 0 115.5 -22.5t95 -60.5t67.5 -90t31 -112q31 14 69 15 q74 0 125.5 -51.5t51.5 -124.5q0 -37 -13.5 -69t-38 -55.5t-56.5 -37.5t-69 -14h-489q-18 4 -18 22z" />
|
||||
<glyph unicode="p" d="M0 717q0 100 26.5 195.5t78 178.5t123 149.5t161.5 113.5l273 -246l-635 -578q-12 47 -19.5 93.5t-7.5 93.5zM51 453l297 268v-617q-102 59 -178 148.5t-119 200.5zM424 63v343h936q-45 -92 -112.5 -167t-150.5 -128.5t-180.5 -82t-199.5 -28.5q-158 0 -293 63zM467 1386 q123 47 250 48q152 0 295 -64v-479zM1087 481v846q160 -98 253.5 -260t93.5 -350q0 -119 -41 -236h-306z" />
|
||||
<glyph unicode="q" d="M9 610q24 92 91 170q82 90 224 148l-58 116q39 14 79 22.5t83 14.5l59 -108q12 0 19 2q98 14 222 17q17 0 34 1l214 -17q124 -19 236.5 -65.5t190.5 -128.5q20 -23 31 -51l-670 -184l-168 305q55 8 102 12q24 2 46 2t42 -2l97 -153l227 57q-35 33 -83 62.5t-114.5 48 t-154.5 22.5q-15 1 -30 1q-77 0 -171 -17q-6 -2 -11 -2t-9 -2l186 -344l-670 -185q-23 37 -35 72q-19 55 -19 109q0 38 10 77zM238 629q0 -37 8 -72l227 55l-102 213q-49 -27 -78 -58.5t-42 -66t-13 -71.5z" />
|
||||
<glyph unicode="r" d="M0 193q0 39 15.5 73.5t41 60t60.5 41t73.5 15.5t73.5 -15.5t61.5 -41t41 -60.5t14.5 -73q0 -80 -55.5 -135.5t-135.5 -55.5q-39 0 -73.5 14.5t-60 41t-41 60.5t-15.5 75zM0 672v274q197 0 369 -74.5t300 -202.5t202.5 -300t74.5 -369h-274q0 135 -51.5 257t-145.5 218 q-98 96 -219 146.5t-256 50.5zM0 1159v275q197 0 380 -51.5t343 -144.5t291 -224t224 -291t144.5 -343t51.5 -380h-275q0 240 -91 451t-248.5 368.5t-368.5 248.5t-451 91z" />
|
||||
<glyph unicode="s" d="M0 731q0 68 48 116t116 48q59 0 106 -41q88 57 198 88t232 33l95 303q2 10 11 15t19 1l256 -57q16 37 50 60.5t75 23.5q57 0 97 -40t40 -95.5t-39.5 -96t-97.5 -40.5q-55 0 -94 40.5t-39 96.5v2l-237 53l-82 -266q117 -4 221 -36t188 -85q47 41 107 41q68 0 116 -48 t48 -116q0 -45 -21.5 -82t-56.5 -59q2 -10 3 -21.5t1 -23.5q0 -88 -50 -168t-143 -141q-92 -59 -206.5 -91t-243.5 -32t-244 31.5t-207 91.5q-92 61 -142 141t-50 168q0 23 6 45q-37 23 -58.5 59.5t-21.5 81.5zM51 731q0 -51 41 -86q35 102 135 178q-31 20 -63 21 q-47 0 -80 -33t-33 -80zM127 545q0 -78 46 -147.5t126 -122t187.5 -82t230.5 -29.5t230.5 29.5t187 82t126 122t46.5 147.5v26q-4 12 -6.5 24.5t-6.5 27.5q-33 94 -120 163q-10 8 -21.5 14.5t-22.5 14.5q-80 51 -186 80t-227 29t-227.5 -29t-186.5 -80q-10 -8 -21.5 -14 t-21.5 -15q-88 -70 -121 -163q-4 -14 -6 -26.5t-6 -25.5v-26zM406 623q0 41 27.5 68.5t68.5 27.5t69.5 -27.5t28.5 -68.5t-28.5 -70t-69.5 -29t-68.5 29t-27.5 70zM483 377q6 10 17.5 10t19.5 -6q37 -31 84 -45t112.5 -14t113 14t83.5 45q10 6 20.5 6t16.5 -10 q16 -20 -2 -39q-88 -70 -231.5 -70t-231.5 70q-10 10 -9 20q-1 9 7 19zM840 623q0 41 27.5 68.5t68.5 27.5t69.5 -27.5t28.5 -68.5t-28.5 -70t-69.5 -29t-68.5 29t-27.5 70zM1124 1186q0 -35 23.5 -59.5t58.5 -24.5t60.5 24.5t25.5 59.5t-25.5 59.5t-60.5 24.5t-58.5 -24.5 t-23.5 -59.5zM1206 823q100 -76 135 -178q41 35 41 86q0 47 -32.5 80t-79.5 33q-33 -1 -64 -21z" />
|
||||
<glyph unicode="t" d="M143 616v635q0 76 52.5 129.5t128.5 53.5q74 0 124 -53.5t50 -129.5v-176h612q76 0 128 -52t52 -128q0 -74 -52 -126t-128 -52h-612v-101q0 -51 18.5 -98t49 -83t71.5 -57.5t84 -21.5h395q74 0 124 -50t50 -126t-53 -128t-127 -52h-395q-119 0 -222.5 48t-181.5 132 t-123 195.5t-45 240.5z" />
|
||||
<glyph unicode="u" d="M127 365l2 -54l6 -69l8 -76l17 -68l24 -43q23 -20 107 -31.5t180 -15.5q111 -8 246 -8q131 0 244 8q47 2 94 6t87 10.5t68.5 13.5t38.5 17q23 23 33 77t16 112q6 68 9 145q-2 76 -9 143q-6 57 -16 110.5t-33 76.5q-10 10 -38.5 18t-68.5 14.5t-87 9.5t-94 7 q-113 6 -244 8q-135 -2 -246 -8q-47 -4 -94 -7t-86 -9.5t-67.5 -14.5t-39.5 -18q-23 -23 -35 -76t-16 -111q-7 -54 -6 -113v-30v-2v-22zM242 557v68h237v-68h-80v-397h-77v397h-80zM285 1434h88l55 -205h6l55 205h89l-103 -301v-213h-86v204zM510 217v287h68v-264 q0 -10 4 -19q4 -4 14 -4q8 0 18 6q6 4 11.5 9.5t11.5 9.5v262h68v-344h-68v39q-18 -23 -41 -35q-16 -8 -39 -8q-25 0 -37 14q-10 16 -10 47zM584 1016v196q0 41 30 72q31 25 84 25q47 0 78 -27q33 -27 33 -72v-194q0 -51 -31 -78q-33 -29 -82 -29q-53 0 -82 29 q-30 31 -30 78zM664 1010q0 -16 8 -25q6 -8 24 -8q16 0 23 8q10 8 10 25v207q0 12 -10 18q-6 8 -22.5 8t-24.5 -8t-8 -18v-207zM758 160v465h67v-150q14 14 31 25q20 8 31 8q33 0 51 -23q16 -23 16 -63v-191q0 -35 -16 -57q-16 -18 -47 -18q-20 0 -35 6q-8 4 -15 9t-16 15 v-26h-67zM825 225q8 -10 19 -12q8 -4 14 -4q12 0 19 8q6 4 6 23v178q0 20 -6 26q-6 8 -23 9q-8 0 -14 -2q-4 -4 -7.5 -6.5t-7.5 -6.5v-213zM870 983v315h78v-290q0 -12 6 -19q2 -6 15 -6q6 0 22 8q16 12 25 21v286h76v-378h-76v43q-20 -25 -47 -37q-25 -10 -43 -11 q-31 0 -41 17q-6 10 -10.5 21.5t-4.5 29.5zM991 256v156q0 43 29 71.5t76 28.5t71 -27q25 -25 25 -73v-90h-131v-64q0 -29 6 -37q8 -10 24.5 -10t24.5 8q6 8 6 39v16h70v-18q0 -53 -25 -80q-31 -27 -77 -26q-45 0 -74 28q-25 31 -25 78zM1061 377h61v35q0 20 -6 30 q-10 10 -24.5 10.5t-24.5 -10.5q-6 -10 -6 -30v-35z" />
|
||||
<glyph unicode="v" d="M0 1001q72 82 145 150q63 59 138 111.5t147 66.5q17 4 32 4q29 0 51 -13q34 -19 57.5 -58t38 -92.5t24.5 -111t19.5 -114.5t21.5 -104q35 -139 60.5 -214t56.5 -75q29 0 82 69.5t116 188.5q32 61 32 116q0 49 -23 79q-24 31 -68 34q-5 0 -9 1q-42 0 -98 -33 q16 98 72.5 170.5t130.5 113.5t154 50q19 2 37 3q57 0 104 -22q61 -29 94 -97q20 -42 20 -101q0 -37 -8 -81q-20 -113 -68 -219t-110.5 -201.5t-133.5 -177.5t-137.5 -146.5t-123.5 -109.5t-90 -67q-47 -30 -90 -30h-8q-47 3 -87 26.5t-71 59.5t-47 71q-12 27 -32.5 87 t-44.5 137t-48.5 161t-48 155.5t-42 122t-28.5 62.5q-16 16 -41.5 12t-52.5 -18q-31 -16 -64 -41z" />
|
||||
<glyph unicode="w" d="M0 716.5q0 147.5 56.5 278.5t153.5 228.5t228 154t278.5 56.5t278.5 -56.5t228.5 -154t154 -228.5t56.5 -278.5t-56.5 -278.5t-154 -228t-228.5 -153.5t-278.5 -56.5t-278.5 56.5t-228 153.5t-153.5 228t-56.5 278.5zM33 716.5q0 -141.5 54 -266t146.5 -217t217 -146.5 t266 -54t266.5 54t217 146.5t146.5 217t54.5 266t-54.5 266.5t-146.5 217t-217 146.5t-266.5 54.5t-266 -54.5t-217 -146.5t-146.5 -217t-54 -266.5zM102 717q0 133 54 250l293 -803q-78 37 -141.5 93t-108.5 128t-71 156t-26 176zM203 1055q84 125 218 200.5t296 75.5 q121 0 226.5 -43t189.5 -119q-2 0 -4.5 1t-4.5 1q-47 0 -75.5 -33.5t-28.5 -74.5q0 -39 18.5 -74t42.5 -71q18 -31 35 -71t17 -99q0 -39 -14.5 -87.5t-33.5 -111.5l-61 -205l-223 662h26l25 2l20 4q12 2 17.5 10t5.5 17.5t-7 16.5t-20 7l-57 -4q-25 -2 -54.5 -3t-52 -1 t-51 1t-53.5 3l-57 4q-12 0 -19.5 -8t-8.5 -17.5t4 -17.5t18 -8l20 -4l21 -2h24l96 -263l-135 -405l-223 668h27l22 2l21 4q12 2 18 10t5 17.5t-7 16.5t-18 7q-31 -2 -60 -4q-25 -2 -53.5 -3t-52.5 -1h-39zM543 127l186 535l186 -517l5 -10q-47 -16 -98.5 -24.5t-104.5 -8.5 q-92 0 -174 25zM1026 184l188 545q27 66 36.5 119t9.5 100v31l-5 33q76 -135 76 -295q0 -172 -84 -311.5t-221 -221.5z" />
|
||||
<glyph unicode="x" d="M262 846v203l86 34l76 45q61 51 96 123q35 68 51 183h205v-332h330v-256h-330v-367v-102l6 -53q14 -37 56 -62q43 -29 108 -29q111 0 217 70v-225q-92 -43 -166 -62q-39 -8 -78.5 -12t-82.5 -4q-49 0 -83 6t-71 19q-78 25 -131 71q-51 45 -74 97q-20 57 -20 151v502h-195 z" />
|
||||
<glyph unicode="y" d="M0 1059v86h639v-86h-193q33 -47 70 -97.5t74 -97.5t67 -86l52 -67l256 231h-154l-20 88h559l-58 -88h-104q-10 -4 -18.5 -5t-14.5 -3q-8 -2 -38 -22.5t-70.5 -51.5t-86 -66.5t-84 -70.5t-66.5 -64.5t-34 -44.5q-2 -6 -2 -42.5t2 -79.5t3 -82t3 -50q8 -2 37 -2h62l65 -2 l39 -2l-4 -63q-10 0 -48 1t-87 1h-103h-94q-23 0 -62.5 -1t-84.5 -2t-84 -1h-62l11 59h39l53 2l57 6l35 17q6 6 8 39.5t2 74.5t-1 78t-3 49q-4 8 -26.5 41t-57.5 77t-77 95.5t-82 98.5t-73.5 82.5t-52.5 50.5h-188zM1233 295v94l55 -6l49 -2l-14 -92l-45 4zM1245 850 q8 -2 36 -5t59.5 -6t59 -5.5t34.5 -2.5l-101 -387l-86 9z" />
|
||||
<glyph unicode="ª" d="M-1 521q7 9 19 3q154 -90 335.5 -139t375.5 -49q129 0 268.5 26.5t272.5 83.5q20 8 30.5 -7t-8.5 -29q-59 -43 -129.5 -77t-146.5 -56.5t-154 -34t-151 -11.5q-205 0 -386.5 72t-322.5 199q-6 6 -6 11q0 4 3 8zM403 711q0 72 36 121t89 73q49 20 110.5 27.5t113.5 11.5 v17q0 20 -1 43.5t-14 42.5q-10 16 -28.5 23t-36.5 7q-35 0 -61.5 -17.5t-35.5 -53.5q-4 -18 -18 -23l-115 14q-20 4 -18 23q10 51 36.5 87t63.5 56.5t79 29.5t85 9t93 -12t85 -47q43 -41 47.5 -92.5t4.5 -110.5v-184q0 -41 14 -63.5t31 -45.5q4 -8 5 -17t-5 -16 q-18 -14 -46 -37.5t-45 -39.5l-2 2q-14 -14 -26 -4q-29 25 -40 40t-28 39q-49 -51 -91 -68.5t-105 -17.5q-74 0 -125.5 45.5t-51.5 137.5zM575 731q0 -37 18.5 -60.5t53.5 -23.5q51 0 82 53q18 31 20.5 61t2.5 64v25q-31 0 -63 -4t-57.5 -17.5t-41 -37t-15.5 -60.5z M1161 498q0 7 8 14q33 25 75 34t80 9t66.5 -6t34.5 -14q5 -7 6 -29v-7q-1 -28 -12.5 -65t-32 -74.5t-51.5 -64.5q-7 -5 -12 -6q-3 0 -4 2q-6 4 -2 14q6 18 16 45t18.5 53.5t11.5 49t-5 32.5q-8 8 -30.5 11.5t-50.5 2.5t-56.5 -4t-46.5 -6q-13 -2 -13 9z" />
|
||||
<glyph unicode="²" d="M0 274l127 437q14 4 37 14q35 12 85 25.5t109 17.5h27q92 0 193 -51q12 -8 25 -15.5t26 -15.5q-10 -29 -26.5 -87t-37 -125.5t-39 -132.5t-30.5 -105q-51 33 -115 59.5t-150 26.5q-51 0 -108 -11.5t-123 -36.5zM170 866l123 437q135 53 242 55q55 0 108 -12 q41 -10 86 -34t66 -34l-131 -444q-49 31 -110.5 56t-143.5 28q-107 -1 -240 -52zM614 166l125 440q45 -31 116 -58.5t173 -27.5q106 0 234 41l-121 -424q-152 -61 -269 -61q-37 0 -75.5 11t-74.5 26.5t-65 30t-43 22.5zM782 750l129 446q45 -33 115 -60.5t168 -27.5 q117 0 240 49l-125 -430l-4 -2v-2q-127 -55 -246 -55q-150 0 -277 82z" />
|
||||
<glyph unicode="³" d="M0 285l57 288h242l-25 -118l342 -131l396 131l55 274h-981l47 240h981l31 157h-979l47 240h1221l-113 -561l-16 -86l-86 -434l-654 -217z" />
|
||||
<glyph unicode="¹" d="M138 723q9 98 56.5 180t125 131t169.5 49q35 0 68 -9t63.5 -21.5t57.5 -22.5t49 -10q20 0 50 12t66 25.5t75.5 24t82.5 5.5q18 0 49 -5t68 -20t75 -43t71 -75q-4 -2 -29 -18.5t-53.5 -50t-51 -85t-22.5 -118.5q0 -82 30.5 -137.5t65.5 -89t66 -48.5l30 -16 q-2 -4 -24.5 -65.5t-73.5 -137.5q-23 -33 -46 -64.5t-50 -56t-56.5 -40t-66.5 -15.5t-62.5 8t-51 19.5t-54.5 20.5t-69.5 9t-70.5 -9t-55.5 -19.5t-51 -19.5t-58.5 -11q-35 0 -66.5 15.5t-59.5 42t-52.5 59.5t-46.5 65q-47 68 -85 158t-54.5 187.5t-7.5 195.5zM715 1104 q-8 61 16.5 120.5t59.5 100.5q41 47 99 77t111 32q8 -63 -14 -123t-59 -107q-39 -45 -95.5 -74.5t-117.5 -25.5z" />
|
||||
<glyph unicode=" " horiz-adv-x="716" />
|
||||
<glyph unicode=" " />
|
||||
<glyph unicode=" " horiz-adv-x="716" />
|
||||
<glyph unicode=" " />
|
||||
<glyph unicode=" " horiz-adv-x="477" />
|
||||
<glyph unicode=" " horiz-adv-x="358" />
|
||||
<glyph unicode=" " horiz-adv-x="237" />
|
||||
<glyph unicode=" " horiz-adv-x="237" />
|
||||
<glyph unicode=" " horiz-adv-x="178" />
|
||||
<glyph unicode=" " horiz-adv-x="286" />
|
||||
<glyph unicode=" " horiz-adv-x="77" />
|
||||
<glyph unicode="–" horiz-adv-x="1024" d="M205 512v205h614v-205h-614z" />
|
||||
<glyph unicode="—" horiz-adv-x="2048" d="M205 512v205h1638v-205h-1638z" />
|
||||
<glyph unicode=" " horiz-adv-x="286" />
|
||||
<glyph unicode=" " horiz-adv-x="358" />
|
||||
<glyph unicode="™" horiz-adv-x="2867" d="M1434 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5zM1516 588l8 -70q0 -4 6 -4q4 0 4 4l13 70l-13 69q0 4 -4 5 q-6 0 -6 -5zM1588 588l12 -113q0 -4 4 -4q2 0 6 4l14 113l-14 112q-4 6 -6 7q-4 0 -4 -7zM1657 586l13 -133q0 -8 6 -8.5t10 8.5l12 133l-12 141q-6 6 -10 6q-6 0 -6 -6zM1729 586l12 -133q0 -10 8.5 -10.5t8.5 10.5l12 133l-12 131q0 8 -8.5 8t-8.5 -8zM1801 586l10 -133 q0 -10 10 -11q6 0 10 11l11 133l-11 211q-4 10 -10 10q-10 0 -10 -10zM1872 586l11 -133q0 -10 10 -10.5t10 10.5l12 133l-12 258q0 12 -10 12t-10 -12zM1944 586l8 -131q0 -12 14 -13q10 0 11 13l10 131l-10 291q0 12 -11 12q-14 0 -14 -12zM2016 586l8 -129 q0 -14 14 -14.5t14 14.5l9 129l-9 272q0 14 -14 14t-14 -14zM2087 586l9 -127q0 -16 16 -17q6 0 12 5.5t6 11.5l6 127l-6 352q0 8 -6 13t-12 5q-16 0 -16 -18zM2179 461q0 -18 17 -19q119 -2 215 -2h219q66 0 111 46t45 112t-45 111t-111 45q-35 0 -61 -13q-4 53 -28 99.5 t-60.5 80t-84 53t-102.5 19.5q-57 0 -98 -20q-16 -4 -17 -17v-495zM0 240v954q0 49 19.5 93t51 77t75.5 51.5t94 18.5h954q49 0 93 -18.5t77 -51.5t51.5 -77t18.5 -93v-954q0 -49 -18.5 -93.5t-51.5 -77t-77 -51t-93 -18.5h-954q-49 0 -93.5 18.5t-76 51t-51 77t-19.5 93.5z M358 653q0 -80 28 -149.5t77 -121.5t113.5 -82t138.5 -30h248q47 0 79.5 33t32.5 80t-30.5 79t-77.5 32h-248q-27 0 -52.5 13t-45 34.5t-30.5 50.5t-11 61v64h383q47 0 79.5 32.5t32.5 80t-32.5 79t-79.5 31.5h-383v111q0 47 -31 79.5t-78 32.5t-80 -32.5t-33 -79.5v-398z " />
|
||||
<glyph unicode="" horiz-adv-x="1435" d="M0 1435h1435v-1435h-1435v1435z" />
|
||||
<glyph unicode="fi" horiz-adv-x="2867" d="M1577 551q0 7 7 10q8 6 28 6q29 -4 50.5 -16t37.5 -27q18 -16 31 -37q27 -47 60.5 -65.5t67.5 -19.5t61.5 8.5t41.5 15.5q8 41 26.5 65.5t41.5 38.5q-96 12 -173 41t-130 81.5t-82 129t-29 185.5q0 72 24.5 130t65.5 103q-4 8 -9 28.5t-7 51.5q-1 9 -1 18q0 23 4 51 q5 38 24 83q10 3 21 2q16 0 36 -4q29 -6 75 -27t109 -62q109 29 219 29q100 0 197 -24q59 41 104.5 59t73.5 25q20 5 35 4q11 0 21 -2q28 -69 27 -122v-11q-3 -56 -13 -82q47 -47 75.5 -110t28.5 -140q0 -86 -16 -164t-59 -136.5t-120 -95t-200 -41.5q27 -18 49.5 -56 t22.5 -103v-226q0 -16 8 -30q6 -12 17.5 -24.5t31.5 -18.5q6 -6 10 -13q2 -4 0 -10t-14 -10h-13q-33 0 -59 8q-27 10 -48 30.5t-21 65.5v172q0 18 -2 35q-2 14 -7.5 28.5t-17.5 24.5v-278q0 -18 4 -37q4 -16 11.5 -31.5t21.5 -25.5q4 -10 4 -19q0 -6 -7 -10q-4 -2 -10.5 -2 t-15.5 2q-27 4 -49 21q-18 14 -34.5 39.5t-18.5 68.5l-2 285h-25l-2 -285q-2 -43 -18.5 -68.5t-34.5 -39.5q-23 -16 -49 -21q-10 -2 -17 -2t-10 2q-6 4 -6 10q0 8 6 19q12 10 19.5 25.5t11.5 31.5q4 18 6 37v283q-14 -10 -19.5 -24.5t-7.5 -31.5q-2 -18 -2 -37v-172 q0 -45 -22.5 -65.5t-48.5 -30.5q-26 -9 -57 -8h-13q-12 4 -14 10t2 10q4 6 10 13q18 6 29.5 18t17.5 25q8 14 10 30v158q-47 -10 -84 -10q-29 0 -52 6q-52 14 -81 39q-35 29 -49 70q-14 33 -28.5 55t-26.5 35q-14 14 -31 22q-29 20 -29 31zM1758 825q0 -84 32.5 -134 t89 -76.5t133 -36t162.5 -9.5t162 5.5t132.5 30t89 75.5t32.5 145q0 80 -72 146q-29 25 -65.5 33t-81.5 8t-94 -5.5t-103 -5.5q-55 0 -105 5.5t-94 5.5t-81 -8.5t-66 -34.5q-33 -29 -52 -66t-19 -78zM1862 813q0 53 25.5 89t62.5 36q35 0 60.5 -36t25.5 -89t-25.5 -89 t-60.5 -36q-37 0 -62.5 36t-25.5 89zM2124 647q0 6 6 10q8 0 9 -6q10 -25 36.5 -24.5t36.5 24.5q2 6 10 6q4 -4 3 -10q-10 -35 -50 -35q-35 0 -51 35zM2153 702q0 23 24 23q20 0 21 -23q0 -20 -21 -20q-24 0 -24 20zM2327 813q0 53 25.5 89t62.5 36q35 0 60.5 -36t25.5 -89 t-25.5 -89t-60.5 -36q-37 0 -62.5 36t-25.5 89zM332 664v274h219v137q0 74 26.5 139.5t71.5 114.5t105.5 77t128.5 28h219v-275h-219q-20 0 -38 -22.5t-18 -59.5v-139h275v-274h-275v-664h-276v664h-219z" />
|
||||
<glyph unicode="fl" horiz-adv-x="2867" d="M1434 717q0 88 34 166t91 136t135 92t168 34q133 0 235.5 -68.5t157.5 -195.5q2 -4 15.5 -36t34 -78t44 -101.5t48.5 -108.5q29 -66 63.5 -106.5t114.5 -42.5q7 0 13 -1q69 0 114 38q49 42 49 102q0 31 -10.5 50t-28.5 33.5t-46 25t-63 20.5q-63 20 -110 42.5t-79 50.5 t-48.5 64.5t-16.5 86.5q0 98 62.5 156.5t169.5 58.5q72 0 122 -31t87 -92l-92 -47q-49 68 -121 67q-51 0 -83 -30.5t-32 -77.5q0 -35 14.5 -55.5t39 -34t59.5 -24.5t76 -24q111 -37 164 -88t53 -153q0 -55 -22.5 -101.5t-60.5 -80t-90.5 -52t-113.5 -18.5q-113 2 -177.5 54 t-107.5 151l-14 34l-137 312q-35 82 -112 132t-171 50q-66 0 -122 -24.5t-98 -65.5t-66.5 -98.5t-24.5 -120.5q0 -66 24.5 -122t66.5 -98t98 -66.5t122 -24.5q90 0 163 47t111 120l56 -127q-59 -72 -144.5 -114.5t-185.5 -42.5q-90 0 -168 33.5t-135 92t-91 136.5t-34 166z M332 664v274h219v137q0 74 26.5 139.5t71.5 114.5t105.5 77t128.5 28h219v-275h-219q-20 0 -38 -22.5t-18 -59.5v-139h275v-274h-275v-664h-276v664h-219z" />
|
||||
<glyph unicode="ffi" horiz-adv-x="4300" d="M3010 551q0 7 7 10q8 6 28 6q29 -4 50.5 -16t37.5 -27q18 -16 31 -37q27 -47 60.5 -65.5t67.5 -19.5t61.5 8.5t41.5 15.5q8 41 26.5 65.5t41.5 38.5q-96 12 -173 41t-130 81.5t-82 129t-29 185.5q0 72 24.5 130t65.5 103q-4 8 -9 28.5t-7 51.5q-1 9 -1 18q0 23 4 51 q5 38 24 83q10 3 21 2q16 0 36 -4q29 -6 75 -27t109 -62q109 29 219 29q100 0 197 -24q59 41 104.5 59t73.5 25q20 5 35 4q11 0 21 -2q28 -69 27 -122v-11q-3 -56 -13 -82q47 -47 75.5 -110t28.5 -140q0 -86 -16 -164t-59 -136.5t-120 -95t-200 -41.5q27 -18 49.5 -56 t22.5 -103v-226q0 -16 8 -30q6 -12 17.5 -24.5t31.5 -18.5q6 -6 10 -13q2 -4 0 -10t-14 -10h-13q-33 0 -59 8q-27 10 -48 30.5t-21 65.5v172q0 18 -2 35q-2 14 -7.5 28.5t-17.5 24.5v-278q0 -18 4 -37q4 -16 11.5 -31.5t21.5 -25.5q4 -10 4 -19q0 -6 -7 -10q-4 -2 -10.5 -2 t-15.5 2q-27 4 -49 21q-18 14 -34.5 39.5t-18.5 68.5l-2 285h-25l-2 -285q-2 -43 -18.5 -68.5t-34.5 -39.5q-23 -16 -49 -21q-10 -2 -17 -2t-10 2q-6 4 -6 10q0 8 6 19q12 10 19.5 25.5t11.5 31.5q4 18 6 37v283q-14 -10 -19.5 -24.5t-7.5 -31.5q-2 -18 -2 -37v-172 q0 -45 -22.5 -65.5t-48.5 -30.5q-26 -9 -57 -8h-13q-12 4 -14 10t2 10q4 6 10 13q18 6 29.5 18t17.5 25q8 14 10 30v158q-47 -10 -84 -10q-29 0 -52 6q-52 14 -81 39q-35 29 -49 70q-14 33 -28.5 55t-26.5 35q-14 14 -31 22q-29 20 -29 31zM3191 825q0 -84 32.5 -134 t89 -76.5t133 -36t162.5 -9.5t162 5.5t132.5 30t89 75.5t32.5 145q0 80 -72 146q-29 25 -65.5 33t-81.5 8t-94 -5.5t-103 -5.5q-55 0 -105 5.5t-94 5.5t-81 -8.5t-66 -34.5q-33 -29 -52 -66t-19 -78zM3295 813q0 53 25.5 89t62.5 36q35 0 60.5 -36t25.5 -89t-25.5 -89 t-60.5 -36q-37 0 -62.5 36t-25.5 89zM3557 647q0 6 6 10q8 0 9 -6q10 -25 36.5 -24.5t36.5 24.5q2 6 10 6q4 -4 3 -10q-10 -35 -50 -35q-35 0 -51 35zM3586 702q0 23 24 23q20 0 21 -23q0 -20 -21 -20q-24 0 -24 20zM3760 813q0 53 25.5 89t62.5 36q35 0 60.5 -36t25.5 -89 t-25.5 -89t-60.5 -36q-37 0 -62.5 36t-25.5 89zM1766 664v274h219v137q0 74 26.5 139.5t71.5 114.5t105.5 77t128.5 28h219v-275h-219q-20 0 -38 -22.5t-18 -59.5v-139h275v-274h-275v-664h-276v664h-219zM332 664v274h219v137q0 74 26.5 139.5t71.5 114.5t105.5 77 t128.5 28h219v-275h-219q-20 0 -38 -22.5t-18 -59.5v-139h275v-274h-275v-664h-276v664h-219z" />
|
||||
<glyph unicode="ffl" horiz-adv-x="4300" d="M2867 717q0 88 34 166t91 136t135 92t168 34q133 0 235.5 -68.5t157.5 -195.5q2 -4 15.5 -36t34 -78t44 -101.5t48.5 -108.5q29 -66 63.5 -106.5t114.5 -42.5q7 0 13 -1q69 0 114 38q49 42 49 102q0 31 -10.5 50t-28.5 33.5t-46 25t-63 20.5q-63 20 -110 42.5t-79 50.5 t-48.5 64.5t-16.5 86.5q0 98 62.5 156.5t169.5 58.5q72 0 122 -31t87 -92l-92 -47q-49 68 -121 67q-51 0 -83 -30.5t-32 -77.5q0 -35 14.5 -55.5t39 -34t59.5 -24.5t76 -24q111 -37 164 -88t53 -153q0 -55 -22.5 -101.5t-60.5 -80t-90.5 -52t-113.5 -18.5q-113 2 -177.5 54 t-107.5 151l-14 34l-137 312q-35 82 -112 132t-171 50q-66 0 -122 -24.5t-98 -65.5t-66.5 -98.5t-24.5 -120.5q0 -66 24.5 -122t66.5 -98t98 -66.5t122 -24.5q90 0 163 47t111 120l56 -127q-59 -72 -144.5 -114.5t-185.5 -42.5q-90 0 -168 33.5t-135 92t-91 136.5t-34 166z M1766 664v274h219v137q0 74 26.5 139.5t71.5 114.5t105.5 77t128.5 28h219v-275h-219q-20 0 -38 -22.5t-18 -59.5v-139h275v-274h-275v-664h-276v664h-219zM332 664v274h219v137q0 74 26.5 139.5t71.5 114.5t105.5 77t128.5 28h219v-275h-219q-20 0 -38 -22.5t-18 -59.5 v-139h275v-274h-275v-664h-276v664h-219z" />
|
||||
</font>
|
||||
</defs></svg>
|
Before Width: | Height: | Size: 48 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 2.2 KiB |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue