1
0
mirror of https://github.com/billz/raspap-webgui.git synced 2023-10-10 13:37:24 +02:00

Merge pull request #297 from billz/wificlient-ap

Wifi client AP mode
This commit is contained in:
Bill Zimmerman 2019-04-08 20:22:02 +02:00 committed by GitHub
commit 96717deea1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 2002 additions and 85 deletions

View File

@ -30,6 +30,7 @@
], ],
"dependencies": { "dependencies": {
"bootstrap": "~3.3.7", "bootstrap": "~3.3.7",
"bootstrap-toggle": "~2.2.0",
"datatables": "~1.10.4", "datatables": "~1.10.4",
"datatables-plugins": "~1.0.1", "datatables-plugins": "~1.0.1",
"flot": "~0.8.3", "flot": "~0.8.3",

View File

@ -10,8 +10,13 @@ require dhcp_server_identifier
slaac private slaac private
nohook lookup-hostname nohook lookup-hostname
# RaspAP-WebGui wireless configuration # RaspAP wlan0 configuration
interface wlan0 interface wlan0
static ip_address=10.3.141.1/24 static ip_address=10.3.141.1/24
static routers=10.3.141.1 static routers=10.3.141.1
static domain_name_server=1.1.1.1 8.8.8.8 static domain_name_server=1.1.1.1 8.8.8.8
# RaspAP uap0 configuration
interface uap0
static ip_address=192.168.50.1/24
nohook wpa_supplicant

View File

@ -1,3 +1,12 @@
domain-needed # RaspAP wlan0 configuration for wired (ethernet) AP mode
interface=wlan0 interface=wlan0
dhcp-range=10.3.141.50,10.3.141.255,255.255.255.0,12h dhcp-range=10.3.141.50,10.3.141.255,255.255.255.0,12h
# RaspAP uap0 configuration for wireless client AP mode
#interface=lo,uap0 # Use interfaces lo and uap0
#bind-interfaces # Bind to the interfaces
#server=8.8.8.8 # Forward DNS requests to Google DNS
#domain-needed # Don't forward short names
#bogus-priv # Never forward addresses in the non-routed address spaces
#dhcp-range=192.168.50.50,192.168.50.150,12h

View File

@ -16,3 +16,6 @@ country_code=
#ieee80211n=1 # 802.11n support (Raspberry Pi 3) #ieee80211n=1 # 802.11n support (Raspberry Pi 3)
#wmm_enabled=1 # QoS support (Raspberry Pi 3) #wmm_enabled=1 # QoS support (Raspberry Pi 3)
#ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40] # (Raspberry Pi 3) #ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40] # (Raspberry Pi 3)
## RaspAP wireless client AP mode
#interface=uap0

View File

@ -11,6 +11,7 @@ define('RASPI_WIFI_CLIENT_INTERFACE', 'wlan0');
define('RASPI_DNSMASQ_CONFIG', '/etc/dnsmasq.conf'); define('RASPI_DNSMASQ_CONFIG', '/etc/dnsmasq.conf');
define('RASPI_DNSMASQ_LEASES', '/var/lib/misc/dnsmasq.leases'); define('RASPI_DNSMASQ_LEASES', '/var/lib/misc/dnsmasq.leases');
define('RASPI_HOSTAPD_CONFIG', '/etc/hostapd/hostapd.conf'); define('RASPI_HOSTAPD_CONFIG', '/etc/hostapd/hostapd.conf');
define('RASPI_DHCPCD_CONFIG', '/etc/dhcpcd.conf');
define('RASPI_WPA_SUPPLICANT_CONFIG', '/etc/wpa_supplicant/wpa_supplicant.conf'); define('RASPI_WPA_SUPPLICANT_CONFIG', '/etc/wpa_supplicant/wpa_supplicant.conf');
define('RASPI_HOSTAPD_CTRL_INTERFACE', '/var/run/hostapd'); define('RASPI_HOSTAPD_CTRL_INTERFACE', '/var/run/hostapd');
define('RASPI_WPA_CTRL_INTERFACE', '/var/run/wpa_supplicant'); define('RASPI_WPA_CTRL_INTERFACE', '/var/run/wpa_supplicant');

View File

@ -27,7 +27,11 @@ function DisplayHostAPDConfig()
} elseif( isset($_POST['StartHotspot']) ) { } elseif( isset($_POST['StartHotspot']) ) {
if (CSRFValidate()) { if (CSRFValidate()) {
$status->addMessage('Attempting to start hotspot', 'info'); $status->addMessage('Attempting to start hotspot', 'info');
exec( 'sudo /etc/init.d/hostapd start', $return ); if ($arrHostapdConf['WifiAPEnable'] == 1) {
exec('sudo /etc/raspap/hostapd/servicestart.sh --interface uap0 --seconds 5', $return );
} else {
exec( 'sudo /etc/raspap/hostapd/servicestart.sh --seconds 5', $return );
}
foreach( $return as $line ) { foreach( $return as $line ) {
$status->addMessage($line, 'info'); $status->addMessage($line, 'info');
} }
@ -80,7 +84,7 @@ function DisplayHostAPDConfig()
<li class="active"><a href="#basic" data-toggle="tab"><?php echo _("Basic"); ?></a></li> <li class="active"><a href="#basic" data-toggle="tab"><?php echo _("Basic"); ?></a></li>
<li><a href="#security" data-toggle="tab"><?php echo _("Security"); ?></a></li> <li><a href="#security" data-toggle="tab"><?php echo _("Security"); ?></a></li>
<li><a href="#advanced" data-toggle="tab"><?php echo _("Advanced"); ?></a></li> <li><a href="#advanced" data-toggle="tab"><?php echo _("Advanced"); ?></a></li>
<li><a href="#logoutput" data-toggle="tab"><?php echo _("Logfile output"); ?></a></li> <li><a href="#logoutput" data-toggle="tab"><?php echo _("Logfile"); ?></a></li>
</ul> </ul>
<!-- Tab panes --> <!-- Tab panes -->
@ -180,33 +184,46 @@ if (in_array($arrConfig['country_code'], $countries_max11channels)) {
</div> </div>
</div> </div>
<div class="tab-pane fade" id="advanced"> <div class="tab-pane fade" id="advanced">
<h4><?php echo _("Advanced settings"); ?></h4> <h4><?php echo _("Advanced settings"); ?></h4>
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
<div class="form-check"> <div class="checkbox">
<label class="form-check-label" for="chxlogenable"><?php echo _("Enable logging"); <?php
$checkedLogEnabled = ''; $checkedWifiAPEnabled = '';
if ($arrHostapdConf['LogEnable'] == 1) { if ($arrHostapdConf['WifiAPEnable'] == 1) {
$checkedLogEnabled = ' checked="checked"'; $checkedWifiAPEnabled = ' checked="checked"';
} }
?> ?>
</label> <input id="chxwificlientap" name="wifiAPEnable" type="checkbox" class="form-check-input" data-toggle="toggle" data-on="Enabled" data-off="Disabled" data-width="100" value="1"<?php echo $checkedWifiAPEnabled; ?> />
<input id="chxlogenable" name="logEnable" type="checkbox" class="form-check-input" value="1"<?php echo $checkedLogEnabled; ?> /> <label class="form-check-label" for="chxwificlientap"><?php echo _("WiFi client AP mode"); ?></label>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
<div class="form-check"> <div class="checkbox">
<label class="form-check-label" for="chxhiddenssid"><?php echo _("Hide SSID in broadcast"); <?php
$checkedLogEnabled = '';
if ($arrHostapdConf['LogEnable'] == 1) {
$checkedLogEnabled = ' checked="checked"';
}
?>
<input id="chxlogenable" name="logEnable" type="checkbox" class="form-check-input" data-toggle="toggle" data-on="Enabled" data-off="Disabled" data-width="100" value="1"<?php echo $checkedLogEnabled; ?> />
<label class="form-check-label" for="chxlogenable"><?php echo _("Logfile output"); ?></label>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="checkbox">
<?php
$checkedHiddenSSID = ''; $checkedHiddenSSID = '';
if ($arrConfig['ignore_broadcast_ssid'] == 1 || $arrConfig['ignore_broadcast_ssid'] == 2) { if ($arrConfig['ignore_broadcast_ssid'] == 1 || $arrConfig['ignore_broadcast_ssid'] == 2) {
$checkedHiddenSSID = ' checked="checked"'; $checkedHiddenSSID = ' checked="checked"';
} }
?>
?> </label> <input id="chxhiddenssid" name="hiddenSSID" type="checkbox" class="form-check-input" data-toggle="toggle" data-on="Enabled" data-off="Disabled" data-width="100" value="1"<?php echo $checkedHiddenSSID; ?> />
<input id="chxhiddenssid" name="hiddenSSID" type="checkbox" class="form-check-input" value="1"<?php echo $checkedHiddenSSID; ?> /> <label class="form-check-label" for="chxhiddenssid"><?php echo _("Hide SSID in broadcast"); ?></label>
</div> </div>
</div> </div>
</div> </div>
@ -517,27 +534,40 @@ function SaveHostAPDConfig($wpa_array, $enc_types, $modes, $interfaces, $status)
} }
$good_input = true; $good_input = true;
// Check for WiFi client AP mode checkbox
$wifiAPEnable = 0;
if($arrHostapdConf['WifiAPEnable'] == 0) {
if(isset($_POST['wifiAPEnable'])) {
$wifiAPEnable = 1;
}
} else {
if(isset($_POST['wifiAPEnable'])) {
$wifiAPEnable = 1;
}
}
// Check for Logging Checkbox // Check for Logfile output checkbox
$logEnable = 0; $logEnable = 0;
if($arrHostapdConf['LogEnable'] == 0) { if($arrHostapdConf['LogEnable'] == 0) {
if(isset($_POST['logEnable'])) { if(isset($_POST['logEnable'])) {
// Need code to enable logfile logging here $logEnable = 1;
$logEnable = 1; exec('sudo /etc/raspap/hostapd/enablelog.sh');
exec('sudo /etc/raspap/hostapd/enablelog.sh'); } else {
} else { exec('sudo /etc/raspap/hostapd/disablelog.sh');
exec('sudo /etc/raspap/hostapd/disablelog.sh'); }
} } else {
} else { if(isset($_POST['logEnable'])) {
if(isset($_POST['logEnable'])) { $logEnable = 1;
$logEnable = 1; exec('sudo /etc/raspap/hostapd/enablelog.sh');
exec('sudo /etc/raspap/hostapd/enablelog.sh'); } else {
} else { exec('sudo /etc/raspap/hostapd/disablelog.sh');
exec('sudo /etc/raspap/hostapd/disablelog.sh'); }
} }
} $cfg = [];
$cfg['LogEnable'] = $logEnable;
write_php_ini(["LogEnable" => $logEnable],'/etc/raspap/hostapd.ini'); $cfg['WifiAPEnable'] = $wifiAPEnable;
write_php_ini($cfg,'/etc/raspap/hostapd.ini');
// Verify input // Verify input
if (empty($_POST['ssid']) || strlen($_POST['ssid']) > 32) { if (empty($_POST['ssid']) || strlen($_POST['ssid']) > 32) {
@ -579,45 +609,91 @@ function SaveHostAPDConfig($wpa_array, $enc_types, $modes, $interfaces, $status)
} }
if ($good_input) { if ($good_input) {
if ($tmp_file = fopen('/tmp/hostapddata', 'w')) { // Fixed values
// Fixed values $config = 'driver=nl80211'.PHP_EOL;
fwrite($tmp_file, 'driver=nl80211'.PHP_EOL); $config.= 'ctrl_interface='.RASPI_HOSTAPD_CTRL_INTERFACE.PHP_EOL;
fwrite($tmp_file, 'ctrl_interface='.RASPI_HOSTAPD_CTRL_INTERFACE.PHP_EOL); $config.= 'ctrl_interface_group=0'.PHP_EOL;
fwrite($tmp_file, 'ctrl_interface_group=0'.PHP_EOL); $config.= 'auth_algs=1'.PHP_EOL;
fwrite($tmp_file, 'auth_algs=1'.PHP_EOL); $config.= 'wpa_key_mgmt=WPA-PSK'.PHP_EOL;
fwrite($tmp_file, 'wpa_key_mgmt=WPA-PSK'.PHP_EOL); $config.= 'beacon_int=100'.PHP_EOL;
fwrite($tmp_file, 'beacon_int=100'.PHP_EOL); $config.= 'ssid='.$_POST['ssid'].PHP_EOL;
$config.= 'channel='.$_POST['channel'].PHP_EOL;
if ($_POST['hw_mode'] === 'n') {
$config.= 'hw_mode=g'.PHP_EOL;
$config.= 'ieee80211n=1'.PHP_EOL;
// Enable basic Quality of service
$config.= 'wme_enabled=1'.PHP_EOL;
} else {
$config.= 'hw_mode='.$_POST['hw_mode'].PHP_EOL;
$config.= 'ieee80211n=0'.PHP_EOL;
}
$config.= 'wpa_passphrase='.$_POST['wpa_passphrase'].PHP_EOL;
if ($wifiAPEnable == 1) {
$config.= 'interface=uap0'.PHP_EOL;
} else {
$config.= 'interface='.$_POST['interface'].PHP_EOL;
}
$config.= 'wpa='.$_POST['wpa'].PHP_EOL;
$config.= 'wpa_pairwise='.$_POST['wpa_pairwise'].PHP_EOL;
$config.= 'country_code='.$_POST['country_code'].PHP_EOL;
$config.= 'ignore_broadcast_ssid='.$ignore_broadcast_ssid.PHP_EOL;
fwrite($tmp_file, 'ssid='.$_POST['ssid'].PHP_EOL); exec('echo "'.$config.'" > /tmp/hostapddata', $temp);
fwrite($tmp_file, 'channel='.$_POST['channel'].PHP_EOL); system( "sudo cp /tmp/hostapddata " . RASPI_HOSTAPD_CONFIG, $return );
if ($_POST['hw_mode'] === 'n') {
fwrite($tmp_file, 'hw_mode=g'.PHP_EOL);
fwrite($tmp_file, 'ieee80211n=1'.PHP_EOL);
// Enable basic Quality of service
fwrite($tmp_file, 'wme_enabled=1'.PHP_EOL);
} else {
fwrite($tmp_file, 'hw_mode='.$_POST['hw_mode'].PHP_EOL);
fwrite($tmp_file, 'ieee80211n=0'.PHP_EOL);
}
fwrite($tmp_file, 'wpa_passphrase='.$_POST['wpa_passphrase'].PHP_EOL); if ($wifiAPEnable == 1) {
fwrite($tmp_file, 'interface='.$_POST['interface'].PHP_EOL); // Enable uap0 configuration in dnsmasq for Wifi client AP mode
fwrite($tmp_file, 'wpa='.$_POST['wpa'].PHP_EOL); $config = 'interface=lo,uap0 # Enable uap0 interface for wireless client AP mode'.PHP_EOL;
fwrite($tmp_file, 'wpa_pairwise='.$_POST['wpa_pairwise'].PHP_EOL); $config.= 'bind-interfaces # Bind to the interfaces'.PHP_EOL;
fwrite($tmp_file, 'country_code='.$_POST['country_code'].PHP_EOL); $config.= 'server=8.8.8.8 # Forward DNS requests to Google DNS'.PHP_EOL;
fwrite($tmp_file, 'ignore_broadcast_ssid='.$ignore_broadcast_ssid.PHP_EOL); $config.= 'domain-needed # Don\'t forward short names'.PHP_EOL;
fclose($tmp_file); $config.= 'bogus-priv # Never forward addresses in the non-routed address spaces'.PHP_EOL;
$config.= 'dhcp-range=192.168.50.50,192.168.50.150,12h'.PHP_EOL;
} else {
// Fallback to default config
$config = 'domain-needed'.PHP_EOL;
$config.= 'interface='.$_POST['interface'].PHP_EOL;
$config.= 'dhcp-range=10.3.141.50,10.3.141.255,255.255.255.0,12h'.PHP_EOL;
}
exec('echo "'.$config.'" > /tmp/dhcpddata', $temp);
system('sudo cp /tmp/dhcpddata '.RASPI_DNSMASQ_CONFIG, $return);
system( "sudo cp /tmp/hostapddata " . RASPI_HOSTAPD_CONFIG, $return ); if ($wifiAPEnable == 1) {
if( $return == 0 ) { // Enable uap0 configuration in dhcpcd for Wifi client AP mode
$status->addMessage('Wifi Hotspot settings saved', 'success'); $config = PHP_EOL.'# RaspAP uap0 configuration'.PHP_EOL;
} else { $config.= 'interface uap0'.PHP_EOL;
$status->addMessage('Unable to save wifi hotspot settings', 'danger'); $config.= 'static ip_address=192.168.50.1/24'.PHP_EOL;
} $config.= 'nohook wpa_supplicant'.PHP_EOL;
} else {
// Default config
$config = '# RaspAP wlan0 configuration'.PHP_EOL;
$config.= 'hostname'.PHP_EOL;
$config.= 'clientid'.PHP_EOL;
$config.= 'persistent'.PHP_EOL;
$config.= 'option rapid_commit'.PHP_EOL;
$config.= 'option domain_name_servers, domain_name, domain_search, host_name'.PHP_EOL;
$config.= 'option classless_static_routes'.PHP_EOL;
$config.= 'option ntp_servers'.PHP_EOL;
$config.= 'require dhcp_server_identifier'.PHP_EOL;
$config.= 'slaac private'.PHP_EOL;
$config.= 'nohook lookup-hostname'.PHP_EOL;
$config.= 'interface '.RASPI_WIFI_CLIENT_INTERFACE.PHP_EOL;
$config.= 'static ip_address=10.3.141.1/24'.PHP_EOL;
$config.= 'static routers=10.3.141.1'.PHP_EOL;
$config.= 'static domain_name_server=1.1.1.1 8.8.8.8'.PHP_EOL;
}
exec('echo "'.$config.'" > /tmp/dhcpddata', $temp);
system('sudo cp /tmp/dhcpddata '.RASPI_DHCPCD_CONFIG, $return);
if( $return == 0 ) {
$status->addMessage('Wifi Hotspot settings saved', 'success');
} else { } else {
$status->addMessage('Unable to save wifi hotspot settings', 'danger'); $status->addMessage('Unable to save wifi hotspot settings', 'danger');
return false;
} }
} else {
$status->addMessage('Unable to save wifi hotspot settings', 'danger');
return false;
} }
return true; return true;

View File

@ -70,6 +70,9 @@ $theme_url = 'dist/css/'.htmlspecialchars($theme, ENT_QUOTES);
<!-- Bootstrap Core CSS --> <!-- Bootstrap Core CSS -->
<link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<!-- Bootstrap Toggle CSS -->
<link href="vendor/bootstrap-toggle/css/bootstrap-toggle.min.css" rel="stylesheet">
<!-- MetisMenu CSS --> <!-- MetisMenu CSS -->
<link href="vendor/metisMenu/metisMenu.min.css" rel="stylesheet"> <link href="vendor/metisMenu/metisMenu.min.css" rel="stylesheet">
@ -246,6 +249,9 @@ $extraFooterScripts = array();
<!-- Bootstrap Core JavaScript --> <!-- Bootstrap Core JavaScript -->
<script src="vendor/bootstrap/js/bootstrap.min.js"></script> <script src="vendor/bootstrap/js/bootstrap.min.js"></script>
<!-- Bootstrap Toggle JavaScript -->
<script src="vendor/bootstrap-toggle/js/bootstrap-toggle.min.js"></script>
<!-- Metis Menu Plugin JavaScript --> <!-- Metis Menu Plugin JavaScript -->
<script src="vendor/metisMenu/metisMenu.min.js"></script> <script src="vendor/metisMenu/metisMenu.min.js"></script>

View File

@ -114,16 +114,18 @@ function create_raspap_directories() {
sudo chown -R $raspap_user:$raspap_user "$raspap_dir" || install_error "Unable to change file ownership for '$raspap_dir'" sudo chown -R $raspap_user:$raspap_user "$raspap_dir" || install_error "Unable to change file ownership for '$raspap_dir'"
} }
# Generate logging enable/disable files for hostapd # Generate hostapd logging and service control scripts
function create_logging_scripts() { function create_hostapd_scripts() {
install_log "Creating logging scripts" install_log "Creating hostapd logging & control scripts"
sudo mkdir $raspap_dir/hostapd || install_error "Unable to create directory '$raspap_dir/hostapd'" sudo mkdir $raspap_dir/hostapd || install_error "Unable to create directory '$raspap_dir/hostapd'"
# Move existing shell scripts # Move logging shell scripts
sudo mv "$webroot_dir/installers/"*log.sh "$raspap_dir/hostapd" || install_error "Unable to move logging scripts" sudo mv "$webroot_dir/installers/"*log.sh "$raspap_dir/hostapd" || install_error "Unable to move logging scripts"
# Move service control shell scripts
sudo mv "$webroot_dir/installers/"service*.sh "$raspap_dir/hostapd" || install_error "Unable to move service control scripts"
# Make enablelog.sh and disablelog.sh not writable by www-data group. # Make enablelog.sh and disablelog.sh not writable by www-data group.
sudo chown -c root:"$raspap_user" "$raspap_dir/hostapd/"*log.sh || install_error "Unable change owner and/or group." sudo chown -c root:"$raspap_user" "$raspap_dir/hostapd/"*.sh || install_error "Unable change owner and/or group."
sudo chmod 750 "$raspap_dir/hostapd/"*log.sh || install_error "Unable to change file permissions." sudo chmod 750 "$raspap_dir/hostapd/"*.sh || install_error "Unable to change file permissions."
} }
@ -203,7 +205,7 @@ function default_configuration() {
lines=( lines=(
'echo 1 > \/proc\/sys\/net\/ipv4\/ip_forward #RASPAP' 'echo 1 > \/proc\/sys\/net\/ipv4\/ip_forward #RASPAP'
'iptables -t nat -A POSTROUTING -j MASQUERADE #RASPAP' 'iptables -t nat -A POSTROUTING -j MASQUERADE #RASPAP'
'iptables -t nat -A POSTROUTING -s 192.168.50.0\/24 ! -d 192.168.50.0\/24 -j MASQUERADE #RASPAP'
) )
for line in "${lines[@]}"; do for line in "${lines[@]}"; do
@ -214,6 +216,10 @@ function default_configuration() {
echo "Adding line $line" echo "Adding line $line"
fi fi
done done
# Force a reload of new settings in /etc/rc.local
sudo systemctl restart rc-local.service
sudo systemctl daemon-reload
} }
@ -246,6 +252,7 @@ function patch_system_files() {
"/etc/init.d/dnsmasq start" "/etc/init.d/dnsmasq start"
"/etc/init.d/dnsmasq stop" "/etc/init.d/dnsmasq stop"
"/bin/cp /tmp/dhcpddata /etc/dnsmasq.conf" "/bin/cp /tmp/dhcpddata /etc/dnsmasq.conf"
"/bin/cp /tmp/dhcpddata /etc/dhcpcd.conf"
"/sbin/shutdown -h now" "/sbin/shutdown -h now"
"/sbin/reboot" "/sbin/reboot"
"/sbin/ip link set wlan[0-9] down" "/sbin/ip link set wlan[0-9] down"
@ -254,6 +261,7 @@ function patch_system_files() {
"/bin/cp /etc/raspap/networking/dhcpcd.conf /etc/dhcpcd.conf" "/bin/cp /etc/raspap/networking/dhcpcd.conf /etc/dhcpcd.conf"
"/etc/raspap/hostapd/enablelog.sh" "/etc/raspap/hostapd/enablelog.sh"
"/etc/raspap/hostapd/disablelog.sh" "/etc/raspap/hostapd/disablelog.sh"
"/etc/raspap/hostapd/servicestart.sh"
) )
# Check if sudoers needs patching # Check if sudoers needs patching
@ -318,13 +326,17 @@ function optimize_php() {
function install_complete() { function install_complete() {
install_log "Installation completed!" install_log "Installation completed!"
echo -n "The system needs to be rebooted as a final step. Reboot now? [y/N]: " # Prompt to reboot if wired ethernet (eth0) is connected.
read answer # With default_configuration this will create an active AP on restart.
if [[ $answer != "y" ]]; then if ip a | grep -q ': eth0:.*state UP'; then
echo "Installation reboot aborted." echo -n "The system needs to be rebooted as a final step. Reboot now? [y/N]: "
exit 0 read answer
if [[ $answer != "y" ]]; then
echo "Installation reboot aborted."
exit 0
fi
sudo shutdown -r now || install_error "Unable to execute shutdown"
fi fi
sudo shutdown -r now || install_error "Unable to execute shutdown"
} }
function install_raspap() { function install_raspap() {
@ -338,7 +350,7 @@ function install_raspap() {
check_for_old_configs check_for_old_configs
download_latest_files download_latest_files
change_file_ownership change_file_ownership
create_logging_scripts create_hostapd_scripts
move_config_file move_config_file
default_configuration default_configuration
patch_system_files patch_system_files

58
installers/servicestart.sh Executable file
View File

@ -0,0 +1,58 @@
#!/bin/bash
# When wireless client AP mode is enabled, this script handles starting
# up network services in a specific order and timing to avoid race conditions.
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=raspap
DESC="Service control for RaspAP"
positional=()
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-i|--interface)
interface="$2"
shift # past argument
shift # past value
;;
-s|--seconds)
seconds="$2"
shift # past argument
shift # past value
;;
esac
done
set -- "${positional[@]}"
echo "Stopping network services..."
systemctl stop hostapd.service
systemctl stop dnsmasq.service
systemctl stop dhcpcd.service
echo "Removing uap0 interface..."
iw dev uap0 del
if [ "${interface}" = "uap0" ]; then
echo "Adding uap0 interface..."
iw dev wlan0 interface add uap0 type __ap
# Bring up uap0 interface
ifconfig uap0 up
fi
# Start services, mitigating race conditions
echo "Starting hostapd service..."
systemctl start hostapd.service
sleep "${seconds}"
echo "Starting dhcpcd service..."
systemctl start dhcpcd.service
sleep "${seconds}"
echo "Starting dnsmasq service..."
systemctl start dnsmasq.service
echo "RaspAP service start DONE"

37
vendor/bootstrap-toggle/Gruntfile.js vendored Normal file
View File

@ -0,0 +1,37 @@
module.exports = function(grunt) {
'use strict';
grunt.initConfig({
clean: ['dist'],
uglify: {
options: {
preserveComments: 'some',
sourceMap: true
},
build: {
expand: true,
cwd: 'js',
src: ['**/*.js', ['!**/*.min.js']],
dest: 'js',
ext: '.min.js',
}
},
cssmin: {
options: {
keepBreaks: true
},
build: {
expand: true,
cwd: 'css',
src: ['**/*.css', ['!**/*.min.css']],
dest: 'css',
ext: '.min.css',
}
}
});
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.registerTask('default', ['clean', 'uglify', 'cssmin']);
};

21
vendor/bootstrap-toggle/LICENSE vendored Normal file
View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2011-2014 Min Hur, The New York Times Company
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

175
vendor/bootstrap-toggle/README.md vendored Normal file
View File

@ -0,0 +1,175 @@
# Bootstrap Toggle
Bootstrap Toggle is a highly flexible Bootstrap plugin that converts checkboxes into toggles.
Visit http://www.bootstraptoggle.com for demos.
## Getting Started
### Installation
You can [download](https://github.com/minhur/bootstrap-toggle/archive/master.zip) the latest version of Bootstrap Toggle or use CDN to load the library.
`Warning` If you are using Bootstrap v2.3.2, use `bootstrap2-toggle.min.js` and `bootstrap2-toggle.min.css` instead.
```html
<link href="https://gitcdn.github.io/bootstrap-toggle/2.2.0/css/bootstrap-toggle.min.css" rel="stylesheet">
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.0/js/bootstrap-toggle.min.js"></script>
```
### Bower Install
```bash
bower install bootstrap-toggle
```
## Usage
### Basic example
Simply add `data-toggle="toggle"` to convert checkboxes into toggles.
```html
<input type="checkbox" checked data-toggle="toggle">
```
### Stacked checkboxes
Refer to Bootstrap Form Controls documentation to create stacked checkboxes. Simply add `data-toggle="toggle"` to convert checkboxes into toggles.
```html
<div class="checkbox">
<label>
<input type="checkbox" data-toggle="toggle">
Option one is enabled
</label>
</div>
<div class="checkbox disabled">
<label>
<input type="checkbox" disabled data-toggle="toggle">
Option two is disabled
</label>
</div>
```
### Inline Checkboxes
Refer to Bootstrap Form Controls documentation to create inline checkboxes. Simply add `data-toggle="toggle"` to a convert checkboxes into toggles.
```html
<label class="checkbox-inline">
<input type="checkbox" checked data-toggle="toggle"> First
</label>
<label class="checkbox-inline">
<input type="checkbox" data-toggle="toggle"> Second
</label>
<label class="checkbox-inline">
<input type="checkbox" data-toggle="toggle"> Third
</label>
```
## API
### Initialize by JavaScript
Initialize toggles with id `toggle-one` with a single line of JavaScript.
```html
<input id="toggle-one" checked type="checkbox">
<script>
$(function() {
$('#toggle-one').bootstrapToggle();
})
</script>
```
### Options
Options can be passed via data attributes or JavaScript. For data attributes, append the option name to `data-`, as in `data-on="Enabled"`.
```html
<input type="checkbox" data-toggle="toggle" data-on="Enabled" data-off="Disabled">
<input type="checkbox" id="toggle-two">
<script>
$(function() {
$('#toggle-two').bootstrapToggle({
on: 'Enabled',
off: 'Disabled'
});
})
</script>
```
Name|Type|Default|Description|
---|---|---|---
on|string/html|"On"|Text of the on toggle
off|string/html|"Off"|Text of the off toggle
size|string|"normal"|Size of the toggle. Possible values are `large`, `normal`, `small`, `mini`.
onstyle|string|"primary"|Style of the on toggle. Possible values are `default`, `primary`, `success`, `info`, `warning`, `danger`
offstyle|string|"default"|Style of the off toggle. Possible values are `default`, `primary`, `success`, `info`, `warning`, `danger`
style|string| |Appends the value to the class attribute of the toggle. This can be used to apply custom styles. Refer to Custom Styles for reference.
width|integer|*null*|Sets the width of the toggle. if set to *null*, width will be calculated.
height|integer|*null*|Sets the height of the toggle. if set to *null*, height will be calculated.
### Methods
Methods can be used to control toggles directly.
```html
<input id="toggle-demo" type="checkbox" data-toggle="toggle">
```
Method|Example|Description
---|---|---
initialize|$('#toggle-demo').bootstrapToggle()|Initializes the toggle plugin with options
destroy|$('#toggle-demo').bootstrapToggle('destroy')|Destroys the toggle
on|$('#toggle-demo').bootstrapToggle('on')|Sets the toggle to 'On' state
off|$('#toggle-demo').bootstrapToggle('off')|Sets the toggle to 'Off' state
toggle|$('#toggle-demo').bootstrapToggle('toggle')|Toggles the state of the toggle
enable|$('#toggle-demo').bootstrapToggle('enable')|Enables the toggle
disable|$('#toggle-demo').bootstrapToggle('disable')|Disables the toggle
## Events
### Event Propagation
Note All events are propagated to and from input element to the toggle.
You should listen to events from the `<input type="checkbox">` directly rather than look for custom events.
```html
<input id="toggle-event" type="checkbox" data-toggle="toggle">
<div id="console-event"></div>
<script>
$(function() {
$('#toggle-event').change(function() {
$('#console-event').html('Toggle: ' + $(this).prop('checked'))
})
})
</script>
```
### API vs Input
This also means that using the API or Input to trigger events will work both ways.
```html
<input id="toggle-trigger" type="checkbox" data-toggle="toggle">
<button class="btn btn-success" onclick="toggleOn()">On by API</button>
<button class="btn btn-danger" onclick="toggleOff()">Off by API</button>
<button class="btn btn-success" onclick="toggleOnByInput()">On by Input</button>
<button class="btn btn-danger" onclick="toggleOffByInput()">Off by Input</button>
<script>
function toggleOn() {
$('#toggle-trigger').bootstrapToggle('on')
}
function toggleOff() {
$('#toggle-trigger').bootstrapToggle('off')
}
function toggleOnByInput() {
$('#toggle-trigger').prop('checked', true).change()
}
function toggleOffByInput() {
$('#toggle-trigger').prop('checked', false).change()
}
</script>
```
### Integration
#### [KnockoutJS](http://knockoutjs.com)
A binding for knockout is available here: [aAXEe/knockout-bootstrap-toggle](https://github.com/aAXEe/knockout-bootstrap-toggle)
## Demos
Visit http://www.bootstraptoggle.com for demos.

32
vendor/bootstrap-toggle/bower.json vendored Normal file
View File

@ -0,0 +1,32 @@
{
"name": "bootstrap-toggle",
"description": "Bootstrap Toggle is a highly flexible Bootstrap plugin that converts checkboxes into toggles",
"version": "2.2.1",
"keywords": [
"bootstrap",
"toggle",
"bootstrap-toggle",
"switch",
"bootstrap-switch"
],
"homepage": "http://www.bootstraptoggle.com",
"repository": {
"type": "git",
"url": "https://github.com/minhur/bootstrap-toggle.git"
},
"license": "MIT",
"authors": [
"Min Hur <min.hur@gmail.com>"
],
"main": [
"./js/bootstrap-toggle.min.js",
"./css/bootstrap-toggle.min.css"
],
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
]
}

View File

@ -0,0 +1,83 @@
/*! ========================================================================
* Bootstrap Toggle: bootstrap-toggle.css v2.2.0
* http://www.bootstraptoggle.com
* ========================================================================
* Copyright 2014 Min Hur, The New York Times Company
* Licensed under MIT
* ======================================================================== */
.checkbox label .toggle,
.checkbox-inline .toggle {
margin-left: -20px;
margin-right: 5px;
}
.toggle {
position: relative;
overflow: hidden;
}
.toggle input[type="checkbox"] {
display: none;
}
.toggle-group {
position: absolute;
width: 200%;
top: 0;
bottom: 0;
left: 0;
transition: left 0.35s;
-webkit-transition: left 0.35s;
-moz-user-select: none;
-webkit-user-select: none;
}
.toggle.off .toggle-group {
left: -100%;
}
.toggle-on {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 50%;
margin: 0;
border: 0;
border-radius: 0;
}
.toggle-off {
position: absolute;
top: 0;
bottom: 0;
left: 50%;
right: 0;
margin: 0;
border: 0;
border-radius: 0;
}
.toggle-handle {
position: relative;
margin: 0 auto;
padding-top: 0px;
padding-bottom: 0px;
height: 100%;
width: 0px;
border-width: 0 1px;
}
.toggle.btn { min-width: 59px; min-height: 34px; }
.toggle-on.btn { padding-right: 24px; }
.toggle-off.btn { padding-left: 24px; }
.toggle.btn-lg { min-width: 79px; min-height: 45px; }
.toggle-on.btn-lg { padding-right: 31px; }
.toggle-off.btn-lg { padding-left: 31px; }
.toggle-handle.btn-lg { width: 40px; }
.toggle.btn-sm { min-width: 50px; min-height: 30px;}
.toggle-on.btn-sm { padding-right: 20px; }
.toggle-off.btn-sm { padding-left: 20px; }
.toggle.btn-xs { min-width: 35px; min-height: 22px;}
.toggle-on.btn-xs { padding-right: 12px; }
.toggle-off.btn-xs { padding-left: 12px; }

View File

@ -0,0 +1,28 @@
/*! ========================================================================
* Bootstrap Toggle: bootstrap-toggle.css v2.2.0
* http://www.bootstraptoggle.com
* ========================================================================
* Copyright 2014 Min Hur, The New York Times Company
* Licensed under MIT
* ======================================================================== */
.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-20px;margin-right:5px}
.toggle{position:relative;overflow:hidden}
.toggle input[type=checkbox]{display:none}
.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none}
.toggle.off .toggle-group{left:-100%}
.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}
.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0}
.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px}
.toggle.btn{min-width:59px;min-height:34px}
.toggle-on.btn{padding-right:24px}
.toggle-off.btn{padding-left:24px}
.toggle.btn-lg{min-width:79px;min-height:45px}
.toggle-on.btn-lg{padding-right:31px}
.toggle-off.btn-lg{padding-left:31px}
.toggle-handle.btn-lg{width:40px}
.toggle.btn-sm{min-width:50px;min-height:30px}
.toggle-on.btn-sm{padding-right:20px}
.toggle-off.btn-sm{padding-left:20px}
.toggle.btn-xs{min-width:35px;min-height:22px}
.toggle-on.btn-xs{padding-right:12px}
.toggle-off.btn-xs{padding-left:12px}

View File

@ -0,0 +1,85 @@
/*! ========================================================================
* Bootstrap Toggle: bootstrap2-toggle.css v2.2.0
* http://www.bootstraptoggle.com
* ========================================================================
* Copyright 2014 Min Hur, The New York Times Company
* Licensed under MIT
* ======================================================================== */
label.checkbox .toggle,
label.checkbox.inline .toggle {
margin-left: -20px;
margin-right: 5px;
}
.toggle {
min-width: 40px;
height: 20px;
position: relative;
overflow: hidden;
}
.toggle input[type="checkbox"] {
display: none;
}
.toggle-group {
position: absolute;
width: 200%;
top: 0;
bottom: 0;
left: 0;
transition: left 0.35s;
-webkit-transition: left 0.35s;
-moz-user-select: none;
-webkit-user-select: none;
}
.toggle.off .toggle-group {
left: -100%;
}
.toggle-on {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 50%;
margin: 0;
border: 0;
border-radius: 0;
}
.toggle-off {
position: absolute;
top: 0;
bottom: 0;
left: 50%;
right: 0;
margin: 0;
border: 0;
border-radius: 0;
}
.toggle-handle {
position: relative;
margin: 0 auto;
padding-top: 0px;
padding-bottom: 0px;
height: 100%;
width: 0px;
border-width: 0 1px;
}
.toggle-handle.btn-mini {
top: -1px;
}
.toggle.btn { min-width: 30px; }
.toggle-on.btn { padding-right: 24px; }
.toggle-off.btn { padding-left: 24px; }
.toggle.btn-large { min-width: 40px; }
.toggle-on.btn-large { padding-right: 35px; }
.toggle-off.btn-large { padding-left: 35px; }
.toggle.btn-small { min-width: 25px; }
.toggle-on.btn-small { padding-right: 20px; }
.toggle-off.btn-small { padding-left: 20px; }
.toggle.btn-mini { min-width: 20px; }
.toggle-on.btn-mini { padding-right: 12px; }
.toggle-off.btn-mini { padding-left: 12px; }

View File

@ -0,0 +1,28 @@
/*! ========================================================================
* Bootstrap Toggle: bootstrap2-toggle.css v2.2.0
* http://www.bootstraptoggle.com
* ========================================================================
* Copyright 2014 Min Hur, The New York Times Company
* Licensed under MIT
* ======================================================================== */
label.checkbox .toggle,label.checkbox.inline .toggle{margin-left:-20px;margin-right:5px}
.toggle{min-width:40px;height:20px;position:relative;overflow:hidden}
.toggle input[type=checkbox]{display:none}
.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none}
.toggle.off .toggle-group{left:-100%}
.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}
.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0}
.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px}
.toggle-handle.btn-mini{top:-1px}
.toggle.btn{min-width:30px}
.toggle-on.btn{padding-right:24px}
.toggle-off.btn{padding-left:24px}
.toggle.btn-large{min-width:40px}
.toggle-on.btn-large{padding-right:35px}
.toggle-off.btn-large{padding-left:35px}
.toggle.btn-small{min-width:25px}
.toggle-on.btn-small{padding-right:20px}
.toggle-off.btn-small{padding-left:20px}
.toggle.btn-mini{min-width:20px}
.toggle-on.btn-mini{padding-right:12px}
.toggle-off.btn-mini{padding-left:12px}

BIN
vendor/bootstrap-toggle/doc/header.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
vendor/bootstrap-toggle/doc/nyt.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

239
vendor/bootstrap-toggle/doc/nytdev.svg vendored Normal file
View File

@ -0,0 +1,239 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="868.575px" height="186.426px" viewBox="0 0 868.575 186.426" enable-background="new 0 0 868.575 186.426"
xml:space="preserve">
<g>
<path fill="#63BB46" d="M20.116,151.421c-4.572-4.576-5.988-10.257-5.988-22.211v-25.691c0-11.028-1.255-12.916-11.19-16.393
v-4.877c4.892-1.419,7.096-2.684,8.983-5.025c1.896-2.703,2.207-4.421,2.207-11.518V40.188c0-8.038,0.472-11.508,2.046-15.771
c1.89-5.187,6.14-9.44,11.189-11.03c4.876-1.574,8.82-2.03,21.738-2.362v8.366c-10.238,1.888-12.13,4.558-12.13,17.64v27.094
c0,4.407-0.621,9.775-1.423,13.235c-0.94,3.469-2.354,5.363-5.664,7.41c3.31,2.355,4.724,4.097,5.516,7.249
c0.95,3.622,1.571,8.501,1.571,13.234v27.573c0,12.758,1.739,15.122,12.13,17.173v8.351
C30.193,157.873,25.162,156.772,20.116,151.421z"/>
</g>
<g>
<path fill="#63BB46" d="M173.762,158.35v-8.351c10.403-2.051,12.136-4.415,12.136-17.173v-27.573c0-4.733,0.634-9.612,1.573-13.234
c0.791-3.152,2.21-4.893,5.52-7.249c-3.309-2.047-4.729-3.94-5.673-7.41c-0.786-3.459-1.419-8.828-1.419-13.235V37.031
c0-13.082-1.891-15.752-12.136-17.64v-8.366c12.919,0.332,16.867,0.788,21.742,2.362c5.04,1.59,9.294,5.843,11.189,11.03
c1.575,4.263,2.056,7.733,2.056,15.771v25.517c0,7.097,0.301,8.815,2.199,11.518c1.897,2.342,4.096,3.606,8.981,5.025v4.877
c-9.928,3.478-11.18,5.365-11.18,16.393v25.691c0,11.954-1.426,17.636-5.989,22.211
C197.712,156.772,192.675,157.873,173.762,158.35z"/>
</g>
<g>
<path d="M140.865,22.474c3.434,0.283,8.858,2.001,12.916,5.565c4.331,4.19,5.312,10.578,3.803,16.346
c-1.354,5.181-2.864,7.862-8.135,11.416c-5.315,3.62-11.768,3.331-11.768,3.331v22.344l10.886,8.806l-10.886,8.786v30.473
c0,0,10.92-6.273,17.669-20.237c0,0,0.292-0.774,0.924-2.24c0.605,3.788,0.247,11.379-3.995,21.077
c-3.197,7.353-8.994,14.436-16.294,18.47c-12.915,7.137-22.612,7.835-32.986,5.671c-12.148-2.514-23.206-9.305-30.76-21.241
c-5.276-8.391-7.649-18.15-7.435-28.684c0.432-20.613,15.759-38.37,33.463-45.043c2.173-0.801,3.036-1.331,6.077-1.594
c-1.404,0.952-3.025,2.161-5.025,3.49C93.611,63,88.712,70.446,86.645,76.187l34.372-15.319v48.066l-27.714,13.847
c3.158,4.43,12.744,11.035,20.967,11.959c13.941,1.547,22.152-4.545,22.152-4.545l-0.014-31.129l-10.81-8.786l10.824-8.784V59.131
c-5.909-0.708-13.078-2.662-17.276-3.696c-6.167-1.528-26.713-7.286-29.936-7.761c-3.244-0.478-7.222-0.329-9.637,1.809
c-2.418,2.188-3.91,6.007-2.871,9.454c0.573,1.95,1.918,3.096,2.945,4.195c0,0-1.188-0.095-3.364-1.387
c-3.859-2.325-6.821-6.907-7.176-12.535c-0.442-7.318,2.582-13.968,8.649-18.439c5.281-3.378,11.25-5.543,18.193-4.584
c10.116,1.449,23.722,7.205,35.851,10.104c4.693,1.125,8.347,1.497,11.641-0.417c1.542-1.087,4.24-3.943,2.041-7.788
c-2.575-4.436-7.534-4.328-11.731-5.129C137.346,22.212,138.165,22.212,140.865,22.474z M99.996,117.999V71.608l-13.955,6.245
c0,0-3.576,7.958-2.955,19.531c0.48,9.016,5.542,19.823,9.43,24.345L99.996,117.999z"/>
</g>
<g>
<g>
<path d="M264.396,13.138c1.104,0.087,2.844,0.643,4.145,1.792c1.39,1.336,1.708,3.392,1.226,5.247
c-0.439,1.658-0.918,2.527-2.613,3.661c-1.712,1.163-3.779,1.07-3.779,1.07v7.172l3.498,2.827l-3.498,2.827v9.778
c0,0,3.504-2.01,5.674-6.495c0,0,0.092-0.247,0.292-0.717c0.197,1.209,0.083,3.651-1.283,6.764
c-1.019,2.367-2.883,4.638-5.23,5.935c-4.147,2.293-7.259,2.511-10.589,1.817c-3.902-0.81-7.455-2.993-9.877-6.814
c-1.692-2.704-2.459-5.837-2.386-9.217c0.137-6.615,5.058-12.32,10.749-14.464c0.692-0.259,0.971-0.431,1.951-0.509
c-0.452,0.308-0.973,0.697-1.616,1.122c-1.831,1.215-3.404,3.606-4.074,5.444l11.037-4.912v15.437l-8.893,4.444
c1.006,1.425,4.088,3.54,6.728,3.84c4.476,0.495,7.106-1.459,7.106-1.459v-9.993l-3.471-2.827l3.471-2.823v-7.176
c-1.891-0.224-4.192-0.857-5.538-1.186c-1.985-0.491-8.583-2.342-9.617-2.499c-1.037-0.149-2.317-0.103-3.09,0.586
c-0.774,0.702-1.254,1.933-0.925,3.041c0.185,0.621,0.619,0.985,0.947,1.339c0,0-0.379-0.023-1.078-0.435
c-1.237-0.754-2.191-2.225-2.306-4.026c-0.142-2.354,0.833-4.487,2.778-5.924c1.695-1.086,3.612-1.786,5.844-1.473
c3.243,0.468,7.615,2.312,11.514,3.243c1.505,0.365,2.673,0.482,3.735-0.132c0.494-0.35,1.363-1.269,0.65-2.5
c-0.826-1.422-2.416-1.387-3.766-1.647C263.274,13.057,263.533,13.057,264.396,13.138z M251.272,43.819V28.92l-4.479,2.003
c0,0-1.146,2.553-0.947,6.268c0.159,2.902,1.782,6.363,3.025,7.818L251.272,43.819z"/>
</g>
<g>
<path d="M307.204,28.187c0,0-3.373,2.064-5.655,3.409c-2.271,1.344-5.321,2.842-5.321,2.842V48.66l-2.035,1.621l0.272,0.329
l1.984-1.608l6.218,5.62l10.811-8.561l-0.261-0.312l-5.971,4.692l-4.915-4.601v-1.714l9.873-7.251L307.204,28.187z
M307.348,39.936l-5.017,3.668V31.396L307.348,39.936z"/>
</g>
<g>
<path d="M278.875,59.974c1.416,0.348,3.92,0.541,6.933-0.969c3.344-1.672,5.029-5.222,5.003-8.867l0.145-5.156V33.714l2.136-1.633
l-0.25-0.319l-2.104,1.596l-4.851-5.415l-6.226,5.349V15.128l-7.774,6.009c0.338,0.227,1.442,0.424,1.481,1.98v25.451
l-3.306,2.438l0.225,0.341l1.6-1.184l4.429,4.121l6.965-5.549l-0.243-0.325l-1.639,1.302l-1.738-1.716l0.018-14.185l2.03-1.732
l3.028,3.771c0,0-0.006,9.178,0.009,12.231c-0.033,3.243-0.038,7.296-1.741,9.258C281.293,59.314,280.608,59.455,278.875,59.974z"
/>
</g>
<g>
<path d="M327.274,58.695c-2.784-0.33-3.96-2.003-3.925-3.339c0.023-0.865,0.797-2.529,2.489-2.765
c1.688-0.216,3.421,0.568,4.884,2.281l6.433-7.112l-0.307-0.28l-1.728,1.936c-1.758-1.994-4.249-3.25-6.725-3.617V24.126
l16.71,30.454c0,0,0.159,0.341,0.849,0.341c0.589,0.017,0.448-0.48,0.448-0.48l-0.003-30.638c1.362-0.051,3.43-0.805,4.438-1.832
c3.22-3.31,1.906-6.916,1.549-7.27c-0.194,1.586-1.398,3.165-3.425,3.169c-2.66,0.012-4.283-1.943-4.283-1.943l-6.423,7.319
l0.306,0.284l1.837-2.099c2.256,2.072,3.898,2.264,5.597,2.372v17.784l-12.403-22.53c-1.124-1.856-2.823-3.496-5.506-3.515
c-3.084-0.012-5.286,2.697-5.553,5.024c-0.298,2.653,0.041,3.256,0.041,3.256s0.448-2.946,2.268-2.907
c1.631,0.019,2.485,1.522,3.144,2.651v6.524c-1.693,0.126-6.073,0.309-6.35,4.876c-0.015,1.699,1.042,3.481,1.962,4.082
c1.186,0.784,2.11,0.766,2.11,0.766s-1.417-0.763-0.996-2.258c0.382-1.335,3.174-1.548,3.274-0.992v9.203
c-1.348-0.017-5.64,0.137-7.573,3.821c-1.172,2.215-1.1,4.705,0.146,6.464C321.573,57.484,323.667,59.314,327.274,58.695z"/>
</g>
<g>
<path d="M362.58,28.187c0,0-3.385,2.064-5.66,3.409c-2.282,1.344-5.325,2.842-5.325,2.842V48.66l-2.031,1.621l0.266,0.329
l1.99-1.608l6.213,5.62l10.818-8.561l-0.257-0.312l-5.978,4.692l-4.907-4.601v-1.714l9.866-7.251L362.58,28.187z M362.719,39.936
l-5.011,3.668V31.396L362.719,39.936z"/>
</g>
<g>
<path d="M377.687,54.733l-5.297-4.407l-2.331,1.689l-0.231-0.325l2.362-1.73V37.645c0.116-5.069-4.642-3.808-4.384-9.194
c0.115-2.364,2.401-4.154,3.562-4.734c1.228-0.631,2.572-0.631,2.572-0.631s-2.177,1.356-1.647,3.308
c0.812,3.008,5.952,3.272,6.044,7.273v13.976l3.801,3.039l1.001-0.783V34.77l-2.05-2.026l5.271-4.653l4.816,4.263l-1.838,1.981
v13.404l4.504,3.713l0.804-0.499V34.824l-2.058-1.923l5.291-4.827l4.934,4.071l1.976-1.736l0.264,0.304l-4.439,3.897v13.142
l-11.353,7.011l-5.814-4.598L377.687,54.733z"/>
</g>
<g>
<path d="M609.974,28.187c0,0-3.385,2.064-5.653,3.409c-2.271,1.344-5.323,2.842-5.323,2.842V48.66l-2.04,1.621l0.271,0.329
l1.991-1.608l6.214,5.62l10.815-8.561l-0.256-0.312l-5.975,4.692l-4.915-4.601v-1.714l9.87-7.251L609.974,28.187z M610.122,39.936
l-5.02,3.668V31.396L610.122,39.936z"/>
</g>
<g>
<polygon points="559.22,34.144 559.485,34.447 561.521,32.704 564.536,36.121 564.536,47.867 563.083,49.205 567.785,54.535
572.613,49.77 570.631,47.71 570.631,33.497 571.827,32.536 575.18,36.44 575.18,48.155 573.923,49.41 578.358,54.404
583.091,49.654 581.354,47.827 581.308,33.552 582.589,32.522 586.07,36.355 586.07,48.008 584.927,49.155 589.829,54.491
596.401,48.418 596.121,48.118 594.522,49.59 592.073,46.872 592.073,33.569 594.436,31.78 594.187,31.458 591.825,33.248
587.345,28.233 580.956,33.292 576.476,28.422 570.302,33.243 565.778,28.438 "/>
</g>
<g>
<polygon points="545.834,33.78 546.104,34.08 547.822,32.597 550.521,35.784 550.521,49.215 548.618,50.875 548.885,51.181
550.875,49.48 555.219,54.491 561.487,48.888 561.22,48.582 559.375,50.209 556.778,47.222 556.778,34.084 558.972,32.188
558.703,31.88 556.622,33.666 552.051,28.345 "/>
</g>
<g>
<polygon points="547.65,22.656 552.369,18.331 556.207,22.587 551.46,26.896 "/>
</g>
<g>
<path d="M541.291,13.138c1.113,0.087,2.844,0.643,4.153,1.792c1.392,1.336,1.709,3.392,1.217,5.247
c-0.428,1.658-0.919,2.527-2.607,3.661c-1.713,1.163-3.776,1.07-3.776,1.07v7.172l3.499,2.827l-3.499,2.827v9.778
c0,0,3.505-2.01,5.669-6.495c0,0,0.101-0.247,0.296-0.717c0.186,1.209,0.085,3.651-1.277,6.764
c-1.027,2.367-2.893,4.638-5.234,5.935c-4.149,2.293-7.263,2.511-10.595,1.817c-3.905-0.81-7.454-2.993-9.871-6.814
c-1.701-2.704-2.458-5.837-2.393-9.217c0.139-6.615,5.069-12.32,10.759-14.464c0.682-0.259,0.968-0.431,1.947-0.509
c-0.459,0.308-0.967,0.697-1.624,1.122c-1.825,1.215-3.398,3.606-4.064,5.444l11.036-4.912v15.437l-8.902,4.444
c1.011,1.425,4.092,3.54,6.728,3.84c4.485,0.495,7.121-1.459,7.121-1.459v-9.993l-3.478-2.827l3.478-2.823v-7.176
c-1.895-0.224-4.197-0.857-5.548-1.186c-1.984-0.491-8.578-2.342-9.612-2.499c-1.046-0.149-2.32-0.103-3.093,0.586
c-0.778,0.702-1.254,1.933-0.924,3.041c0.186,0.621,0.621,0.985,0.935,1.339c0,0-0.375-0.023-1.058-0.435
c-1.253-0.754-2.212-2.225-2.314-4.026c-0.15-2.354,0.828-4.487,2.776-5.924c1.695-1.086,3.612-1.786,5.843-1.473
c3.245,0.468,7.614,2.312,11.513,3.243c1.513,0.365,2.681,0.482,3.731-0.132c0.5-0.35,1.363-1.269,0.656-2.5
c-0.829-1.422-2.415-1.387-3.763-1.647C540.171,13.057,540.429,13.057,541.291,13.138z M528.174,43.819V28.92l-4.482,2.003
c0,0-1.143,2.553-0.945,6.268c0.157,2.902,1.781,6.363,3.025,7.818L528.174,43.819z"/>
</g>
<g>
<path d="M622.005,56.467c-0.725,0.211-3.821-0.552-4.575-3.781c-0.729-3.128,1.464-5.264,4.749-8.619l-3.894-3.554v-6.796
c0,0,2.866-1.432,5.105-2.827c2.231-1.41,4.536-2.92,4.536-2.92s1.675,2.101,3.56,1.945c2.967-0.261,2.823-2.596,2.738-3.152
c0.509,0.907,1.853,3.587-3.346,9.586l4.235,3.415v8.822c0,0-4.91,2.56-9.569,5.967c0,0-2.601-3.26-4.853-1.701
C619.159,53.905,619.866,55.677,622.005,56.467z M618.344,49.654c0,0,2.231-3.691,6.074-2.892c3.688,0.751,4.964,4.65,4.964,4.65
v-8.962l-2.564-2.232C623.993,43.06,618.972,47.167,618.344,49.654z M624.037,30.947v7.049l2.361,2.06
c0,0,5.103-4.094,6.956-7.878c0,0-2.299,3.116-5.378,2.157C625.386,33.542,624.037,30.947,624.037,30.947z"/>
</g>
<g>
<path d="M463.025,34.058l1.91-1.757l0.272,0.308l-1.859,1.726v14.029c0,0-3.521,1.884-5.983,3.26
c-2.455,1.401-5.102,3.023-5.102,3.023l-6.465-5.46l-1.709,1.505l-0.283-0.321l1.805-1.562V33.718h0.019
c0,0,3.052-1.376,5.635-2.827c2.303-1.298,4.879-2.813,4.879-2.813L463.025,34.058z M451.752,46.418l5.469,4.966V36.222
l-5.469-5.052V46.418z"/>
</g>
<g>
<path d="M475.748,32.644l4.12-4.207c0,0,0.565,0.493,1.101,0.76c0.292,0.143,1.546,0.78,2.685,0.161
c0.623-0.343,0.702-0.435,1.386-1.072c0.138,3.272-1.43,5.563-3.39,6.512c-0.801,0.394-3.134,1.143-5.584-1.848v15.11l2.603,2.291
l2.171-1.794l0.249,0.312l-6.805,5.684l-5.173-4.723l-1.856,1.764l-0.314-0.319l2.836-2.565l0.022-13.029l-2.177-2.884
l-1.865,1.642l-0.271-0.294l6.587-5.934L475.748,32.644z"/>
</g>
<g>
<path d="M493.101,38.941l7.599-11.066c0,0,1.001,1.185,2.752,1.638c2.366,0.623,4.446-1.671,4.446-1.671
c-0.398,2.954-1.903,6.323-4.995,6.83c-2.731,0.453-5.267-1.667-5.267-1.667l-0.487,0.761l10.548,15.94l2.108-1.847l0.286,0.304
l-7.251,6.328L493.101,38.941z"/>
</g>
<g>
<path d="M486.817,24.163c0-2.386-0.977-3.864-2.259-3.766l8.289-5.811v32.969l0,0l2.19,2.308l1.654-1.438l0.271,0.312
l-6.681,5.837l-4.536-4.258l-1.797,1.596l-0.296-0.313l3.164-2.754V24.163z"/>
</g>
<g>
<path d="M417.487,23.613c0-2.215-0.904-3.471-2.371-3.497c-2.104-0.043-2.61,2.929-2.61,2.929s-0.387-2.291,1.539-4.375
c1.076-1.169,3.088-2.79,6.229-2.037c3.251,0.787,4.182,3.302,4.182,5.533v30.677c0,0,1.224,0.151,2.069,0.325
c0.964,0.216,1.894,0.476,1.894,0.476V16.65h0.399v4.99l6.669-5.362l4.873,4.336l2.279-1.977l0.258,0.314l-2.378,2.047v28.52
c-0.12,1.874-0.415,3.768-2.17,4.844c-3.92,2.33-8.652-0.354-12.864-0.965c-3.132-0.463-8.037-1.055-9.254,1.816
c-0.418,0.942-0.387,2.405,1.037,3.34c2.839,1.911,15.508-3.189,19.865-1.16c3.958,1.848,3.941,4.769,3.332,6.757
c-1.032,3.767-5.778,4.419-5.778,4.419s2.32-1.337,1.658-3.568c-0.336-1.139-1.105-1.449-3.592-1.172
c-5.431,0.612-11.92,3.245-16.29,1.422c-2.241-0.94-3.833-3.753-3.681-6.506c0.109-3.979,4.705-5.547,4.705-5.547V38.5
c-0.137-0.583-2.586-0.424-3.122,0.65c-0.811,1.629,1.011,2.393,1.011,2.393s-1.504,0.209-2.779-1.255
c-0.618-0.709-1.907-3.211-0.231-5.526c1.382-1.904,3.03-2.239,5.122-2.476V23.613z M428.817,53.744c0,0,1.944,0.52,3.352-0.638
c1.568-1.293,1.401-3.102,1.401-3.102V38.576c0,0-0.907-1.158-2.354-1.158c-1.438,0-2.399,1.194-2.399,1.194V53.744z
M433.57,23.758l-3.203-2.817l-1.55,1.225v10.588c0,0,0.962,1.204,2.399,1.204c1.446,0,2.354-1.159,2.354-1.159V23.758z
M433.57,33.431c0,0-0.911,1.041-2.362,1.041c-1.435,0-2.391-1.041-2.391-1.041v4.508c0,0,0.956-1.05,2.391-1.05
c1.451,0,2.362,0.998,2.362,0.998V33.431z"/>
</g>
</g>
<g>
<path d="M326.983,117.85c0,5.348-0.836,10.25-2.507,14.707c-1.671,4.457-4.011,8.338-7.019,11.643
c-3.008,3.306-6.648,5.96-10.918,7.966c-4.271,2.005-9.007,3.231-14.205,3.676c-1.709,0.15-3.064,0.261-4.066,0.334
c-1.003,0.075-1.727,0.111-2.173,0.111H243.09v-17.157h7.464V95.345h-7.464V78.188h42.113c3.713,0,7.019,0.242,9.916,0.724
c2.896,0.484,5.719,1.281,8.467,2.396c7.501,2.971,13.275,7.614,17.324,13.926C324.958,101.547,326.983,109.086,326.983,117.85z
M297.459,116.958c0-4.233-0.465-7.78-1.393-10.64c-0.93-2.858-2.47-5.365-4.624-7.521c-1.337-1.41-2.896-2.357-4.679-2.841
c-1.782-0.482-4.233-0.686-7.353-0.613v43.785c3.045,0.075,5.421-0.148,7.13-0.668c1.708-0.519,3.342-1.485,4.902-2.897
C295.454,131.999,297.459,125.798,297.459,116.958z"/>
<path d="M391.6,135.007h-35.094c0.891,6.016,3.972,9.024,9.247,9.024c1.708,0,3.212-0.352,4.512-1.058
c1.298-0.705,2.58-1.912,3.844-3.621H391.6c-1.041,2.601-2.005,4.643-2.896,6.128c-0.891,1.486-1.969,2.86-3.231,4.122
c-2.451,2.451-5.571,4.364-9.358,5.738c-3.788,1.373-7.91,2.061-12.367,2.061c-10.25,0-17.976-2.413-23.174-7.242
c-2.896-2.674-5.163-5.849-6.796-9.526c-1.635-3.676-2.451-7.445-2.451-11.308c0-4.084,0.742-7.816,2.229-11.197
c1.485-3.379,3.583-6.295,6.294-8.746c2.71-2.451,5.941-4.345,9.693-5.682c3.75-1.337,7.854-2.005,12.311-2.005
c3.788,0,7.242,0.501,10.361,1.504c3.119,1.003,6.089,2.582,8.913,4.735c1.633,1.189,3.137,2.637,4.512,4.345
c1.374,1.709,2.543,3.584,3.51,5.626c0.964,2.044,1.688,4.197,2.172,6.462c0.482,2.267,0.649,4.551,0.501,6.852L391.6,135.007z
M369.652,125.426c0-6.164-2.192-9.247-6.573-9.247c-2.972,0-4.977,1.412-6.016,4.233c-0.223,0.596-0.373,1.245-0.446,1.95
c-0.075,0.707-0.111,1.877-0.111,3.51v0.891h13.146V125.426z"/>
<path d="M448.865,117.293l-18.049,38.994h-18.939l-15.709-38.994h-3.676v-14.484h32.866v14.484h-3.676l6.238,16.154l7.02-16.154
h-4.123v-14.484h20.834v14.484H448.865z"/>
<path d="M512.48,135.007h-35.096c0.893,6.016,3.973,9.024,9.248,9.024c1.707,0,3.211-0.352,4.512-1.058
c1.299-0.705,2.58-1.912,3.844-3.621h17.492c-1.041,2.601-2.006,4.643-2.898,6.128c-0.891,1.486-1.969,2.86-3.23,4.122
c-2.451,2.451-5.57,4.364-9.357,5.738c-3.789,1.373-7.91,2.061-12.367,2.061c-10.25,0-17.975-2.413-23.174-7.242
c-2.896-2.674-5.162-5.849-6.795-9.526c-1.635-3.676-2.451-7.445-2.451-11.308c0-4.084,0.74-7.816,2.227-11.197
c1.486-3.379,3.584-6.295,6.295-8.746c2.711-2.451,5.941-4.345,9.693-5.682c3.75-1.337,7.855-2.005,12.311-2.005
c3.789,0,7.242,0.501,10.361,1.504c3.119,1.003,6.09,2.582,8.914,4.735c1.633,1.189,3.137,2.637,4.512,4.345
c1.373,1.709,2.543,3.584,3.51,5.626c0.963,2.044,1.688,4.197,2.172,6.462c0.482,2.267,0.648,4.551,0.502,6.852L512.48,135.007z
M490.531,125.426c0-6.164-2.191-9.247-6.572-9.247c-2.973,0-4.977,1.412-6.018,4.233c-0.223,0.596-0.371,1.245-0.445,1.95
c-0.074,0.707-0.111,1.877-0.111,3.51v0.891h13.146V125.426z"/>
<path d="M516.379,156.287v-14.483h4.457V92.671h-4.457V78.188h29.635v63.616h4.568v14.483H516.379z"/>
<path d="M618.654,129.771c0,4.085-0.779,7.818-2.34,11.197c-1.561,3.38-3.77,6.294-6.629,8.746s-6.258,4.345-10.193,5.682
c-3.938,1.337-8.244,2.005-12.924,2.005s-8.988-0.707-12.924-2.117c-3.938-1.41-7.354-3.342-10.25-5.793
c-2.896-2.451-5.164-5.365-6.797-8.746c-1.635-3.379-2.451-7.074-2.451-11.085c0-4.011,0.816-7.724,2.451-11.141
c1.633-3.415,3.9-6.368,6.797-8.857c2.896-2.488,6.312-4.438,10.25-5.849c3.936-1.41,8.205-2.117,12.812-2.117
c4.752,0,9.115,0.688,13.09,2.061c3.973,1.375,7.371,3.287,10.195,5.738c2.82,2.451,5.012,5.403,6.572,8.857
S618.654,125.612,618.654,129.771z M593.475,129.994c0-4.159-0.297-7.056-0.891-8.69c-0.596-1.56-1.449-2.803-2.562-3.732
c-1.113-0.928-2.377-1.393-3.787-1.393c-2.229,0-3.938,1.041-5.125,3.12c-1.189,2.08-1.783,5.125-1.783,9.136
c0,4.456,0.613,7.874,1.838,10.25c1.227,2.378,2.99,3.565,5.293,3.565c1.262,0,2.469-0.463,3.621-1.393
c1.15-0.928,2.021-2.134,2.617-3.621C593.215,135.75,593.475,133.336,593.475,129.994z"/>
<path d="M691.406,129.548c0,4.011-0.613,7.743-1.84,11.197c-1.225,3.454-2.99,6.406-5.291,8.857
c-2.229,2.451-4.83,4.364-7.799,5.738c-2.973,1.373-5.904,2.061-8.803,2.061c-2.377,0-4.809-0.428-7.297-1.281
s-5.441-2.321-8.857-4.401v10.138h6.018v14.484h-35.652v-14.484h4.457v-44.564h-4.457v-14.484h29.635v5.014
c3.268-2.228,6.201-3.805,8.803-4.735c2.598-0.928,5.309-1.393,8.133-1.393c5.496,0,10.174,1.821,14.037,5.459
c2.748,2.601,4.92,5.905,6.518,9.916C690.605,121.081,691.406,125.241,691.406,129.548z M666.227,129.994
c0-1.931-0.074-3.657-0.223-5.181c-0.15-1.521-0.373-2.691-0.668-3.509c-0.596-1.56-1.469-2.803-2.619-3.732
c-1.152-0.928-2.471-1.393-3.955-1.393c-4.828,0-7.242,4.161-7.242,12.478c0,9.062,2.414,13.592,7.242,13.592
c1.484,0,2.822-0.463,4.012-1.393c1.186-0.928,2.078-2.134,2.674-3.621C665.965,135.75,666.227,133.336,666.227,129.994z"/>
<path d="M754.799,135.007h-35.096c0.893,6.016,3.973,9.024,9.248,9.024c1.707,0,3.211-0.352,4.512-1.058
c1.299-0.705,2.58-1.912,3.844-3.621h17.492c-1.041,2.601-2.006,4.643-2.898,6.128c-0.891,1.486-1.969,2.86-3.23,4.122
c-2.451,2.451-5.57,4.364-9.357,5.738c-3.789,1.373-7.91,2.061-12.367,2.061c-10.25,0-17.975-2.413-23.174-7.242
c-2.896-2.674-5.162-5.849-6.795-9.526c-1.635-3.676-2.451-7.445-2.451-11.308c0-4.084,0.74-7.816,2.227-11.197
c1.486-3.379,3.584-6.295,6.295-8.746c2.711-2.451,5.941-4.345,9.693-5.682c3.75-1.337,7.855-2.005,12.311-2.005
c3.789,0,7.242,0.501,10.361,1.504c3.119,1.003,6.09,2.582,8.914,4.735c1.633,1.189,3.137,2.637,4.512,4.345
c1.373,1.709,2.543,3.584,3.51,5.626c0.963,2.044,1.688,4.197,2.172,6.462c0.482,2.267,0.648,4.551,0.502,6.852L754.799,135.007z
M732.85,125.426c0-6.164-2.191-9.247-6.572-9.247c-2.973,0-4.977,1.412-6.018,4.233c-0.223,0.596-0.371,1.245-0.445,1.95
c-0.074,0.707-0.111,1.877-0.111,3.51v0.891h13.146V125.426z"/>
<path d="M802.258,120.356c-1.635,0.111-3.232,0.354-4.791,0.724c-3.418,0.818-5.906,2.526-7.465,5.125
c-0.521,0.966-0.875,2.155-1.059,3.565c-0.186,1.412-0.279,3.64-0.279,6.685v5.348h6.018v14.483h-35.652v-14.483h4.457v-24.51
h-4.457v-14.484h29.635v8.245c3.121-3.342,6.146-5.811,9.08-7.409c2.934-1.597,6.184-2.284,9.75-2.061l1.893,0.111v18.494
C806.268,120.189,803.891,120.245,802.258,120.356z"/>
<path d="M862.309,139.241c0,2.601-0.521,4.996-1.561,7.186c-1.041,2.191-2.488,4.105-4.346,5.738
c-1.857,1.634-4.104,2.916-6.74,3.844c-2.637,0.928-5.514,1.393-8.633,1.393c-1.412,0-2.73-0.056-3.955-0.167
c-1.227-0.111-2.508-0.316-3.844-0.612c-1.338-0.298-2.77-0.686-4.291-1.17c-1.521-0.482-3.285-1.095-5.291-1.838v2.674h-12.033
v-17.826h11.922c0.742,2.378,1.672,4.161,2.785,5.348c1.113,1.189,2.822,1.783,5.125,1.783c1.707,0,3.064-0.352,4.066-1.059
c1.002-0.705,1.504-1.727,1.504-3.064c0-1.855-1.189-3.304-3.564-4.345l-11.588-4.902c-2.971-1.262-5.219-3.1-6.74-5.515
c-1.523-2.413-2.283-5.031-2.283-7.854c0-2.301,0.518-4.493,1.559-6.573c1.041-2.079,2.488-3.899,4.346-5.459
c1.855-1.56,4.029-2.803,6.518-3.732c2.488-0.928,5.143-1.393,7.967-1.393c2.375,0,4.623,0.261,6.74,0.78
c2.115,0.521,4.473,1.375,7.074,2.562v-2.229h12.143v17.158h-11.141c-0.52-2.674-1.318-4.716-2.395-6.128
c-1.078-1.41-2.619-2.117-4.623-2.117c-1.488,0-2.713,0.39-3.678,1.17c-0.967,0.78-1.447,1.765-1.447,2.952
c0,2.081,1.373,3.677,4.121,4.791l11.365,4.456C858.668,127.915,862.309,132.631,862.309,139.241z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

49
vendor/bootstrap-toggle/doc/script.js vendored Normal file
View File

@ -0,0 +1,49 @@
+function ($) {
'use strict';
$('.example:not(.skip)').each(function() {
// fetch & encode html
var html = $('<div>').text($(this).html()).html()
// find number of space/tabs on first line (minus line break)
var count = html.match(/^(\s+)/)[0].length - 1
// replace tabs/spaces on each lines with
var regex = new RegExp('\\n\\s{'+count+'}', 'g')
var code = html.replace(regex, '\n').replace(/\t/g, ' ').trim()
// other cleanup
code = code.replace(/=""/g,'')
// add code block to dom
$(this).after( $('<code class="highlight html">').html(code) )
});
$('code.highlight').each(function() {
hljs.highlightBlock(this)
});
}(jQuery);
var Demo = function () {}
Demo.prototype.init = function(selector) {
$(selector).bootstrapToggle(selector)
}
Demo.prototype.destroy = function(selector) {
$(selector).bootstrapToggle('destroy')
}
Demo.prototype.on = function(selector) {
$(selector).bootstrapToggle('on')
}
Demo.prototype.off = function(selector) {
$(selector).bootstrapToggle('off')
}
Demo.prototype.toggle = function(selector) {
$(selector).bootstrapToggle('toggle')
}
Demo.prototype.enable = function(selector) {
$(selector).bootstrapToggle('enable')
}
Demo.prototype.disable = function(selector) {
$(selector).bootstrapToggle('disable')
}
demo = new Demo()

View File

@ -0,0 +1,112 @@
header, footer {
padding: 20px;
background-image: url('header.png');
background-size: 256px 256px;
}
footer {
color: #fff;
text-align: center;
}
.nyt-logo {
max-height: 40px;
margin-top: 5px;
margin-right: 5px;
}
nav.navbar {
margin-bottom: 10px;
background-color: #fff;
border: 0px;
border-radius: 2px;
}
#navbar {
margin: 0px;
}
#navbar .navbar-nav li iframe {
margin-top: 15px;
}
#navbar .navbar-nav li:last-child iframe {
margin-right: 15px;
}
@media screen and (max-width: 767px) {
#navbar .navbar-nav li iframe {
display: none;
}
}
.mast-head {
margin: 10px 0;
}
.mast-head h1 {
margin-bottom: 15px;
color: #fff;
}
.mast-head p {
color: #fff;
}
.mast-links {
padding-top: 10px;
}
.mast-links > * {
vertical-align: middle;
margin-bottom: 10px;
}
.mast-links > .btn {
margin-right: 30px;
}
main {
margin: 10px 20px;
}
main .container {
margin-bottom: 40px;
}
code.hljs {
border: 1px solid #ccc;
padding: 1em;
white-space: pre;
margin-bottom: 10px;
}
.example {
position: relative;
border: 1px solid #ccc;
padding: 1em 1em 0.5em 1em;
border-radius: 4px 4px 0 0;
}
.example:after {
content: "Example";
position: absolute;
top: 0px;
right: 0px;
padding: 3px 7px;
font-size: 12px;
font-weight: bold;
background-color: #f5f5f5;
border: 1px solid #ccc;
color: #9da0a4;
border-radius: 0px 4px 0px 4px;
border-width: 0px 0px 1px 1px;
}
.example + code.hljs {
border-top: 0;
border-radius: 0px 0px 4px 4px;
}
.example > * {
margin-bottom: 10px;
}
.example > div.toggle {
margin-right: 10px;
}
.table-striped code {
background-color: inherit;
}

449
vendor/bootstrap-toggle/index.html vendored Normal file
View File

@ -0,0 +1,449 @@
<!DOCTYPE html>
<html>
<head>
<script> if (window.location.href.indexOf('minhur.github.io') > 0) window.location.replace('http://www.bootstraptoggle.com') </script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="msvalidate.01" content="3638AEFC99423BA5CB586805286C39AA" />
<meta name="description" content="Bootstrap Toggle is a highly flexible Bootstrap plugin that converts checkboxes into toggles." />
<meta name="keywords" content="bootstrap, toggle, switch, bootstrap-toggle, bootstrap-switch" />
<meta name="author" content="metatags generator">
<meta name="robots" content="index, follow">
<meta name="revisit-after" content="1 month">
<title>Bootstrap Toggle</title>
<link rel="canonical" href="http://www.bootstraptoggle.com">
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/github.min.css" rel="stylesheet" >
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
<link href="css/bootstrap-toggle.css" rel="stylesheet">
<link href="doc/stylesheet.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
</head>
<body>
<header>
<nav class="navbar navbar-default container" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Bootstrap Toggle</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="#usage">Usage</a></li>
<li><a href="#api">API</a></li>
<li><a href="#events">Events</a></li>
<li><a href="#demos">Demos</a></li>
<li><a href="https://github.com/minhur/bootstrap-toggle/issues">Issues</a></li>
<li><a href="https://github.com/minhur/bootstrap-toggle/archive/master.zip">Download</a></li>
<li>
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=watch" allowtransparency="true" frameborder="0" scrolling="0" width="62" height="20"></iframe>
</li>
<li>
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=fork" allowtransparency="true" frameborder="0" scrolling="0" width="53" height="20"></iframe>
</li>
</ul>
</div>
</div>
</nav>
<div class="mast-head">
<div class="container">
<h1>Bootstrap Toggle</h1>
<p>Bootstrap Toggle is a highly flexible Bootstrap plugin that converts checkboxes into toggles</p>
<div class="mast-links">
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=watch&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="150" height="30"></iframe>
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=fork&count=true&size=large" allowtransparency="true" frameborder="0" scrolling="0" width="150" height="30"></iframe>
</div>
</div>
</div>
</header>
<main>
<div class="container">
<h2>Getting Started</h2>
<hr>
<h3>Installation</h3>
<p>You can <a href="https://github.com/minhur/bootstrap-toggle/archive/master.zip">download</a> the latest version of Bootstrap Toggle or use CDN to load the library.</p>
<p><span class="label label-warning">Warning</span> If you are using Bootstrap v2.3.2, use <code>bootstrap2-toggle.min.js</code> and <code>bootstrap2-toggle.min.css</code> instead.</p>
<code class="highlight">&lt;link href="https://gitcdn.github.io/bootstrap-toggle/2.2.0/css/bootstrap-toggle.min.css" rel="stylesheet"&gt;
&lt;script src="https://gitcdn.github.io/bootstrap-toggle/2.2.0/js/bootstrap-toggle.min.js"&gt;&lt;/script&gt;</code>
<h3>Bower Install</h3>
<p></p>
<code class="highlight bash">bower install bootstrap-toggle</code>
</div>
<div id="usage" class="container">
<h2>Usage</h2>
<hr>
<h3>Basic example</h3>
<p>Simply add <code>data-toggle="toggle"</code> to convert checkboxes into toggles.</p>
<div class="example">
<input type="checkbox" checked data-toggle="toggle">
</div>
<h3>Stacked checkboxes</h3>
<p>Refer to Bootstrap <a href="http://getbootstrap.com/css/#forms-controls" target="_blank">Form Controls</a> documentation to create stacked checkboxes. Simply add <code>data-toggle="toggle"</code> to convert checkboxes into toggles.</p>
<div class="example">
<div class="checkbox">
<label>
<input type="checkbox" data-toggle="toggle">
Option one is enabled
</label>
</div>
<div class="checkbox disabled">
<label>
<input type="checkbox" disabled data-toggle="toggle">
Option two is disabled
</label>
</div>
</div>
<h3>Inline Checkboxes</h3>
<p>Refer to Bootstrap <a href="http://getbootstrap.com/css/#forms-controls" target="_blank">Form Controls</a> documentation to create inline checkboxes. Simply add <code>data-toggle="toggle"</code> to a convert checkboxes into toggles.</p>
<div class="example">
<label class="checkbox-inline">
<input type="checkbox" checked data-toggle="toggle"> First
</label>
<label class="checkbox-inline">
<input type="checkbox" data-toggle="toggle"> Second
</label>
<label class="checkbox-inline">
<input type="checkbox" data-toggle="toggle"> Third
</label>
</div>
</div>
<div id="api" class="container">
<h2>API</h2>
<hr>
<h3>Initialize by JavaScript</h3>
<p>Initialize toggles with id <code>toggle-one</code> with a single line of JavaScript.</p>
<div class="example">
<input id="toggle-one" checked type="checkbox">
<script>
$(function() {
$('#toggle-one').bootstrapToggle();
})
</script>
</div>
<h3>Options</h3>
<p>Options can be passed via data attributes or JavaScript. For data attributes, append the option name to <code>data-</code>, as in <code>data-on="Enabled"</code>.</p>
<div class="example">
<input type="checkbox" data-toggle="toggle" data-on="Enabled" data-off="Disabled">
<input type="checkbox" id="toggle-two">
<script>
$(function() {
$('#toggle-two').bootstrapToggle({
on: 'Enabled',
off: 'Disabled'
});
})
</script>
</div>
<div class="table-responsive">
<table class="table table-striped table-condensed">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>on</td>
<td>string | html</td>
<td><code>"On"</code></td>
<td>Text of the <em>on</em> toggle</td>
</tr>
<tr>
<td>off</td>
<td>string | html</td>
<td><code>"Off"</code></td>
<td>Text of the <em>off</em> toggle</td>
</tr>
<tr>
<td>size</td>
<td>string</td>
<td><code>"normal"</code></td>
<td>
Size of the toggle. Possible values are:<code>large</code>,<code>normal</code>,<code>small</code>,<code>mini</code><br>
Refer to Bootstrap <a href="http://getbootstrap.com/css/#buttons-sizes" target="_blank">Button Sizes</a> documentation for more information.
</td>
</tr>
<tr>
<td>onstyle</td>
<td>string</td>
<td><code>"primary"</code></td>
<td>
Style of the <em>on</em> toggle.<br>Possible values are:<code>default</code>,<code>primary</code>,<code>success</code>,<code>info</code>,<code>warning</code>,<code>danger</code><br>
Refer to Bootstrap <a href="http://getbootstrap.com/css/#buttons-options" target="_blank">Button Options</a> documentation for more information.
</td>
</tr>
<tr>
<td>offstyle</td>
<td>string</td>
<td><code>"default"</code></td>
<td>
Style of the <em>off</em> toggle.<br>Possible values are:<code>default</code>,<code>primary</code>,<code>success</code>,<code>info</code>,<code>warning</code>,<code>danger</code><br>
Refer to Bootstrap <a href="http://getbootstrap.com/css/#buttons-options" target="_blank">Button Options</a> documentation for more information.
</td>
</tr>
<tr>
<td>style</td>
<td>string</td>
<td></td>
<td>
Appends the value to the class attribute of the toggle. This can be used to apply custom styles. Refer to Custom Styles for reference.
</td>
</tr>
<tr>
<td>width</td>
<td>integer</td>
<td><em>null</em></td>
<td>
Sets the width of the toggle. if set to <em>null</em>, width will be calculated.
</td>
</tr>
<tr>
<td>height</td>
<td>integer</td>
<td><em>null</em></td>
<td>
Sets the height of the toggle. if set to <em>null</em>, height will be calculated.
</td>
</tr>
</tbody>
</table>
</div>
<h3>Methods</h3>
<p>Methods can be used to control toggles directly.</p>
<div class="example">
<input id="toggle-demo" type="checkbox" data-toggle="toggle">
</div>
<div class="table-responsive">
<table class="table table-striped table-condensed">
<thead>
<tr>
<th>Method</th>
<th>Example</th>
<th>Description</th>
<th>Demo</th>
</tr>
</thead>
<tbody>
<tr>
<td><em>initialize</em></td>
<td><code>$('#toggle-demo').bootstrapToggle()</code></td>
<td>Initializes the toggle plugin with options</td>
<td><button class="btn btn-default btn-xs" onclick="demo.init('#toggle-demo')">Initialize</button></td>
</tr>
<tr>
<td>destroy</td>
<td><code>$('#toggle-demo').bootstrapToggle('destroy')</code></td>
<td>Destroys the toggle</td>
<td><button class="btn btn-default btn-xs" onclick="demo.destroy('#toggle-demo')">Destroy</button></td>
</tr>
<tr>
<td>on</td>
<td><code>$('#toggle-demo').bootstrapToggle('on')</code></td>
<td>Sets the toggle to 'On' state</td>
<td><button class="btn btn-default btn-xs" onclick="demo.on('#toggle-demo')">On</button></td>
</tr>
<tr>
<td>off</td>
<td><code>$('#toggle-demo').bootstrapToggle('off')</code></td>
<td>Sets the toggle to 'Off' state</td>
<td><button class="btn btn-default btn-xs" onclick="demo.off('#toggle-demo')">Off</button></td>
</tr>
<tr>
<td>toggle</td>
<td><code>$('#toggle-demo').bootstrapToggle('toggle')</code></td>
<td>Toggles the state of the toggle</td>
<td><button class="btn btn-default btn-xs" onclick="demo.toggle('#toggle-demo')">Toggle</button></td>
</tr>
<tr>
<td>enable</td>
<td><code>$('#toggle-demo').bootstrapToggle('enable')</code></td>
<td>Enables the toggle</td>
<td><button class="btn btn-default btn-xs" onclick="demo.enable('#toggle-demo')">Enable</button></td>
</tr>
<tr>
<td>disable</td>
<td><code>$('#toggle-demo').bootstrapToggle('disable')</code></td>
<td>Disables the toggle</td>
<td><button class="btn btn-default btn-xs" onclick="demo.disable('#toggle-demo')">Disable</button></td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="events" class="container">
<h2>Events</h2>
<hr>
<h3>Event Propagation</h3>
<p><span class="label label-primary">Note</span> All events are propagated to and from input element to the toggle. </p>
<p>You should listen to events from the <code>&lt;input type="checkbox"></code> directly rather than look for custom events.</p>
<div class="example">
<input id="toggle-event" type="checkbox" data-toggle="toggle">
<div id="console-event"></div>
<script>
$(function() {
$('#toggle-event').change(function() {
$('#console-event').html('Toggle: ' + $(this).prop('checked'))
})
})
</script>
</div>
<h3>API vs Input</h3>
<p>This also means that using the API or Input to trigger events will work both ways.</p>
<div class="example">
<input id="toggle-trigger" type="checkbox" data-toggle="toggle">
<button class="btn btn-success" onclick="toggleOn()">On by API</button>
<button class="btn btn-danger" onclick="toggleOff()">Off by API</button>
<button class="btn btn-success" onclick="toggleOnByInput()">On by Input</button>
<button class="btn btn-danger" onclick="toggleOffByInput()">Off by Input</button>
<script>
function toggleOn() {
$('#toggle-trigger').bootstrapToggle('on')
}
function toggleOff() {
$('#toggle-trigger').bootstrapToggle('off')
}
function toggleOnByInput() {
$('#toggle-trigger').prop('checked', true).change()
}
function toggleOffByInput() {
$('#toggle-trigger').prop('checked', false).change()
}
</script>
</div>
</div>
<div id="demos" class="container">
<h2>Demos</h2>
<hr>
<h3>Sizes</h3>
<p>Bootstrap toggle is available in different sizes. Refer to Bootstrap <a href="http://getbootstrap.com/css/#buttons-sizes" target="_blank">Button Sizes</a> documentation for more information.</p>
<div class="example">
<input type="checkbox" checked data-toggle="toggle" data-size="large">
<input type="checkbox" checked data-toggle="toggle" data-size="normal">
<input type="checkbox" checked data-toggle="toggle" data-size="small">
<input type="checkbox" checked data-toggle="toggle" data-size="mini">
</div>
<h3>Custom Sizes</h3>
<p>Bootstrap toggle can handle custom sizes by <code>data-width</code> and <code>data-height</code> options.</p>
<div class="example">
<input type="checkbox" checked data-toggle="toggle" data-width="100" data-height="75">
<input type="checkbox" checked data-toggle="toggle" data-height="75">
<input type="checkbox" checked data-toggle="toggle" data-width="100">
</div>
<h3>Colors</h3>
<p>Bootstrap Toggle supports various colors. Refer to Bootstrap <a href="http://getbootstrap.com/css/#buttons-options" target="_blank">Button Options</a> documentation for more information.</p>
<div class="example">
<input type="checkbox" checked data-toggle="toggle" data-onstyle="primary">
<input type="checkbox" checked data-toggle="toggle" data-onstyle="success">
<input type="checkbox" checked data-toggle="toggle" data-onstyle="info">
<input type="checkbox" checked data-toggle="toggle" data-onstyle="warning">
<input type="checkbox" checked data-toggle="toggle" data-onstyle="danger">
<input type="checkbox" checked data-toggle="toggle" data-onstyle="default">
</div>
<h3>Colors Mix</h3>
<p>You can style on state as well as the off state.</p>
<div class="example">
<input type="checkbox" checked data-toggle="toggle" data-onstyle="success" data-offstyle="danger">
<input type="checkbox" checked data-toggle="toggle" data-onstyle="warning" data-offstyle="info">
</div>
<h3>Custom Style</h3>
<p>Customized styles can be applied as easily.</p>
<div class="example">
<style>
.toggle.ios, .toggle-on.ios, .toggle-off.ios { border-radius: 20px; }
.toggle.ios .toggle-handle { border-radius: 20px; }
</style>
<input type="checkbox" checked data-toggle="toggle" data-style="ios">
<style>
.toggle.android { border-radius: 0px;}
.toggle.android .toggle-handle { border-radius: 0px; }
</style>
<input type="checkbox" checked data-toggle="toggle" data-style="android" data-onstyle="info">
</div>
<h3>Custom Text</h3>
<p>The text can be changed easily with attributes or options.</p>
<div class="example">
<input type="checkbox" checked data-toggle="toggle" data-on="Ready" data-off="Not Ready" data-onstyle="success" data-offstyle="danger">
</div>
<h3>Icons/Html Text</h3>
<p>You can easily add icons or images since html is supported for on/off text.</p>
<div class="example">
<input type="checkbox" checked data-toggle="toggle" data-on="<i class='fa fa-play'></i> Play" data-off="<i class='fa fa-pause'></i> Pause">
</div>
<h3>Multiple Lines of Text</h3>
<p>Toggles with multiple lines will adjust its heights.</p>
<div class="example">
<input type="checkbox" checked data-toggle="toggle" data-on="Hello<br>World" data-off="Goodbye<br>World">
</div>
<h3>Animation Speed</h3>
<p>Transition speed can be easily controlled with css <code>transition</code> property on <code>.toggle-group</code>. You can also turn animation off completely.</p>
<div class="example">
<style>
.slow .toggle-group { transition: left 0.7s; -webkit-transition: left 0.7s; }
.fast .toggle-group { transition: left 0.1s; -webkit-transition: left 0.1s; }
.quick .toggle-group { transition: none; -webkit-transition: none; }
</style>
<input type="checkbox" checked data-toggle="toggle" data-style="slow">
<input type="checkbox" checked data-toggle="toggle" data-class="fast">
<input type="checkbox" checked data-toggle="toggle" data-style="quick">
</div>
<div>
</main>
<footer>
<div class="container">
<p>
<img class="nyt-logo" src="doc/nyt.png">
<img class="nyt-logo" src="doc/nytdev.svg">
</p>
<p>Designed and built by <a href="https://github.com/minhur" target="_blank">Min Hur</a> for <a href="http://developers.nytimes.com" target="_blank">The New York Times Company</a></p>
<p>Latest Version: 2.2.0 | Code licensed under MIT</p>
<p>
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=watch&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="110" height="20"></iframe>
<iframe src="https://mdo.github.io/github-buttons/github-btn.html?user=minhur&repo=bootstrap-toggle&type=fork&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="95" height="20"></iframe>
</p>
</div>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
<script src="doc/script.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="js/bootstrap-toggle.js"></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-55669452-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>

View File

@ -0,0 +1,180 @@
/*! ========================================================================
* Bootstrap Toggle: bootstrap-toggle.js v2.2.0
* http://www.bootstraptoggle.com
* ========================================================================
* Copyright 2014 Min Hur, The New York Times Company
* Licensed under MIT
* ======================================================================== */
+function ($) {
'use strict';
// TOGGLE PUBLIC CLASS DEFINITION
// ==============================
var Toggle = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, this.defaults(), options)
this.render()
}
Toggle.VERSION = '2.2.0'
Toggle.DEFAULTS = {
on: 'On',
off: 'Off',
onstyle: 'primary',
offstyle: 'default',
size: 'normal',
style: '',
width: null,
height: null
}
Toggle.prototype.defaults = function() {
return {
on: this.$element.attr('data-on') || Toggle.DEFAULTS.on,
off: this.$element.attr('data-off') || Toggle.DEFAULTS.off,
onstyle: this.$element.attr('data-onstyle') || Toggle.DEFAULTS.onstyle,
offstyle: this.$element.attr('data-offstyle') || Toggle.DEFAULTS.offstyle,
size: this.$element.attr('data-size') || Toggle.DEFAULTS.size,
style: this.$element.attr('data-style') || Toggle.DEFAULTS.style,
width: this.$element.attr('data-width') || Toggle.DEFAULTS.width,
height: this.$element.attr('data-height') || Toggle.DEFAULTS.height
}
}
Toggle.prototype.render = function () {
this._onstyle = 'btn-' + this.options.onstyle
this._offstyle = 'btn-' + this.options.offstyle
var size = this.options.size === 'large' ? 'btn-lg'
: this.options.size === 'small' ? 'btn-sm'
: this.options.size === 'mini' ? 'btn-xs'
: ''
var $toggleOn = $('<label class="btn">').html(this.options.on)
.addClass(this._onstyle + ' ' + size)
var $toggleOff = $('<label class="btn">').html(this.options.off)
.addClass(this._offstyle + ' ' + size + ' active')
var $toggleHandle = $('<span class="toggle-handle btn btn-default">')
.addClass(size)
var $toggleGroup = $('<div class="toggle-group">')
.append($toggleOn, $toggleOff, $toggleHandle)
var $toggle = $('<div class="toggle btn" data-toggle="toggle">')
.addClass( this.$element.prop('checked') ? this._onstyle : this._offstyle+' off' )
.addClass(size).addClass(this.options.style)
this.$element.wrap($toggle)
$.extend(this, {
$toggle: this.$element.parent(),
$toggleOn: $toggleOn,
$toggleOff: $toggleOff,
$toggleGroup: $toggleGroup
})
this.$toggle.append($toggleGroup)
var width = this.options.width || Math.max($toggleOn.outerWidth(), $toggleOff.outerWidth())+($toggleHandle.outerWidth()/2)
var height = this.options.height || Math.max($toggleOn.outerHeight(), $toggleOff.outerHeight())
$toggleOn.addClass('toggle-on')
$toggleOff.addClass('toggle-off')
this.$toggle.css({ width: width, height: height })
if (this.options.height) {
$toggleOn.css('line-height', $toggleOn.height() + 'px')
$toggleOff.css('line-height', $toggleOff.height() + 'px')
}
this.update(true)
this.trigger(true)
}
Toggle.prototype.toggle = function () {
if (this.$element.prop('checked')) this.off()
else this.on()
}
Toggle.prototype.on = function (silent) {
if (this.$element.prop('disabled')) return false
this.$toggle.removeClass(this._offstyle + ' off').addClass(this._onstyle)
this.$element.prop('checked', true)
if (!silent) this.trigger()
}
Toggle.prototype.off = function (silent) {
if (this.$element.prop('disabled')) return false
this.$toggle.removeClass(this._onstyle).addClass(this._offstyle + ' off')
this.$element.prop('checked', false)
if (!silent) this.trigger()
}
Toggle.prototype.enable = function () {
this.$toggle.removeAttr('disabled')
this.$element.prop('disabled', false)
}
Toggle.prototype.disable = function () {
this.$toggle.attr('disabled', 'disabled')
this.$element.prop('disabled', true)
}
Toggle.prototype.update = function (silent) {
if (this.$element.prop('disabled')) this.disable()
else this.enable()
if (this.$element.prop('checked')) this.on(silent)
else this.off(silent)
}
Toggle.prototype.trigger = function (silent) {
this.$element.off('change.bs.toggle')
if (!silent) this.$element.change()
this.$element.on('change.bs.toggle', $.proxy(function() {
this.update()
}, this))
}
Toggle.prototype.destroy = function() {
this.$element.off('change.bs.toggle')
this.$toggleGroup.remove()
this.$element.removeData('bs.toggle')
this.$element.unwrap()
}
// TOGGLE PLUGIN DEFINITION
// ========================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.toggle')
var options = typeof option == 'object' && option
if (!data) $this.data('bs.toggle', (data = new Toggle(this, options)))
if (typeof option == 'string' && data[option]) data[option]()
})
}
var old = $.fn.bootstrapToggle
$.fn.bootstrapToggle = Plugin
$.fn.bootstrapToggle.Constructor = Toggle
// TOGGLE NO CONFLICT
// ==================
$.fn.toggle.noConflict = function () {
$.fn.bootstrapToggle = old
return this
}
// TOGGLE DATA-API
// ===============
$(function() {
$('input[type=checkbox][data-toggle^=toggle]').bootstrapToggle()
})
$(document).on('click.bs.toggle', 'div[data-toggle^=toggle]', function(e) {
var $checkbox = $(this).find('input[type=checkbox]')
$checkbox.bootstrapToggle('toggle')
e.preventDefault()
})
}(jQuery);

View File

@ -0,0 +1,9 @@
/*! ========================================================================
* Bootstrap Toggle: bootstrap-toggle.js v2.2.0
* http://www.bootstraptoggle.com
* ========================================================================
* Copyright 2014 Min Hur, The New York Times Company
* Licensed under MIT
* ======================================================================== */
+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="2.2.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",c=a('<label class="btn">').html(this.options.on).addClass(this._onstyle+" "+b),d=a('<label class="btn">').html(this.options.off).addClass(this._offstyle+" "+b+" active"),e=a('<span class="toggle-handle btn btn-default">').addClass(b),f=a('<div class="toggle-group">').append(c,d,e),g=a('<div class="toggle btn" data-toggle="toggle">').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(b).addClass(this.options.style);this.$element.wrap(g),a.extend(this,{$toggle:this.$element.parent(),$toggleOn:c,$toggleOff:d,$toggleGroup:f}),this.$toggle.append(f);var h=this.options.width||Math.max(c.outerWidth(),d.outerWidth())+e.outerWidth()/2,i=this.options.height||Math.max(c.outerHeight(),d.outerHeight());c.addClass("toggle-on"),d.addClass("toggle-off"),this.$toggle.css({width:h,height:i}),this.options.height&&(c.css("line-height",c.height()+"px"),d.css("line-height",d.height()+"px")),this.update(!0),this.trigger(!0)},c.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},c.prototype.on=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),void(a||this.trigger()))},c.prototype.off=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),void(a||this.trigger()))},c.prototype.enable=function(){this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},c.prototype.disable=function(){this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},c.prototype.update=function(a){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(a):this.off(a)},c.prototype.trigger=function(b){this.$element.off("change.bs.toggle"),b||this.$element.change(),this.$element.on("change.bs.toggle",a.proxy(function(){this.update()},this))},c.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var d=a.fn.bootstrapToggle;a.fn.bootstrapToggle=b,a.fn.bootstrapToggle.Constructor=c,a.fn.toggle.noConflict=function(){return a.fn.bootstrapToggle=d,this},a(function(){a("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()}),a(document).on("click.bs.toggle","div[data-toggle^=toggle]",function(b){var c=a(this).find("input[type=checkbox]");c.bootstrapToggle("toggle"),b.preventDefault()})}(jQuery);
//# sourceMappingURL=bootstrap-toggle.min.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"bootstrap-toggle.min.js","sources":["bootstrap-toggle.js"],"names":["$","Plugin","option","this","each","$this","data","options","Toggle","element","$element","extend","defaults","render","VERSION","DEFAULTS","on","off","onstyle","offstyle","size","style","width","height","prototype","attr","_onstyle","_offstyle","$toggleOn","html","addClass","$toggleOff","$toggleHandle","$toggleGroup","append","$toggle","prop","wrap","parent","Math","max","outerWidth","outerHeight","css","update","trigger","toggle","silent","removeClass","enable","removeAttr","disable","change","proxy","destroy","remove","removeData","unwrap","old","fn","bootstrapToggle","Constructor","noConflict","document","e","$checkbox","find","preventDefault","jQuery"],"mappings":"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"}

View File

@ -0,0 +1,180 @@
/*! ========================================================================
* Bootstrap Toggle: bootstrap2-toggle.js v2.2.0
* http://www.bootstraptoggle.com
* ========================================================================
* Copyright 2014 Min Hur, The New York Times Company
* Licensed under MIT
* ======================================================================== */
+function ($) {
'use strict';
// TOGGLE PUBLIC CLASS DEFINITION
// ==============================
var Toggle = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, this.defaults(), options)
this.render()
}
Toggle.VERSION = '2.2.0'
Toggle.DEFAULTS = {
on: 'On',
off: 'Off',
onstyle: 'primary',
offstyle: 'default',
size: 'normal',
style: '',
width: null,
height: null
}
Toggle.prototype.defaults = function() {
return {
on: this.$element.attr('data-on') || Toggle.DEFAULTS.on,
off: this.$element.attr('data-off') || Toggle.DEFAULTS.off,
onstyle: this.$element.attr('data-onstyle') || Toggle.DEFAULTS.onstyle,
offstyle: this.$element.attr('data-offstyle') || Toggle.DEFAULTS.offstyle,
size: this.$element.attr('data-size') || Toggle.DEFAULTS.size,
style: this.$element.attr('data-style') || Toggle.DEFAULTS.style,
width: this.$element.attr('data-width') || Toggle.DEFAULTS.width,
height: this.$element.attr('data-height') || Toggle.DEFAULTS.height
}
}
Toggle.prototype.render = function () {
this._onstyle = 'btn-' + this.options.onstyle
this._offstyle = 'btn-' + this.options.offstyle
var size = this.options.size === 'large' ? 'btn-large'
: this.options.size === 'small' ? 'btn-small'
: this.options.size === 'mini' ? 'btn-mini'
: ''
var $toggleOn = $('<label class="btn">').html(this.options.on)
.addClass(this._onstyle + ' ' + size)
var $toggleOff = $('<label class="btn">').html(this.options.off)
.addClass(this._offstyle + ' ' + size + ' active')
var $toggleHandle = $('<span class="toggle-handle btn btn-default">')
.addClass(size)
var $toggleGroup = $('<div class="toggle-group">')
.append($toggleOn, $toggleOff, $toggleHandle)
var $toggle = $('<div class="toggle btn" data-toggle="toggle">')
.addClass( this.$element.prop('checked') ? this._onstyle : this._offstyle+' off' )
.addClass(size).addClass(this.options.style)
this.$element.wrap($toggle)
$.extend(this, {
$toggle: this.$element.parent(),
$toggleOn: $toggleOn,
$toggleOff: $toggleOff,
$toggleGroup: $toggleGroup
})
this.$toggle.append($toggleGroup)
var width = this.options.width || Math.max($toggleOn.width(), $toggleOff.width())+($toggleHandle.outerWidth()/2)
var height = this.options.height || Math.max($toggleOn.height(), $toggleOff.height())
$toggleOn.addClass('toggle-on')
$toggleOff.addClass('toggle-off')
this.$toggle.css({ width: width, height: height })
if (this.options.height) {
$toggleOn.css('line-height', $toggleOn.height() + 'px')
$toggleOff.css('line-height', $toggleOff.height() + 'px')
}
this.update(true)
this.trigger(true)
}
Toggle.prototype.toggle = function () {
if (this.$element.prop('checked')) this.off()
else this.on()
}
Toggle.prototype.on = function (silent) {
if (this.$element.prop('disabled')) return false
this.$toggle.removeClass(this._offstyle + ' off').addClass(this._onstyle)
this.$element.prop('checked', true)
if (!silent) this.trigger()
}
Toggle.prototype.off = function (silent) {
if (this.$element.prop('disabled')) return false
this.$toggle.removeClass(this._onstyle).addClass(this._offstyle + ' off')
this.$element.prop('checked', false)
if (!silent) this.trigger()
}
Toggle.prototype.enable = function () {
this.$toggle.removeAttr('disabled')
this.$element.prop('disabled', false)
}
Toggle.prototype.disable = function () {
this.$toggle.attr('disabled', 'disabled')
this.$element.prop('disabled', true)
}
Toggle.prototype.update = function (silent) {
if (this.$element.prop('disabled')) this.disable()
else this.enable()
if (this.$element.prop('checked')) this.on(silent)
else this.off(silent)
}
Toggle.prototype.trigger = function (silent) {
this.$element.off('change.bs.toggle')
if (!silent) this.$element.change()
this.$element.on('change.bs.toggle', $.proxy(function() {
this.update()
}, this))
}
Toggle.prototype.destroy = function() {
this.$element.off('change.bs.toggle')
this.$toggleGroup.remove()
this.$element.removeData('bs.toggle')
this.$element.unwrap()
}
// TOGGLE PLUGIN DEFINITION
// ========================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.toggle')
var options = typeof option == 'object' && option
if (!data) $this.data('bs.toggle', (data = new Toggle(this, options)))
if (typeof option == 'string' && data[option]) data[option]()
})
}
var old = $.fn.bootstrapToggle
$.fn.bootstrapToggle = Plugin
$.fn.bootstrapToggle.Constructor = Toggle
// TOGGLE NO CONFLICT
// ==================
$.fn.toggle.noConflict = function () {
$.fn.bootstrapToggle = old
return this
}
// TOGGLE DATA-API
// ===============
$(function() {
$('input[type=checkbox][data-toggle^=toggle]').bootstrapToggle()
})
$(document).on('click.bs.toggle', 'div[data-toggle^=toggle]', function(e) {
var $checkbox = $(this).find('input[type=checkbox]')
$checkbox.bootstrapToggle('toggle')
e.preventDefault()
})
}(jQuery);

View File

@ -0,0 +1,9 @@
/*! ========================================================================
* Bootstrap Toggle: bootstrap2-toggle.js v2.2.0
* http://www.bootstraptoggle.com
* ========================================================================
* Copyright 2014 Min Hur, The New York Times Company
* Licensed under MIT
* ======================================================================== */
+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="2.2.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size?"btn-large":"small"===this.options.size?"btn-small":"mini"===this.options.size?"btn-mini":"",c=a('<label class="btn">').html(this.options.on).addClass(this._onstyle+" "+b),d=a('<label class="btn">').html(this.options.off).addClass(this._offstyle+" "+b+" active"),e=a('<span class="toggle-handle btn btn-default">').addClass(b),f=a('<div class="toggle-group">').append(c,d,e),g=a('<div class="toggle btn" data-toggle="toggle">').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(b).addClass(this.options.style);this.$element.wrap(g),a.extend(this,{$toggle:this.$element.parent(),$toggleOn:c,$toggleOff:d,$toggleGroup:f}),this.$toggle.append(f);var h=this.options.width||Math.max(c.width(),d.width())+e.outerWidth()/2,i=this.options.height||Math.max(c.height(),d.height());c.addClass("toggle-on"),d.addClass("toggle-off"),this.$toggle.css({width:h,height:i}),this.options.height&&(c.css("line-height",c.height()+"px"),d.css("line-height",d.height()+"px")),this.update(!0),this.trigger(!0)},c.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},c.prototype.on=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),void(a||this.trigger()))},c.prototype.off=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),void(a||this.trigger()))},c.prototype.enable=function(){this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},c.prototype.disable=function(){this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},c.prototype.update=function(a){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(a):this.off(a)},c.prototype.trigger=function(b){this.$element.off("change.bs.toggle"),b||this.$element.change(),this.$element.on("change.bs.toggle",a.proxy(function(){this.update()},this))},c.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var d=a.fn.bootstrapToggle;a.fn.bootstrapToggle=b,a.fn.bootstrapToggle.Constructor=c,a.fn.toggle.noConflict=function(){return a.fn.bootstrapToggle=d,this},a(function(){a("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()}),a(document).on("click.bs.toggle","div[data-toggle^=toggle]",function(b){var c=a(this).find("input[type=checkbox]");c.bootstrapToggle("toggle"),b.preventDefault()})}(jQuery);
//# sourceMappingURL=bootstrap2-toggle.min.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"bootstrap2-toggle.min.js","sources":["bootstrap2-toggle.js"],"names":["$","Plugin","option","this","each","$this","data","options","Toggle","element","$element","extend","defaults","render","VERSION","DEFAULTS","on","off","onstyle","offstyle","size","style","width","height","prototype","attr","_onstyle","_offstyle","$toggleOn","html","addClass","$toggleOff","$toggleHandle","$toggleGroup","append","$toggle","prop","wrap","parent","Math","max","outerWidth","css","update","trigger","toggle","silent","removeClass","enable","removeAttr","disable","change","proxy","destroy","remove","removeData","unwrap","old","fn","bootstrapToggle","Constructor","noConflict","document","e","$checkbox","find","preventDefault","jQuery"],"mappings":"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"}

28
vendor/bootstrap-toggle/package.json vendored Normal file
View File

@ -0,0 +1,28 @@
{
"name": "bootstrap-toggle",
"description": "Bootstrap Toggle is a highly flexible Bootstrap plugin that converts checkboxes into toggles",
"version": "2.2.2",
"main": "js/bootstrap-toggle.js",
"keywords": [
"bootstrap",
"toggle",
"bootstrap-toggle",
"switch",
"bootstrap-switch"
],
"homepage": "http://www.bootstraptoggle.com",
"repository": {
"type": "git",
"url": "https://github.com/minhur/bootstrap-toggle.git"
},
"license": "MIT",
"author": "Min Hur <min.hur@gmail.com>",
"bugs": {
"url": "https://github.com/minhur/bootstrap-toggle/issues"
},
"devDependencies": {
"grunt-contrib-clean": "^0.6.0",
"grunt-contrib-cssmin": "^0.10.0",
"grunt-contrib-uglify": "^0.6.0"
}
}