diff --git a/api_db.php b/api_db.php index 79812981..7687fb6e 100644 --- a/api_db.php +++ b/api_db.php @@ -94,6 +94,17 @@ if(!$db) die("Error connecting to database"); } +if(isset($_GET["network"]) && $auth) +{ + $network = array(); + $results = $db->query('SELECT * FROM network'); + + while($results !== false && $res = $results->fetchArray(SQLITE3_ASSOC)) + array_push($network, $res); + + $data = array_merge($data, array('network' => $network)); +} + if (isset($_GET['getAllQueries']) && $auth) { $allQueries = array(); diff --git a/db_graph.php b/db_graph.php index 6bc207eb..79bb51e1 100644 --- a/db_graph.php +++ b/db_graph.php @@ -32,7 +32,7 @@ $token = $_SESSION['token'];
- + diff --git a/db_lists.php b/db_lists.php index 64517548..0010edb5 100644 --- a/db_lists.php +++ b/db_lists.php @@ -33,7 +33,7 @@ $token = $_SESSION['token'];
- + diff --git a/db_queries.php b/db_queries.php index 635d87ae..7d2c0d37 100644 --- a/db_queries.php +++ b/db_queries.php @@ -33,7 +33,7 @@ $token = $_SESSION['token'];
- + diff --git a/network.php b/network.php new file mode 100644 index 00000000..cc783f3a --- /dev/null +++ b/network.php @@ -0,0 +1,76 @@ + + + + +
+
+
+
+

Network overview

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
IP addressHardware addressInterfaceHostnameFirst seenLast QueryNumber of queriesUses Pi-hole
IP addressHardware addressInterfaceHostnameFirst seenLast QueryNumber of queriesUses Pi-hole
+ + + + + + + + + +
just now
... to ...
24 hours ago> 24 hours agoDevice does not use Pi-hole
+
+ +
+ +
+
+ + + + + + diff --git a/scripts/pi-hole/js/db_graph.js b/scripts/pi-hole/js/db_graph.js index 99436b7f..9699d325 100644 --- a/scripts/pi-hole/js/db_graph.js +++ b/scripts/pi-hole/js/db_graph.js @@ -16,11 +16,13 @@ var until = moment(end__).utc().valueOf()/1000; var timeoutWarning = $("#timeoutWarning"); +var dateformat = "MMMM Do YYYY, HH:mm"; + $(function () { $("#querytime").daterangepicker( { timePicker: true, timePickerIncrement: 15, - locale: { format: "MMMM Do YYYY, HH:mm" }, + locale: { format: dateformat }, startDate: start__, endDate: end__, ranges: { "Today": [moment().startOf("day"), moment()], @@ -32,7 +34,8 @@ $(function () { "This Year": [moment().startOf("year"), moment()], "All Time": [moment(0), moment()] }, - "opens": "center", "showDropdowns": true + "opens": "center", "showDropdowns": true, + "autoUpdateInput": false }, function (startt, endt) { from = moment(startt).utc().valueOf()/1000; @@ -244,6 +247,7 @@ $(document).ready(function() { }); $("#querytime").on("apply.daterangepicker", function(ev, picker) { + $(this).val(picker.startDate.format(dateformat) + " to " + picker.endDate.format(dateformat)); $("#queries-over-time").show(); updateQueriesOverTime(); }); diff --git a/scripts/pi-hole/js/db_lists.js b/scripts/pi-hole/js/db_lists.js index 735d4384..36228b42 100644 --- a/scripts/pi-hole/js/db_lists.js +++ b/scripts/pi-hole/js/db_lists.js @@ -17,6 +17,8 @@ var until = moment(end__).utc().valueOf()/1000; var timeoutWarning = $("#timeoutWarning"); var listsStillLoading = 0; +var dateformat = "MMMM Do YYYY, HH:mm"; + $(function () { $("#querytime").daterangepicker( { @@ -33,7 +35,8 @@ $(function () { "This Year": [moment().startOf("year"), moment()], "All Time": [moment(0), moment()] }, - "opens": "center", "showDropdowns": true + "opens": "center", "showDropdowns": true, + "autoUpdateInput": false }, function (startt, endt) { from = moment(startt).utc().valueOf()/1000; @@ -191,6 +194,7 @@ function updateTopAdsChart() { } $("#querytime").on("apply.daterangepicker", function(ev, picker) { + $(this).val(picker.startDate.format(dateformat) + " to " + picker.endDate.format(dateformat)); timeoutWarning.show(); listsStillLoading = 3; updateTopClientsChart(); diff --git a/scripts/pi-hole/js/db_queries.js b/scripts/pi-hole/js/db_queries.js index b38356ae..2482f0ff 100644 --- a/scripts/pi-hole/js/db_queries.js +++ b/scripts/pi-hole/js/db_queries.js @@ -18,6 +18,8 @@ var daterange; var timeoutWarning = $("#timeoutWarning"); +var dateformat = "MMMM Do YYYY, HH:mm"; + // Do we want to filter queries? var GETDict = {}; location.search.substr(1).split("&").forEach(function(item) {GETDict[item.split("=")[0]] = item.split("=")[1];}); @@ -47,7 +49,8 @@ $(function () { "This Year": [moment().startOf("year"), moment()], "All Time": [moment(0), moment()] }, - "opens": "center", "showDropdowns": true + "opens": "center", "showDropdowns": true, + "autoUpdateInput": false }, function (startt, endt) { from = moment(startt).utc().valueOf()/1000; @@ -167,7 +170,9 @@ function getQueryTypes() } if($("#type_external").prop("checked")) { - queryType.push(6); + // Multiple IDs correspond to this status + // We request queries with all of them + queryType.push([6,7,8]); } return queryType.join(","); } @@ -275,7 +280,19 @@ $(document).ready(function() { case 6: blocked = true; color = "red"; - fieldtext = "Blocked (external)"; + fieldtext = "Blocked (external, IP)"; + buttontext = "" ; + break; + case 7: + blocked = true; + color = "red"; + fieldtext = "Blocked (external, NULL)"; + buttontext = "" ; + break; + case 8: + blocked = true; + color = "red"; + fieldtext = "Blocked (external, NXRA)"; buttontext = "" ; break; default: @@ -333,6 +350,7 @@ $(document).ready(function() { } ); $("#querytime").on("apply.daterangepicker", function(ev, picker) { + $(this).val(picker.startDate.format(dateformat) + " to " + picker.endDate.format(dateformat)); refreshTableData(); }); diff --git a/scripts/pi-hole/js/index.js b/scripts/pi-hole/js/index.js index 9495289f..17f1e092 100644 --- a/scripts/pi-hole/js/index.js +++ b/scripts/pi-hole/js/index.js @@ -146,7 +146,7 @@ function updateQueriesOverTime() { timeLineChart.data.datasets[0].data = []; timeLineChart.data.datasets[1].data = []; - // Add data for each hour that is available + // Add data for each hour that is available for (var hour in data.ads_over_time[0]) { if ({}.hasOwnProperty.call(data.ads_over_time[0], hour)) @@ -186,61 +186,6 @@ function updateQueriesOverTime() { }); } -function updateQueryTypesOverTime() { - $.getJSON("api.php?overTimeDataQueryTypes", function(data) { - - if("FTLnotrunning" in data) - { - return; - } - - // convert received objects to arrays - data.over_time = objectToArray(data.over_time); - // remove last data point since it not representative - data.over_time[0].splice(-1,1); - var timestamps = data.over_time[0]; - var plotdata = data.over_time[1]; - // Remove possibly already existing data - queryTypeChart.data.labels = []; - queryTypeChart.data.datasets[0].data = []; - queryTypeChart.data.datasets[1].data = []; - - var colors = []; - $.each($.AdminLTE.options.colors, function(key, value) { colors.push(value); }); - queryTypeChart.data.datasets[0].backgroundColor = colors[0]; - queryTypeChart.data.datasets[1].backgroundColor = colors[1]; - - // Add data for each hour that is available - for (var j in timestamps) - { - if ({}.hasOwnProperty.call(timestamps, j)) - { - var d,h; - h = parseInt(timestamps[j]); - // New style: Get Unix timestamps - d = new Date(1000*h); - - queryTypeChart.data.labels.push(d); - queryTypeChart.data.datasets[0].data.push(1e-2*plotdata[j][0]); - queryTypeChart.data.datasets[1].data.push(1e-2*plotdata[j][1]); - } - } - $("#query-types .overlay").hide(); - queryTypeChart.update(); - }).done(function() { - // Reload graph after 10 minutes - failures = 0; - setTimeout(updateQueryTypesOverTime, 600000); - }).fail(function() { - failures++; - if(failures < 5) - { - // Try again after 1 minute only if this has not failed more - // than five times in a row - setTimeout(updateQueryTypesOverTime, 60000); - } - }); -} function updateQueryTypesPie() { $.getJSON("api.php?getQueryTypes", function(data) { @@ -308,97 +253,6 @@ function updateQueryTypesPie() { }); } -function updateForwardedOverTime() { - $.getJSON("api.php?overTimeDataForwards&getForwardDestinationNames", function(data) { - - if("FTLnotrunning" in data) - { - return; - } - - // convert received objects to arrays - data.over_time = objectToArray(data.over_time); - // remove last data point since it not representative - data.over_time[0].splice(-1,1); - var timestamps = data.over_time[0]; - var plotdata = data.over_time[1]; - var labels = []; - var key, i, j; - for (key in data.forward_destinations) - { - if (!{}.hasOwnProperty.call(data.forward_destinations, key)) - { - continue; - } - if(key.indexOf("|") > -1) - { - var idx = key.indexOf("|"); - key = key.substr(0, idx); - } - labels.push(key); - } - // Get colors from AdminLTE - var colors = []; - $.each($.AdminLTE.options.colors, function(key, value) { colors.push(value); }); - var v = [], c = [], k = []; - - // Remove possibly already existing data - forwardDestinationChart.data.labels = []; - forwardDestinationChart.data.datasets[0].data = []; - for (i = 1; i < forwardDestinationChart.data.datasets.length; i++) - { - forwardDestinationChart.data.datasets[i].data = []; - } - - // Collect values and colors, and labels - forwardDestinationChart.data.datasets[0].backgroundColor = colors[0]; - forwardDestinationChart.data.datasets[0].pointRadius = 0; - forwardDestinationChart.data.datasets[0].pointHitRadius = 5; - forwardDestinationChart.data.datasets[0].pointHoverRadius = 5; - forwardDestinationChart.data.datasets[0].label = labels[0]; - forwardDestinationChart.data.datasets[0].cubicInterpolationMode = "monotone"; - - for (i = forwardDestinationChart.data.datasets.length; i < plotdata[0].length; i++) - { - forwardDestinationChart.data.datasets.push({data: [], backgroundColor: colors[i], pointRadius: 0, pointHitRadius: 5, pointHoverRadius: 5, label: labels[i]}); - } - - // Add data for each dataset that is available - for (j in timestamps) - { - if (!{}.hasOwnProperty.call(timestamps, j)) - { - continue; - } - for (key in plotdata[j]) - { - if (!{}.hasOwnProperty.call(plotdata[j], key)) - { - continue; - } - forwardDestinationChart.data.datasets[key].data.push(1e-2*plotdata[j][key]); - } - - var d = new Date(1000*parseInt(timestamps[j])); - forwardDestinationChart.data.labels.push(d); - } - $("#forward-destinations .overlay").hide(); - forwardDestinationChart.update(); - }).done(function() { - // Reload graph after 10 minutes - failures = 0; - setTimeout(updateForwardedOverTime, 600000); - }).fail(function() { - failures++; - if(failures < 5) - { - // Try again after 1 minute only if this has not failed more - // than five times in a row - setTimeout(updateForwardedOverTime, 60000); - } - }); -} - function updateClientsOverTime() { $.getJSON("api.php?overTimeDataClients&getClientNames", function(data) { @@ -796,8 +650,6 @@ function updateSummaryData(runOnce) { FTLoffline = false; $("#temperature").text(" "); updateQueriesOverTime(); - updateForwardedOverTime(); - updateQueryTypesOverTime(); updateTopClientsChart(); updateTopLists(); } diff --git a/scripts/pi-hole/js/network.js b/scripts/pi-hole/js/network.js new file mode 100644 index 00000000..a851ea2e --- /dev/null +++ b/scripts/pi-hole/js/network.js @@ -0,0 +1,173 @@ +/* Pi-hole: A black hole for Internet advertisements +* (c) 2017 Pi-hole, LLC (https://pi-hole.net) +* Network-wide ad blocking via your own hardware. +* +* This file is copyright under the latest version of the EUPL. +* Please see LICENSE file for your rights under this license. */ +var tableApi; + +var APIstring = "api_db.php?network"; + +function refreshData() { + tableApi.ajax.url(APIstring).load(); +} + +function openInNewTab(url) { + var win = window.open(url, "_blank"); + win.focus(); +} + +function handleAjaxError( xhr, textStatus, error ) { + if ( textStatus === "timeout" ) + { + alert( "The server took too long to send the data." ); + } + else if(xhr.responseText.indexOf("Connection refused") >= 0) + { + alert( "An error occured while loading the data: Connection refused. Is FTL running?" ); + } + else + { + alert( "An unknown error occured while loading the data.\n"+xhr.responseText ); + } + $("#network-entries_processing").hide(); + tableApi.clear(); + tableApi.draw(); +} + +function getTimestamp(){ + if (!Date.now) + { + Date.now = function() { return new Date().getTime(); }; + } + return Math.floor(Date.now() / 1000); +} + +function valueToHex(c) { + var hex = Math.round(c).toString(16); + return hex.length === 1 ? "0" + hex : hex; +} + +function rgbToHex(values) { + return "#" + valueToHex(values[0]) + + valueToHex(values[1]) + + valueToHex(values[2]); +} + +function mixColors(ratio, rgb1, rgb2) +{ + return [(1.0-ratio)*rgb1[0]+ratio*rgb2[0], + (1.0-ratio)*rgb1[1]+ratio*rgb2[1], + (1.0-ratio)*rgb1[2]+ratio*rgb2[2]]; +} + +$(document).ready(function() { + tableApi = $("#network-entries").DataTable( { + "rowCallback": function( row, data, index ) + { + var color, mark, lastQuery = parseInt(data["lastQuery"]); + if(lastQuery > 0) + { + var diff = getTimestamp()-lastQuery; + if(diff <= 86400) + { + // Last query came in within the last 24 hours (24*60*60 = 86400) + // Color: light-green to light-yellow + var ratio = 1e0*diff/86400; + var lightgreen = [0xE7, 0xFF, 0xDE]; + var lightyellow = [0xFF, 0xFF, 0xDF]; + color = rgbToHex(mixColors(ratio, lightgreen, lightyellow)); + mark = "✔"; + } + else + { + // Last query was longer than 24 hours ago + // Color: light-orange + color = "#FFEDD9"; + mark = "?"; + } + } + else + { + // This client has never sent a query to Pi-hole, color light-red + color = "#FFBFAA"; + mark = "✘"; + } + // Set determined background color + $(row).css("background-color", color); + $("td:eq(7)", row).html(mark); + + // Insert "Never" into Last Query field when we have + // never seen a query from this device + if(data["lastQuery"] === 0) + { + $("td:eq(5)", row).html("Never"); + } + + // Set hostname to "N/A" if not available + if(data["name"].length < 1) + { + $("td:eq(3)", row).html("N/A"); + } + + // Set number of queries to localized string (add thousand separators) + $("td:eq(6)", row).html(data["numQueries"].toLocaleString()); + + // Client -> jump to Query Log on click + $("td:eq(0)", row).click( function () { openInNewTab("/admin/queries.php?client="+this.innerHTML); } ); + $("td:eq(0)", row).css("cursor","pointer"); + $("td:eq(0)", row).hover( + function () { this.title="Click to show recent queries made by "+this.innerHTML; this.style.color="#72afd2"; }, + function () { this.style.color=""; } ); + + // MAC + Vendor field if available + if(data["macVendor"].length > 0) + { + $("td:eq(1)", row).html(data["hwaddr"]+"
"+data["macVendor"]); + } + + }, + dom: "<'row'<'col-sm-12'f>>" + + "<'row'<'col-sm-4'l><'col-sm-8'p>>" + + "<'row'<'col-sm-12'<'table-responsive'tr>>>" + + "<'row'<'col-sm-5'i><'col-sm-7'p>>", + "ajax": {"url": APIstring, "error": handleAjaxError, "dataSrc": "network" }, + "autoWidth" : false, + "processing": true, + "order" : [[5, "desc"]], + "columns": [ + {data: "ip", "width" : "10%", "render": $.fn.dataTable.render.text() }, + {data: "hwaddr", "width" : "10%", "render": $.fn.dataTable.render.text() }, + {data: "interface", "width" : "4%", "render": $.fn.dataTable.render.text() }, + {data: "name", "width" : "15%", "render": $.fn.dataTable.render.text() }, + {data: "firstSeen", "width" : "8%", "render": function (data, type, full, meta) { if(type === "display"){return moment.unix(data).format("Y-MM-DD []HH:mm:ss z");}else{return data;} }}, + {data: "lastQuery", "width" : "8%", "render": function (data, type, full, meta) { if(type === "display"){return moment.unix(data).format("Y-MM-DD []HH:mm:ss z");}else{return data;} }}, + {data: "numQueries", "width" : "9%", "render": $.fn.dataTable.render.text() }, + {data: "", "width" : "6%", "orderable" : false } + ], + "lengthMenu": [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]], + "stateSave": true, + stateSaveCallback: function(settings, data) { + // Store current state in client's local storage area + localStorage.setItem("network_table", JSON.stringify(data)); + }, + stateLoadCallback: function(settings) { + // Receive previous state from client's local storage area + var data = localStorage.getItem("network_table"); + // Return if not available + if(data === null){ return null; } + data = JSON.parse(data); + // Always start on the first page + data["start"] = 0; + // Always start with empty search field + data["search"]["search"] = ""; + // Apply loaded state to table + return data; + }, + "columnDefs": [ { + "targets": -1, + "data": null, + "defaultContent": "" + } ] + }); +} ); diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index f36e76e1..12112717 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -170,7 +170,7 @@ $(document).ready(function() { dnssec_status = "
ABANDONED"; break; case "5": - dnssec_status = "
UNKNOWN"; + dnssec_status = "
UNKNOWN"; break; default: // No DNSSEC dnssec_status = ""; @@ -213,13 +213,25 @@ $(document).ready(function() { case "6": blocked = true; color = "red"; - fieldtext = "Blocked (external)"; + fieldtext = "Blocked (external, IP)"; + buttontext = "" ; + break; + case "7": + blocked = true; + color = "red"; + fieldtext = "Blocked (external, NULL)"; + buttontext = "" ; + break; + case "8": + blocked = true; + color = "red"; + fieldtext = "Blocked (external, NXRA)"; buttontext = "" ; break; default: blocked = false; color = "black"; - fieldtext = "Unknown"; + fieldtext = "Unknown ("+parseInt(data[4])+")"; buttontext = ""; } $(row).css("color", color); @@ -266,7 +278,7 @@ $(document).ready(function() { replytext = "upstream error"; break; default: - replytext = "? ("+data[6]+")"; + replytext = "? ("+parseInt(data[6])+")"; } } else diff --git a/scripts/pi-hole/js/settings.js b/scripts/pi-hole/js/settings.js index 7e85f310..a3b99195 100644 --- a/scripts/pi-hole/js/settings.js +++ b/scripts/pi-hole/js/settings.js @@ -5,8 +5,6 @@ * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ $(function () { - $("[data-mask]").inputmask(); - $("[data-static]").on("click", function(){ var row = $(this).closest("tr"); var mac = row.find("#MAC").text(); diff --git a/scripts/pi-hole/php/add.php b/scripts/pi-hole/php/add.php index d1d98ee7..762ea2cf 100644 --- a/scripts/pi-hole/php/add.php +++ b/scripts/pi-hole/php/add.php @@ -5,16 +5,23 @@ * * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ + require_once('auth.php'); $type = $_POST['list']; -// Perform all of the verification for list editing +// Perform all of the authentication for list editing // when NOT invoked and authenticated from API -if (!$api) { +if (empty($api)) { list_verify($type); } +// Don't check if the added item is a valid domain for regex expressions. Regex +// filters are validated by FTL on import and skipped if invalid +if($type !== "regex") { + check_domain(); +} + switch($type) { case "white": if(!isset($_POST["auditlog"])) diff --git a/scripts/pi-hole/php/auth.php b/scripts/pi-hole/php/auth.php index 5d832a86..69fe6b28 100644 --- a/scripts/pi-hole/php/auth.php +++ b/scripts/pi-hole/php/auth.php @@ -142,14 +142,5 @@ function list_verify($type) { { log_and_die("Not allowed!"); } - - // Don't check if the added item is a - // valid domain for regex expressions - // Regex filters are validated by FTL - // on import and skipped if invalid - if($_POST['list'] !== "regex") - { - check_domain(); - } } ?> diff --git a/scripts/pi-hole/php/get.php b/scripts/pi-hole/php/get.php index a14a3bb2..156622c7 100644 --- a/scripts/pi-hole/php/get.php +++ b/scripts/pi-hole/php/get.php @@ -4,9 +4,8 @@ * Network-wide ad blocking via your own hardware. * * This file is copyright under the latest version of the EUPL. -* Please see LICENSE file for your rights under this license. */ ?> +* Please see LICENSE file for your rights under this license. */ - - + @@ -431,7 +431,7 @@ if($auth) { class="active"> - Query Log + Query Log
  • active"> @@ -439,22 +439,22 @@ if($auth) { - Long term data + Long term data @@ -462,7 +462,7 @@ if($auth) { class="active"> - Whitelist + Whitelist
  • @@ -488,22 +488,22 @@ if($auth) {
  • - For 10 seconds + For 10 seconds
  • - For 30 seconds + For 30 seconds
  • - For 5 minutes + For 5 minutes
  • - Custom time + Custom time
  • @@ -559,10 +559,16 @@ if($auth) { + + class="active"> + + Network + + class="active"> - Settings + Settings @@ -582,14 +588,14 @@ if($auth) { if(strlen($pwhash) > 0 && !$auth) { ?> class="active"> - Login + Login
  • - Donate + Donate
  • diff --git a/scripts/pi-hole/php/queryads.php b/scripts/pi-hole/php/queryads.php index 65eabcec..f247c87a 100644 --- a/scripts/pi-hole/php/queryads.php +++ b/scripts/pi-hole/php/queryads.php @@ -6,7 +6,9 @@ * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ -ob_end_flush(); +while (ob_get_level() > 0) { + ob_end_flush(); +} ini_set("output_buffering", "0"); ob_implicit_flush(true); header('Content-Type: text/event-stream'); diff --git a/scripts/pi-hole/php/savesettings.php b/scripts/pi-hole/php/savesettings.php index 9a0f5d11..fc358d66 100644 --- a/scripts/pi-hole/php/savesettings.php +++ b/scripts/pi-hole/php/savesettings.php @@ -4,9 +4,7 @@ * Network-wide ad blocking via your own hardware. * * This file is copyright under the latest version of the EUPL. -* Please see LICENSE file for your rights under this license. */ ?> - - ["v4_1" => "8.8.8.8","v4_2" => "8.8.4.4", "v6_1" => "2001:4860:4860:0:0:0:0:8888", "v6_2" => "2001:4860:4860:0:0:0:0:8844"], - "OpenDNS (ECS)" => ["v4_1" => "208.67.222.222", "v4_2" => "208.67.220.220", "v6_1" => "2620:0:ccc::2", "v6_2" => "2620:0:ccd::2"], - "Level3" => ["v4_1" => "4.2.2.1", "v4_2" => "4.2.2.2"], - "Norton" => ["v4_1" => "199.85.126.10", "v4_2" => "199.85.127.10"], - "Comodo" => ["v4_1" => "8.26.56.26", "v4_2" => "8.20.247.20"], - "DNS.WATCH" => ["v4_1" => "84.200.69.80", "v4_2" => "84.200.70.40", "v6_1" => "2001:1608:10:25:0:0:1c04:b12f", "v6_2" => "2001:1608:10:25:0:0:9249:d69b"], - "Quad9 (filtered, DNSSEC)" => ["v4_1" => "9.9.9.9", "v4_2" => "149.112.112.112", "v6_1" => "2620:fe::fe", "v6_2" => "2620:fe::9"], - "Quad9 (unfiltered, no DNSSEC)" => ["v4_1" => "9.9.9.10", "v4_2" => "149.112.112.10", "v6_1" => "2620:fe::10", "v6_2" => "2620:fe::fe:10"], - "Quad9 (filtered + ECS)" => ["v4_1" => "9.9.9.11", "v4_2" => "149.112.112.11", "v6_1" => "2620:fe::11"], - "Cloudflare" => ["v4_1" => "1.1.1.1", "v4_2" => "1.0.0.1", "v6_1" => "2606:4700:4700::1111", "v6_2" => "2606:4700:4700::1001"] - ]; +$DNSserverslist = []; +function readDNSserversList() +{ + // Reset list + $list = []; + $handle = @fopen("/etc/pihole/dns-servers.conf", "r"); + if ($handle) + { + while (($line = fgets($handle)) !== false) + { + $line = rtrim($line); + $line = explode(';', $line); + $name = $line[0]; + $values = []; + if (!empty($line[1])) { + $values["v4_1"] = $line[1]; + } + if (!empty($line[2])) { + $values["v4_2"] = $line[2]; + } + if (!empty($line[3])) { + $values["v6_1"] = $line[3]; + } + if (!empty($line[4])) { + $values["v6_2"] = $line[4]; + } + $list[$name] = $values; + } + fclose($handle); + } + return $list; +} $adlist = []; function readAdlists() @@ -155,7 +173,7 @@ function readAdlists() { // Comments start either with "##" or "# " if($line[1] !== "#" && - $line[1] !== " ") + $line[1] !== " ") { // Commented list array_push($list, [false,rtrim(substr($line, 1))]); @@ -174,6 +192,8 @@ function readAdlists() // Read available adlists $adlist = readAdlists(); + // Read available DNS server list + $DNSserverslist = readDNSserversList(); $error = ""; $success = ""; diff --git a/scripts/pi-hole/php/sub.php b/scripts/pi-hole/php/sub.php index b2dc0c51..1c9bc8fe 100644 --- a/scripts/pi-hole/php/sub.php +++ b/scripts/pi-hole/php/sub.php @@ -4,19 +4,24 @@ * Network-wide ad blocking via your own hardware. * * This file is copyright under the latest version of the EUPL. -* Please see LICENSE file for your rights under this license. */ ?> +* Please see LICENSE file for your rights under this license. */ - -1 && buffer[pos - 1] != ".") - chrs = buffer[pos - 1] + chrs; - else chrs = "0" + chrs; - return new RegExp("2[0-5]|[01][0-9]").test(chrs); - }, - cardinality: 1, - definitionSymbol: "i" - }, - 'z': { - validator: function (chrs, buffer, pos, strict, opts) { - if (pos - 1 > -1 && buffer[pos - 1] != ".") { - chrs = buffer[pos - 1] + chrs; - if (pos - 2 > -1 && buffer[pos - 2] != ".") { - chrs = buffer[pos - 2] + chrs; - } else chrs = "0" + chrs; - } else chrs = "00" + chrs; - return new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs); - }, - cardinality: 1, - definitionSymbol: "i" - } - } - }//, - // "ipv6": { //ip-address mask - // mask: ["[xxxx][:xxxx][:xxxx][:xxxx][:xxxx][:xxxx][:xxxx][:xxxx]"], - // //placeholder: '____:____:____:____:____:____:____:____:____', - // definitions: { - // 'x': { - // validator: "[0-9a-f]", - // cardinality: 1, - // casing: "upper" //auto uppercasing - // } - // } - // } - }); -})(jQuery); diff --git a/scripts/vendor/jquery.inputmask.js b/scripts/vendor/jquery.inputmask.js deleted file mode 100644 index 86cb3205..00000000 --- a/scripts/vendor/jquery.inputmask.js +++ /dev/null @@ -1,1627 +0,0 @@ -/** -* @license Input Mask plugin for jquery -* http://github.com/RobinHerbots/jquery.inputmask -* Copyright (c) 2010 - 2014 Robin Herbots -* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) -* Version: 0.0.0 -*/ - -(function ($) { - if ($.fn.inputmask === undefined) { - //helper functions - function isInputEventSupported(eventName) { - var el = document.createElement('input'), - eventName = 'on' + eventName, - isSupported = (eventName in el); - if (!isSupported) { - el.setAttribute(eventName, 'return;'); - isSupported = typeof el[eventName] == 'function'; - } - el = null; - return isSupported; - } - function resolveAlias(aliasStr, options, opts) { - var aliasDefinition = opts.aliases[aliasStr]; - if (aliasDefinition) { - if (aliasDefinition.alias) resolveAlias(aliasDefinition.alias, undefined, opts); //alias is another alias - $.extend(true, opts, aliasDefinition); //merge alias definition in the options - $.extend(true, opts, options); //reapply extra given options - return true; - } - return false; - } - function generateMaskSets(opts) { - var ms = []; - var genmasks = []; //used to keep track of the masks that where processed, to avoid duplicates - function getMaskTemplate(mask) { - if (opts.numericInput) { - mask = mask.split('').reverse().join(''); - } - var escaped = false, outCount = 0, greedy = opts.greedy, repeat = opts.repeat; - if (repeat == "*") greedy = false; - //if (greedy == true && opts.placeholder == "") opts.placeholder = " "; - if (mask.length == 1 && greedy == false && repeat != 0) { opts.placeholder = ""; } //hide placeholder with single non-greedy mask - var singleMask = $.map(mask.split(""), function (element, index) { - var outElem = []; - if (element == opts.escapeChar) { - escaped = true; - } - else if ((element != opts.optionalmarker.start && element != opts.optionalmarker.end) || escaped) { - var maskdef = opts.definitions[element]; - if (maskdef && !escaped) { - for (var i = 0; i < maskdef.cardinality; i++) { - outElem.push(opts.placeholder.charAt((outCount + i) % opts.placeholder.length)); - } - } else { - outElem.push(element); - escaped = false; - } - outCount += outElem.length; - return outElem; - } - }); - - //allocate repetitions - var repeatedMask = singleMask.slice(); - for (var i = 1; i < repeat && greedy; i++) { - repeatedMask = repeatedMask.concat(singleMask.slice()); - } - - return { "mask": repeatedMask, "repeat": repeat, "greedy": greedy }; - } - //test definition => {fn: RegExp/function, cardinality: int, optionality: bool, newBlockMarker: bool, offset: int, casing: null/upper/lower, def: definitionSymbol} - function getTestingChain(mask) { - if (opts.numericInput) { - mask = mask.split('').reverse().join(''); - } - var isOptional = false, escaped = false; - var newBlockMarker = false; //indicates wheter the begin/ending of a block should be indicated - - return $.map(mask.split(""), function (element, index) { - var outElem = []; - - if (element == opts.escapeChar) { - escaped = true; - } else if (element == opts.optionalmarker.start && !escaped) { - isOptional = true; - newBlockMarker = true; - } - else if (element == opts.optionalmarker.end && !escaped) { - isOptional = false; - newBlockMarker = true; - } - else { - var maskdef = opts.definitions[element]; - if (maskdef && !escaped) { - var prevalidators = maskdef["prevalidator"], prevalidatorsL = prevalidators ? prevalidators.length : 0; - for (var i = 1; i < maskdef.cardinality; i++) { - var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator["validator"], cardinality = prevalidator["cardinality"]; - outElem.push({ fn: validator ? typeof validator == 'string' ? new RegExp(validator) : new function () { this.test = validator; } : new RegExp("."), cardinality: cardinality ? cardinality : 1, optionality: isOptional, newBlockMarker: isOptional == true ? newBlockMarker : false, offset: 0, casing: maskdef["casing"], def: maskdef["definitionSymbol"] || element }); - if (isOptional == true) //reset newBlockMarker - newBlockMarker = false; - } - outElem.push({ fn: maskdef.validator ? typeof maskdef.validator == 'string' ? new RegExp(maskdef.validator) : new function () { this.test = maskdef.validator; } : new RegExp("."), cardinality: maskdef.cardinality, optionality: isOptional, newBlockMarker: newBlockMarker, offset: 0, casing: maskdef["casing"], def: maskdef["definitionSymbol"] || element }); - } else { - outElem.push({ fn: null, cardinality: 0, optionality: isOptional, newBlockMarker: newBlockMarker, offset: 0, casing: null, def: element }); - escaped = false; - } - //reset newBlockMarker - newBlockMarker = false; - return outElem; - } - }); - } - function markOptional(maskPart) { //needed for the clearOptionalTail functionality - return opts.optionalmarker.start + maskPart + opts.optionalmarker.end; - } - function splitFirstOptionalEndPart(maskPart) { - var optionalStartMarkers = 0, optionalEndMarkers = 0, mpl = maskPart.length; - for (var i = 0; i < mpl; i++) { - if (maskPart.charAt(i) == opts.optionalmarker.start) { - optionalStartMarkers++; - } - if (maskPart.charAt(i) == opts.optionalmarker.end) { - optionalEndMarkers++; - } - if (optionalStartMarkers > 0 && optionalStartMarkers == optionalEndMarkers) - break; - } - var maskParts = [maskPart.substring(0, i)]; - if (i < mpl) { - maskParts.push(maskPart.substring(i + 1, mpl)); - } - return maskParts; - } - function splitFirstOptionalStartPart(maskPart) { - var mpl = maskPart.length; - for (var i = 0; i < mpl; i++) { - if (maskPart.charAt(i) == opts.optionalmarker.start) { - break; - } - } - var maskParts = [maskPart.substring(0, i)]; - if (i < mpl) { - maskParts.push(maskPart.substring(i + 1, mpl)); - } - return maskParts; - } - function generateMask(maskPrefix, maskPart, metadata) { - var maskParts = splitFirstOptionalEndPart(maskPart); - var newMask, maskTemplate; - - var masks = splitFirstOptionalStartPart(maskParts[0]); - if (masks.length > 1) { - newMask = maskPrefix + masks[0] + markOptional(masks[1]) + (maskParts.length > 1 ? maskParts[1] : ""); - if ($.inArray(newMask, genmasks) == -1 && newMask != "") { - genmasks.push(newMask); - maskTemplate = getMaskTemplate(newMask); - ms.push({ - "mask": newMask, - "_buffer": maskTemplate["mask"], - "buffer": maskTemplate["mask"].slice(), - "tests": getTestingChain(newMask), - "lastValidPosition": -1, - "greedy": maskTemplate["greedy"], - "repeat": maskTemplate["repeat"], - "metadata": metadata - }); - } - newMask = maskPrefix + masks[0] + (maskParts.length > 1 ? maskParts[1] : ""); - if ($.inArray(newMask, genmasks) == -1 && newMask != "") { - genmasks.push(newMask); - maskTemplate = getMaskTemplate(newMask); - ms.push({ - "mask": newMask, - "_buffer": maskTemplate["mask"], - "buffer": maskTemplate["mask"].slice(), - "tests": getTestingChain(newMask), - "lastValidPosition": -1, - "greedy": maskTemplate["greedy"], - "repeat": maskTemplate["repeat"], - "metadata": metadata - }); - } - if (splitFirstOptionalStartPart(masks[1]).length > 1) { //optional contains another optional - generateMask(maskPrefix + masks[0], masks[1] + maskParts[1], metadata); - } - if (maskParts.length > 1 && splitFirstOptionalStartPart(maskParts[1]).length > 1) { - generateMask(maskPrefix + masks[0] + markOptional(masks[1]), maskParts[1], metadata); - generateMask(maskPrefix + masks[0], maskParts[1], metadata); - } - } - else { - newMask = maskPrefix + maskParts; - if ($.inArray(newMask, genmasks) == -1 && newMask != "") { - genmasks.push(newMask); - maskTemplate = getMaskTemplate(newMask); - ms.push({ - "mask": newMask, - "_buffer": maskTemplate["mask"], - "buffer": maskTemplate["mask"].slice(), - "tests": getTestingChain(newMask), - "lastValidPosition": -1, - "greedy": maskTemplate["greedy"], - "repeat": maskTemplate["repeat"], - "metadata": metadata - }); - } - } - - } - - if ($.isFunction(opts.mask)) { //allow mask to be a preprocessing fn - should return a valid mask - opts.mask = opts.mask.call(this, opts); - } - if ($.isArray(opts.mask)) { - $.each(opts.mask, function (ndx, msk) { - if (msk["mask"] != undefined) { - generateMask("", msk["mask"].toString(), msk); - } else - generateMask("", msk.toString()); - }); - } else generateMask("", opts.mask.toString()); - - return opts.greedy ? ms : ms.sort(function (a, b) { return a["mask"].length - b["mask"].length; }); - } - - var msie10 = navigator.userAgent.match(new RegExp("msie 10", "i")) !== null, - iphone = navigator.userAgent.match(new RegExp("iphone", "i")) !== null, - android = navigator.userAgent.match(new RegExp("android.*safari.*", "i")) !== null, - androidchrome = navigator.userAgent.match(new RegExp("android.*chrome.*", "i")) !== null, - pasteEvent = isInputEventSupported('paste') ? 'paste' : isInputEventSupported('input') ? 'input' : "propertychange"; - - - //masking scope - //actionObj definition see below - function maskScope(masksets, activeMasksetIndex, opts, actionObj) { - var isRTL = false, - valueOnFocus = getActiveBuffer().join(''), - $el, chromeValueOnInput, - skipKeyPressEvent = false, //Safari 5.1.x - modal dialog fires keypress twice workaround - skipInputEvent = false, //skip when triggered from within inputmask - ignorable = false; - - - //maskset helperfunctions - - function getActiveMaskSet() { - return masksets[activeMasksetIndex]; - } - - function getActiveTests() { - return getActiveMaskSet()['tests']; - } - - function getActiveBufferTemplate() { - return getActiveMaskSet()['_buffer']; - } - - function getActiveBuffer() { - return getActiveMaskSet()['buffer']; - } - - function isValid(pos, c, strict) { //strict true ~ no correction or autofill - strict = strict === true; //always set a value to strict to prevent possible strange behavior in the extensions - - function _isValid(position, activeMaskset, c, strict) { - var testPos = determineTestPosition(position), loopend = c ? 1 : 0, chrs = '', buffer = activeMaskset["buffer"]; - for (var i = activeMaskset['tests'][testPos].cardinality; i > loopend; i--) { - chrs += getBufferElement(buffer, testPos - (i - 1)); - } - - if (c) { - chrs += c; - } - - //return is false or a json object => { pos: ??, c: ??} or true - return activeMaskset['tests'][testPos].fn != null ? - activeMaskset['tests'][testPos].fn.test(chrs, buffer, position, strict, opts) - : (c == getBufferElement(activeMaskset['_buffer'], position, true) || c == opts.skipOptionalPartCharacter) ? - { "refresh": true, c: getBufferElement(activeMaskset['_buffer'], position, true), pos: position } - : false; - } - - function PostProcessResults(maskForwards, results) { - var hasValidActual = false; - $.each(results, function (ndx, rslt) { - hasValidActual = $.inArray(rslt["activeMasksetIndex"], maskForwards) == -1 && rslt["result"] !== false; - if (hasValidActual) return false; - }); - if (hasValidActual) { //strip maskforwards - results = $.map(results, function (rslt, ndx) { - if ($.inArray(rslt["activeMasksetIndex"], maskForwards) == -1) { - return rslt; - } else { - masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = actualLVP; - } - }); - } else { //keep maskforwards with the least forward - var lowestPos = -1, lowestIndex = -1, rsltValid; - $.each(results, function (ndx, rslt) { - if ($.inArray(rslt["activeMasksetIndex"], maskForwards) != -1 && rslt["result"] !== false & (lowestPos == -1 || lowestPos > rslt["result"]["pos"])) { - lowestPos = rslt["result"]["pos"]; - lowestIndex = rslt["activeMasksetIndex"]; - } - }); - results = $.map(results, function (rslt, ndx) { - if ($.inArray(rslt["activeMasksetIndex"], maskForwards) != -1) { - if (rslt["result"]["pos"] == lowestPos) { - return rslt; - } else if (rslt["result"] !== false) { - for (var i = pos; i < lowestPos; i++) { - rsltValid = _isValid(i, masksets[rslt["activeMasksetIndex"]], masksets[lowestIndex]["buffer"][i], true); - if (rsltValid === false) { - masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = lowestPos - 1; - break; - } else { - setBufferElement(masksets[rslt["activeMasksetIndex"]]["buffer"], i, masksets[lowestIndex]["buffer"][i], true); - masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = i; - } - } - //also check check for the lowestpos with the new input - rsltValid = _isValid(lowestPos, masksets[rslt["activeMasksetIndex"]], c, true); - if (rsltValid !== false) { - setBufferElement(masksets[rslt["activeMasksetIndex"]]["buffer"], lowestPos, c, true); - masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = lowestPos; - } - //console.log("ndx " + rslt["activeMasksetIndex"] + " validate " + masksets[rslt["activeMasksetIndex"]]["buffer"].join('') + " lv " + masksets[rslt["activeMasksetIndex"]]['lastValidPosition']); - return rslt; - } - } - }); - } - return results; - } - - if (strict) { - var result = _isValid(pos, getActiveMaskSet(), c, strict); //only check validity in current mask when validating strict - if (result === true) { - result = { "pos": pos }; //always take a possible corrected maskposition into account - } - return result; - } - - var results = [], result = false, currentActiveMasksetIndex = activeMasksetIndex, - actualBuffer = getActiveBuffer().slice(), actualLVP = getActiveMaskSet()["lastValidPosition"], - actualPrevious = seekPrevious(pos), - maskForwards = []; - $.each(masksets, function (index, value) { - if (typeof (value) == "object") { - activeMasksetIndex = index; - - var maskPos = pos; - var lvp = getActiveMaskSet()['lastValidPosition'], - rsltValid; - if (lvp == actualLVP) { - if ((maskPos - actualLVP) > 1) { - for (var i = lvp == -1 ? 0 : lvp; i < maskPos; i++) { - rsltValid = _isValid(i, getActiveMaskSet(), actualBuffer[i], true); - if (rsltValid === false) { - break; - } else { - setBufferElement(getActiveBuffer(), i, actualBuffer[i], true); - if (rsltValid === true) { - rsltValid = { "pos": i }; //always take a possible corrected maskposition into account - } - var newValidPosition = rsltValid.pos || i; - if (getActiveMaskSet()['lastValidPosition'] < newValidPosition) - getActiveMaskSet()['lastValidPosition'] = newValidPosition; //set new position from isValid - } - } - } - //does the input match on a further position? - if (!isMask(maskPos) && !_isValid(maskPos, getActiveMaskSet(), c, strict)) { - var maxForward = seekNext(maskPos) - maskPos; - for (var fw = 0; fw < maxForward; fw++) { - if (_isValid(++maskPos, getActiveMaskSet(), c, strict) !== false) - break; - } - maskForwards.push(activeMasksetIndex); - //console.log('maskforward ' + activeMasksetIndex + " pos " + pos + " maskPos " + maskPos); - } - } - - if (getActiveMaskSet()['lastValidPosition'] >= actualLVP || activeMasksetIndex == currentActiveMasksetIndex) { - if (maskPos >= 0 && maskPos < getMaskLength()) { - result = _isValid(maskPos, getActiveMaskSet(), c, strict); - if (result !== false) { - if (result === true) { - result = { "pos": maskPos }; //always take a possible corrected maskposition into account - } - var newValidPosition = result.pos || maskPos; - if (getActiveMaskSet()['lastValidPosition'] < newValidPosition) - getActiveMaskSet()['lastValidPosition'] = newValidPosition; //set new position from isValid - } - //console.log("pos " + pos + " ndx " + activeMasksetIndex + " validate " + getActiveBuffer().join('') + " lv " + getActiveMaskSet()['lastValidPosition']); - results.push({ "activeMasksetIndex": index, "result": result }); - } - } - } - }); - activeMasksetIndex = currentActiveMasksetIndex; //reset activeMasksetIndex - - return PostProcessResults(maskForwards, results); //return results of the multiple mask validations - } - - function determineActiveMasksetIndex() { - var currentMasksetIndex = activeMasksetIndex, - highestValid = { "activeMasksetIndex": 0, "lastValidPosition": -1, "next": -1 }; - $.each(masksets, function (index, value) { - if (typeof (value) == "object") { - activeMasksetIndex = index; - if (getActiveMaskSet()['lastValidPosition'] > highestValid['lastValidPosition']) { - highestValid["activeMasksetIndex"] = index; - highestValid["lastValidPosition"] = getActiveMaskSet()['lastValidPosition']; - highestValid["next"] = seekNext(getActiveMaskSet()['lastValidPosition']); - } else if (getActiveMaskSet()['lastValidPosition'] == highestValid['lastValidPosition'] && - (highestValid['next'] == -1 || highestValid['next'] > seekNext(getActiveMaskSet()['lastValidPosition']))) { - highestValid["activeMasksetIndex"] = index; - highestValid["lastValidPosition"] = getActiveMaskSet()['lastValidPosition']; - highestValid["next"] = seekNext(getActiveMaskSet()['lastValidPosition']); - } - } - }); - - activeMasksetIndex = highestValid["lastValidPosition"] != -1 && masksets[currentMasksetIndex]["lastValidPosition"] == highestValid["lastValidPosition"] ? currentMasksetIndex : highestValid["activeMasksetIndex"]; - if (currentMasksetIndex != activeMasksetIndex) { - clearBuffer(getActiveBuffer(), seekNext(highestValid["lastValidPosition"]), getMaskLength()); - getActiveMaskSet()["writeOutBuffer"] = true; - } - $el.data('_inputmask')['activeMasksetIndex'] = activeMasksetIndex; //store the activeMasksetIndex - } - - function isMask(pos) { - var testPos = determineTestPosition(pos); - var test = getActiveTests()[testPos]; - - return test != undefined ? test.fn : false; - } - - function determineTestPosition(pos) { - return pos % getActiveTests().length; - } - - function getMaskLength() { - return opts.getMaskLength(getActiveBufferTemplate(), getActiveMaskSet()['greedy'], getActiveMaskSet()['repeat'], getActiveBuffer(), opts); - } - - //pos: from position - - function seekNext(pos) { - var maskL = getMaskLength(); - if (pos >= maskL) return maskL; - var position = pos; - while (++position < maskL && !isMask(position)) { - } - return position; - } - - //pos: from position - - function seekPrevious(pos) { - var position = pos; - if (position <= 0) return 0; - - while (--position > 0 && !isMask(position)) { - } - return position; - } - - function setBufferElement(buffer, position, element, autoPrepare) { - if (autoPrepare) position = prepareBuffer(buffer, position); - - var test = getActiveTests()[determineTestPosition(position)]; - var elem = element; - if (elem != undefined && test != undefined) { - switch (test.casing) { - case "upper": - elem = element.toUpperCase(); - break; - case "lower": - elem = element.toLowerCase(); - break; - } - } - - buffer[position] = elem; - } - - function getBufferElement(buffer, position, autoPrepare) { - if (autoPrepare) position = prepareBuffer(buffer, position); - return buffer[position]; - } - - //needed to handle the non-greedy mask repetitions - - function prepareBuffer(buffer, position) { - var j; - while (buffer[position] == undefined && buffer.length < getMaskLength()) { - j = 0; - while (getActiveBufferTemplate()[j] !== undefined) { //add a new buffer - buffer.push(getActiveBufferTemplate()[j++]); - } - } - - return position; - } - - function writeBuffer(input, buffer, caretPos) { - input._valueSet(buffer.join('')); - if (caretPos != undefined) { - caret(input, caretPos); - } - } - - function clearBuffer(buffer, start, end, stripNomasks) { - for (var i = start, maskL = getMaskLength() ; i < end && i < maskL; i++) { - if (stripNomasks === true) { - if (!isMask(i)) - setBufferElement(buffer, i, ""); - } else - setBufferElement(buffer, i, getBufferElement(getActiveBufferTemplate().slice(), i, true)); - } - } - - function setReTargetPlaceHolder(buffer, pos) { - var testPos = determineTestPosition(pos); - setBufferElement(buffer, pos, getBufferElement(getActiveBufferTemplate(), testPos)); - } - - function getPlaceHolder(pos) { - return opts.placeholder.charAt(pos % opts.placeholder.length); - } - - function checkVal(input, writeOut, strict, nptvl, intelliCheck) { - var inputValue = nptvl != undefined ? nptvl.slice() : truncateInput(input._valueGet()).split(''); - - $.each(masksets, function (ndx, ms) { - if (typeof (ms) == "object") { - ms["buffer"] = ms["_buffer"].slice(); - ms["lastValidPosition"] = -1; - ms["p"] = -1; - } - }); - if (strict !== true) activeMasksetIndex = 0; - if (writeOut) input._valueSet(""); //initial clear - var ml = getMaskLength(); - $.each(inputValue, function (ndx, charCode) { - if (intelliCheck === true) { - var p = getActiveMaskSet()["p"], lvp = p == -1 ? p : seekPrevious(p), - pos = lvp == -1 ? ndx : seekNext(lvp); - if ($.inArray(charCode, getActiveBufferTemplate().slice(lvp + 1, pos)) == -1) { - keypressEvent.call(input, undefined, true, charCode.charCodeAt(0), writeOut, strict, ndx); - } - } else { - keypressEvent.call(input, undefined, true, charCode.charCodeAt(0), writeOut, strict, ndx); - } - }); - - if (strict === true && getActiveMaskSet()["p"] != -1) { - getActiveMaskSet()["lastValidPosition"] = seekPrevious(getActiveMaskSet()["p"]); - } - } - - function escapeRegex(str) { - return $.inputmask.escapeRegex.call(this, str); - } - - function truncateInput(inputValue) { - return inputValue.replace(new RegExp("(" + escapeRegex(getActiveBufferTemplate().join('')) + ")*$"), ""); - } - - function clearOptionalTail(input) { - var buffer = getActiveBuffer(), tmpBuffer = buffer.slice(), testPos, pos; - for (var pos = tmpBuffer.length - 1; pos >= 0; pos--) { - var testPos = determineTestPosition(pos); - if (getActiveTests()[testPos].optionality) { - if (!isMask(pos) || !isValid(pos, buffer[pos], true)) - tmpBuffer.pop(); - else break; - } else break; - } - writeBuffer(input, tmpBuffer); - } - - function unmaskedvalue($input, skipDatepickerCheck) { - if (getActiveTests() && (skipDatepickerCheck === true || !$input.hasClass('hasDatepicker'))) { - //checkVal(input, false, true); - var umValue = $.map(getActiveBuffer(), function (element, index) { - return isMask(index) && isValid(index, element, true) ? element : null; - }); - var unmaskedValue = (isRTL ? umValue.reverse() : umValue).join(''); - return opts.onUnMask != undefined ? opts.onUnMask.call(this, getActiveBuffer().join(''), unmaskedValue) : unmaskedValue; - } else { - return $input[0]._valueGet(); - } - } - - function TranslatePosition(pos) { - if (isRTL && typeof pos == 'number' && (!opts.greedy || opts.placeholder != "")) { - var bffrLght = getActiveBuffer().length; - pos = bffrLght - pos; - } - return pos; - } - - function caret(input, begin, end) { - var npt = input.jquery && input.length > 0 ? input[0] : input, range; - if (typeof begin == 'number') { - begin = TranslatePosition(begin); - end = TranslatePosition(end); - if (!$(input).is(':visible')) { - return; - } - end = (typeof end == 'number') ? end : begin; - npt.scrollLeft = npt.scrollWidth; - if (opts.insertMode == false && begin == end) end++; //set visualization for insert/overwrite mode - if (npt.setSelectionRange) { - npt.selectionStart = begin; - npt.selectionEnd = android ? begin : end; - - } else if (npt.createTextRange) { - range = npt.createTextRange(); - range.collapse(true); - range.moveEnd('character', end); - range.moveStart('character', begin); - range.select(); - } - } else { - if (!$(input).is(':visible')) { - return { "begin": 0, "end": 0 }; - } - if (npt.setSelectionRange) { - begin = npt.selectionStart; - end = npt.selectionEnd; - } else if (document.selection && document.selection.createRange) { - range = document.selection.createRange(); - begin = 0 - range.duplicate().moveStart('character', -100000); - end = begin + range.text.length; - } - begin = TranslatePosition(begin); - end = TranslatePosition(end); - return { "begin": begin, "end": end }; - } - } - - function isComplete(buffer) { //return true / false / undefined (repeat *) - if (opts.repeat == "*") return undefined; - var complete = false, highestValidPosition = 0, currentActiveMasksetIndex = activeMasksetIndex; - $.each(masksets, function (ndx, ms) { - if (typeof (ms) == "object") { - activeMasksetIndex = ndx; - var aml = seekPrevious(getMaskLength()); - if (ms["lastValidPosition"] >= highestValidPosition && ms["lastValidPosition"] == aml) { - var msComplete = true; - for (var i = 0; i <= aml; i++) { - var mask = isMask(i), testPos = determineTestPosition(i); - if ((mask && (buffer[i] == undefined || buffer[i] == getPlaceHolder(i))) || (!mask && buffer[i] != getActiveBufferTemplate()[testPos])) { - msComplete = false; - break; - } - } - complete = complete || msComplete; - if (complete) //break loop - return false; - } - highestValidPosition = ms["lastValidPosition"]; - } - }); - activeMasksetIndex = currentActiveMasksetIndex; //reset activeMaskset - return complete; - } - - function isSelection(begin, end) { - return isRTL ? (begin - end) > 1 || ((begin - end) == 1 && opts.insertMode) : - (end - begin) > 1 || ((end - begin) == 1 && opts.insertMode); - } - - - //private functions - function installEventRuler(npt) { - var events = $._data(npt).events; - - $.each(events, function (eventType, eventHandlers) { - $.each(eventHandlers, function (ndx, eventHandler) { - if (eventHandler.namespace == "inputmask") { - if (eventHandler.type != "setvalue") { - var handler = eventHandler.handler; - eventHandler.handler = function (e) { - if (this.readOnly || this.disabled) - e.preventDefault; - else - return handler.apply(this, arguments); - }; - } - } - }); - }); - } - - function patchValueProperty(npt) { - var valueProperty; - if (Object.getOwnPropertyDescriptor) - valueProperty = Object.getOwnPropertyDescriptor(npt, "value"); - if (valueProperty && valueProperty.get) { - if (!npt._valueGet) { - var valueGet = valueProperty.get; - var valueSet = valueProperty.set; - npt._valueGet = function () { - return isRTL ? valueGet.call(this).split('').reverse().join('') : valueGet.call(this); - }; - npt._valueSet = function (value) { - valueSet.call(this, isRTL ? value.split('').reverse().join('') : value); - }; - - Object.defineProperty(npt, "value", { - get: function () { - var $self = $(this), inputData = $(this).data('_inputmask'), masksets = inputData['masksets'], - activeMasksetIndex = inputData['activeMasksetIndex']; - return inputData && inputData['opts'].autoUnmask ? $self.inputmask('unmaskedvalue') : valueGet.call(this) != masksets[activeMasksetIndex]['_buffer'].join('') ? valueGet.call(this) : ''; - }, - set: function (value) { - valueSet.call(this, value); - $(this).triggerHandler('setvalue.inputmask'); - } - }); - } - } else if (document.__lookupGetter__ && npt.__lookupGetter__("value")) { - if (!npt._valueGet) { - var valueGet = npt.__lookupGetter__("value"); - var valueSet = npt.__lookupSetter__("value"); - npt._valueGet = function () { - return isRTL ? valueGet.call(this).split('').reverse().join('') : valueGet.call(this); - }; - npt._valueSet = function (value) { - valueSet.call(this, isRTL ? value.split('').reverse().join('') : value); - }; - - npt.__defineGetter__("value", function () { - var $self = $(this), inputData = $(this).data('_inputmask'), masksets = inputData['masksets'], - activeMasksetIndex = inputData['activeMasksetIndex']; - return inputData && inputData['opts'].autoUnmask ? $self.inputmask('unmaskedvalue') : valueGet.call(this) != masksets[activeMasksetIndex]['_buffer'].join('') ? valueGet.call(this) : ''; - }); - npt.__defineSetter__("value", function (value) { - valueSet.call(this, value); - $(this).triggerHandler('setvalue.inputmask'); - }); - } - } else { - if (!npt._valueGet) { - npt._valueGet = function () { return isRTL ? this.value.split('').reverse().join('') : this.value; }; - npt._valueSet = function (value) { this.value = isRTL ? value.split('').reverse().join('') : value; }; - } - if ($.valHooks.text == undefined || $.valHooks.text.inputmaskpatch != true) { - var valueGet = $.valHooks.text && $.valHooks.text.get ? $.valHooks.text.get : function (elem) { return elem.value; }; - var valueSet = $.valHooks.text && $.valHooks.text.set ? $.valHooks.text.set : function (elem, value) { - elem.value = value; - return elem; - }; - - jQuery.extend($.valHooks, { - text: { - get: function (elem) { - var $elem = $(elem); - if ($elem.data('_inputmask')) { - if ($elem.data('_inputmask')['opts'].autoUnmask) - return $elem.inputmask('unmaskedvalue'); - else { - var result = valueGet(elem), - inputData = $elem.data('_inputmask'), masksets = inputData['masksets'], - activeMasksetIndex = inputData['activeMasksetIndex']; - return result != masksets[activeMasksetIndex]['_buffer'].join('') ? result : ''; - } - } else return valueGet(elem); - }, - set: function (elem, value) { - var $elem = $(elem); - var result = valueSet(elem, value); - if ($elem.data('_inputmask')) $elem.triggerHandler('setvalue.inputmask'); - return result; - }, - inputmaskpatch: true - } - }); - } - } - } - - //shift chars to left from start to end and put c at end position if defined - - function shiftL(start, end, c, maskJumps) { - var buffer = getActiveBuffer(); - if (maskJumps !== false) //jumping over nonmask position - while (!isMask(start) && start - 1 >= 0) start--; - for (var i = start; i < end && i < getMaskLength() ; i++) { - if (isMask(i)) { - setReTargetPlaceHolder(buffer, i); - var j = seekNext(i); - var p = getBufferElement(buffer, j); - if (p != getPlaceHolder(j)) { - if (j < getMaskLength() && isValid(i, p, true) !== false && getActiveTests()[determineTestPosition(i)].def == getActiveTests()[determineTestPosition(j)].def) { - setBufferElement(buffer, i, p, true); - } else { - if (isMask(i)) - break; - } - } - } else { - setReTargetPlaceHolder(buffer, i); - } - } - if (c != undefined) - setBufferElement(buffer, seekPrevious(end), c); - - if (getActiveMaskSet()["greedy"] == false) { - var trbuffer = truncateInput(buffer.join('')).split(''); - buffer.length = trbuffer.length; - for (var i = 0, bl = buffer.length; i < bl; i++) { - buffer[i] = trbuffer[i]; - } - if (buffer.length == 0) getActiveMaskSet()["buffer"] = getActiveBufferTemplate().slice(); - } - return start; //return the used start position - } - - function shiftR(start, end, c) { - var buffer = getActiveBuffer(); - if (getBufferElement(buffer, start, true) != getPlaceHolder(start)) { - for (var i = seekPrevious(end) ; i > start && i >= 0; i--) { - if (isMask(i)) { - var j = seekPrevious(i); - var t = getBufferElement(buffer, j); - if (t != getPlaceHolder(j)) { - if (isValid(j, t, true) !== false && getActiveTests()[determineTestPosition(i)].def == getActiveTests()[determineTestPosition(j)].def) { - setBufferElement(buffer, i, t, true); - setReTargetPlaceHolder(buffer, j); - } //else break; - } - } else - setReTargetPlaceHolder(buffer, i); - } - } - if (c != undefined && getBufferElement(buffer, start) == getPlaceHolder(start)) - setBufferElement(buffer, start, c); - var lengthBefore = buffer.length; - if (getActiveMaskSet()["greedy"] == false) { - var trbuffer = truncateInput(buffer.join('')).split(''); - buffer.length = trbuffer.length; - for (var i = 0, bl = buffer.length; i < bl; i++) { - buffer[i] = trbuffer[i]; - } - if (buffer.length == 0) getActiveMaskSet()["buffer"] = getActiveBufferTemplate().slice(); - } - return end - (lengthBefore - buffer.length); //return new start position - } - - function HandleRemove(input, k, pos) { - if (opts.numericInput || isRTL) { - switch (k) { - case opts.keyCode.BACKSPACE: - k = opts.keyCode.DELETE; - break; - case opts.keyCode.DELETE: - k = opts.keyCode.BACKSPACE; - break; - } - if (isRTL) { - var pend = pos.end; - pos.end = pos.begin; - pos.begin = pend; - } - } - - var isSelection = true; - if (pos.begin == pos.end) { - var posBegin = k == opts.keyCode.BACKSPACE ? pos.begin - 1 : pos.begin; - if (opts.isNumeric && opts.radixPoint != "" && getActiveBuffer()[posBegin] == opts.radixPoint) { - pos.begin = (getActiveBuffer().length - 1 == posBegin) /* radixPoint is latest? delete it */ ? pos.begin : k == opts.keyCode.BACKSPACE ? posBegin : seekNext(posBegin); - pos.end = pos.begin; - } - isSelection = false; - if (k == opts.keyCode.BACKSPACE) - pos.begin--; - else if (k == opts.keyCode.DELETE) - pos.end++; - } else if (pos.end - pos.begin == 1 && !opts.insertMode) { - isSelection = false; - if (k == opts.keyCode.BACKSPACE) - pos.begin--; - } - - clearBuffer(getActiveBuffer(), pos.begin, pos.end); - - var ml = getMaskLength(); - if (opts.greedy == false) { - shiftL(pos.begin, ml, undefined, !isRTL && (k == opts.keyCode.BACKSPACE && !isSelection)); - } else { - var newpos = pos.begin; - for (var i = pos.begin; i < pos.end; i++) { //seeknext to skip placeholders at start in selection - if (isMask(i) || !isSelection) - newpos = shiftL(pos.begin, ml, undefined, !isRTL && (k == opts.keyCode.BACKSPACE && !isSelection)); - } - if (!isSelection) pos.begin = newpos; - } - var firstMaskPos = seekNext(-1); - clearBuffer(getActiveBuffer(), pos.begin, pos.end, true); - checkVal(input, false, masksets[1] == undefined || firstMaskPos >= pos.end, getActiveBuffer()); - if (getActiveMaskSet()['lastValidPosition'] < firstMaskPos) { - getActiveMaskSet()["lastValidPosition"] = -1; - getActiveMaskSet()["p"] = firstMaskPos; - } else { - getActiveMaskSet()["p"] = pos.begin; - } - } - - function keydownEvent(e) { - //Safari 5.1.x - modal dialog fires keypress twice workaround - skipKeyPressEvent = false; - var input = this, $input = $(input), k = e.keyCode, pos = caret(input); - - //backspace, delete, and escape get special treatment - if (k == opts.keyCode.BACKSPACE || k == opts.keyCode.DELETE || (iphone && k == 127) || e.ctrlKey && k == 88) { //backspace/delete - e.preventDefault(); //stop default action but allow propagation - if (k == 88) valueOnFocus = getActiveBuffer().join(''); - HandleRemove(input, k, pos); - determineActiveMasksetIndex(); - writeBuffer(input, getActiveBuffer(), getActiveMaskSet()["p"]); - if (input._valueGet() == getActiveBufferTemplate().join('')) - $input.trigger('cleared'); - - if (opts.showTooltip) { //update tooltip - $input.prop("title", getActiveMaskSet()["mask"]); - } - } else if (k == opts.keyCode.END || k == opts.keyCode.PAGE_DOWN) { //when END or PAGE_DOWN pressed set position at lastmatch - setTimeout(function () { - var caretPos = seekNext(getActiveMaskSet()["lastValidPosition"]); - if (!opts.insertMode && caretPos == getMaskLength() && !e.shiftKey) caretPos--; - caret(input, e.shiftKey ? pos.begin : caretPos, caretPos); - }, 0); - } else if ((k == opts.keyCode.HOME && !e.shiftKey) || k == opts.keyCode.PAGE_UP) { //Home or page_up - caret(input, 0, e.shiftKey ? pos.begin : 0); - } else if (k == opts.keyCode.ESCAPE || (k == 90 && e.ctrlKey)) { //escape && undo - checkVal(input, true, false, valueOnFocus.split('')); - $input.click(); - } else if (k == opts.keyCode.INSERT && !(e.shiftKey || e.ctrlKey)) { //insert - opts.insertMode = !opts.insertMode; - caret(input, !opts.insertMode && pos.begin == getMaskLength() ? pos.begin - 1 : pos.begin); - } else if (opts.insertMode == false && !e.shiftKey) { - if (k == opts.keyCode.RIGHT) { - setTimeout(function () { - var caretPos = caret(input); - caret(input, caretPos.begin); - }, 0); - } else if (k == opts.keyCode.LEFT) { - setTimeout(function () { - var caretPos = caret(input); - caret(input, caretPos.begin - 1); - }, 0); - } - } - - var currentCaretPos = caret(input); - if (opts.onKeyDown.call(this, e, getActiveBuffer(), opts) === true) //extra stuff to execute on keydown - caret(input, currentCaretPos.begin, currentCaretPos.end); - ignorable = $.inArray(k, opts.ignorables) != -1; - } - - - function keypressEvent(e, checkval, k, writeOut, strict, ndx) { - //Safari 5.1.x - modal dialog fires keypress twice workaround - if (k == undefined && skipKeyPressEvent) return false; - skipKeyPressEvent = true; - - var input = this, $input = $(input); - - e = e || window.event; - var k = checkval ? k : (e.which || e.charCode || e.keyCode); - - if (checkval !== true && (!(e.ctrlKey && e.altKey) && (e.ctrlKey || e.metaKey || ignorable))) { - return true; - } else { - if (k) { - //special treat the decimal separator - if (checkval !== true && k == 46 && e.shiftKey == false && opts.radixPoint == ",") k = 44; - - var pos, results, result, c = String.fromCharCode(k); - if (checkval) { - var pcaret = strict ? ndx : getActiveMaskSet()["lastValidPosition"] + 1; - pos = { begin: pcaret, end: pcaret }; - } else { - pos = caret(input); - } - - //should we clear a possible selection?? - var isSlctn = isSelection(pos.begin, pos.end), redetermineLVP = false, - initialIndex = activeMasksetIndex; - if (isSlctn) { - activeMasksetIndex = initialIndex; - $.each(masksets, function (ndx, lmnt) { //init undobuffer for recovery when not valid - if (typeof (lmnt) == "object") { - activeMasksetIndex = ndx; - getActiveMaskSet()["undoBuffer"] = getActiveBuffer().join(''); - } - }); - HandleRemove(input, opts.keyCode.DELETE, pos); - if (!opts.insertMode) { //preserve some space - $.each(masksets, function (ndx, lmnt) { - if (typeof (lmnt) == "object") { - activeMasksetIndex = ndx; - shiftR(pos.begin, getMaskLength()); - getActiveMaskSet()["lastValidPosition"] = seekNext(getActiveMaskSet()["lastValidPosition"]); - } - }); - } - activeMasksetIndex = initialIndex; //restore index - } - - var radixPosition = getActiveBuffer().join('').indexOf(opts.radixPoint); - if (opts.isNumeric && checkval !== true && radixPosition != -1) { - if (opts.greedy && pos.begin <= radixPosition) { - pos.begin = seekPrevious(pos.begin); - pos.end = pos.begin; - } else if (c == opts.radixPoint) { - pos.begin = radixPosition; - pos.end = pos.begin; - } - } - - - var p = pos.begin; - results = isValid(p, c, strict); - if (strict === true) results = [{ "activeMasksetIndex": activeMasksetIndex, "result": results }]; - var minimalForwardPosition = -1; - $.each(results, function (index, result) { - activeMasksetIndex = result["activeMasksetIndex"]; - getActiveMaskSet()["writeOutBuffer"] = true; - var np = result["result"]; - if (np !== false) { - var refresh = false, buffer = getActiveBuffer(); - if (np !== true) { - refresh = np["refresh"]; //only rewrite buffer from isValid - p = np.pos != undefined ? np.pos : p; //set new position from isValid - c = np.c != undefined ? np.c : c; //set new char from isValid - } - if (refresh !== true) { - if (opts.insertMode == true) { - var lastUnmaskedPosition = getMaskLength(); - var bfrClone = buffer.slice(); - while (getBufferElement(bfrClone, lastUnmaskedPosition, true) != getPlaceHolder(lastUnmaskedPosition) && lastUnmaskedPosition >= p) { - lastUnmaskedPosition = lastUnmaskedPosition == 0 ? -1 : seekPrevious(lastUnmaskedPosition); - } - if (lastUnmaskedPosition >= p) { - shiftR(p, getMaskLength(), c); - //shift the lvp if needed - var lvp = getActiveMaskSet()["lastValidPosition"], nlvp = seekNext(lvp); - if (nlvp != getMaskLength() && lvp >= p && (getBufferElement(getActiveBuffer(), nlvp, true) != getPlaceHolder(nlvp))) { - getActiveMaskSet()["lastValidPosition"] = nlvp; - } - } else getActiveMaskSet()["writeOutBuffer"] = false; - } else setBufferElement(buffer, p, c, true); - if (minimalForwardPosition == -1 || minimalForwardPosition > seekNext(p)) { - minimalForwardPosition = seekNext(p); - } - } else if (!strict) { - var nextPos = p < getMaskLength() ? p + 1 : p; - if (minimalForwardPosition == -1 || minimalForwardPosition > nextPos) { - minimalForwardPosition = nextPos; - } - } - if (minimalForwardPosition > getActiveMaskSet()["p"]) - getActiveMaskSet()["p"] = minimalForwardPosition; //needed for checkval strict - } - }); - - if (strict !== true) { - activeMasksetIndex = initialIndex; - determineActiveMasksetIndex(); - } - if (writeOut !== false) { - $.each(results, function (ndx, rslt) { - if (rslt["activeMasksetIndex"] == activeMasksetIndex) { - result = rslt; - return false; - } - }); - if (result != undefined) { - var self = this; - setTimeout(function () { opts.onKeyValidation.call(self, result["result"], opts); }, 0); - if (getActiveMaskSet()["writeOutBuffer"] && result["result"] !== false) { - var buffer = getActiveBuffer(); - - var newCaretPosition; - if (checkval) { - newCaretPosition = undefined; - } else if (opts.numericInput) { - if (p > radixPosition) { - newCaretPosition = seekPrevious(minimalForwardPosition); - } else if (c == opts.radixPoint) { - newCaretPosition = minimalForwardPosition - 1; - } else newCaretPosition = seekPrevious(minimalForwardPosition - 1); - } else { - newCaretPosition = minimalForwardPosition; - } - - writeBuffer(input, buffer, newCaretPosition); - if (checkval !== true) { - setTimeout(function () { //timeout needed for IE - if (isComplete(buffer) === true) - $input.trigger("complete"); - skipInputEvent = true; - $input.trigger("input"); - }, 0); - } - } else if (isSlctn) { - getActiveMaskSet()["buffer"] = getActiveMaskSet()["undoBuffer"].split(''); - } - } - } - - if (opts.showTooltip) { //update tooltip - $input.prop("title", getActiveMaskSet()["mask"]); - } - - //needed for IE8 and below - if (e) e.preventDefault ? e.preventDefault() : e.returnValue = false; - } - } - } - - function keyupEvent(e) { - var $input = $(this), input = this, k = e.keyCode, buffer = getActiveBuffer(); - - if (androidchrome && k == opts.keyCode.BACKSPACE) { - if (chromeValueOnInput == input._valueGet()) - keydownEvent.call(this, e); - } - - opts.onKeyUp.call(this, e, buffer, opts); //extra stuff to execute on keyup - if (k == opts.keyCode.TAB && opts.showMaskOnFocus) { - if ($input.hasClass('focus.inputmask') && input._valueGet().length == 0) { - buffer = getActiveBufferTemplate().slice(); - writeBuffer(input, buffer); - caret(input, 0); - valueOnFocus = getActiveBuffer().join(''); - } else { - writeBuffer(input, buffer); - if (buffer.join('') == getActiveBufferTemplate().join('') && $.inArray(opts.radixPoint, buffer) != -1) { - caret(input, TranslatePosition(0)); - $input.click(); - } else - caret(input, TranslatePosition(0), TranslatePosition(getMaskLength())); - } - } - } - - function inputEvent(e) { - if (skipInputEvent === true) { - skipInputEvent = false; - return true; - } - var input = this, $input = $(input); - - chromeValueOnInput = getActiveBuffer().join(''); - checkVal(input, false, false); - writeBuffer(input, getActiveBuffer()); - if (isComplete(getActiveBuffer()) === true) - $input.trigger("complete"); - $input.click(); - } - - function mask(el) { - $el = $(el); - if ($el.is(":input")) { - //store tests & original buffer in the input element - used to get the unmasked value - $el.data('_inputmask', { - 'masksets': masksets, - 'activeMasksetIndex': activeMasksetIndex, - 'opts': opts, - 'isRTL': false - }); - - //show tooltip - if (opts.showTooltip) { - $el.prop("title", getActiveMaskSet()["mask"]); - } - - //correct greedy setting if needed - getActiveMaskSet()['greedy'] = getActiveMaskSet()['greedy'] ? getActiveMaskSet()['greedy'] : getActiveMaskSet()['repeat'] == 0; - - //handle maxlength attribute - if ($el.attr("maxLength") != null) //only when the attribute is set - { - var maxLength = $el.prop('maxLength'); - if (maxLength > -1) { //handle *-repeat - $.each(masksets, function (ndx, ms) { - if (typeof (ms) == "object") { - if (ms["repeat"] == "*") { - ms["repeat"] = maxLength; - } - } - }); - } - if (getMaskLength() >= maxLength && maxLength > -1) { //FF sets no defined max length to -1 - if (maxLength < getActiveBufferTemplate().length) getActiveBufferTemplate().length = maxLength; - if (getActiveMaskSet()['greedy'] == false) { - getActiveMaskSet()['repeat'] = Math.round(maxLength / getActiveBufferTemplate().length); - } - $el.prop('maxLength', getMaskLength() * 2); - } - } - - patchValueProperty(el); - - if (opts.numericInput) opts.isNumeric = opts.numericInput; - if (el.dir == "rtl" || (opts.numericInput && opts.rightAlignNumerics) || (opts.isNumeric && opts.rightAlignNumerics)) - $el.css("text-align", "right"); - - if (el.dir == "rtl" || opts.numericInput) { - el.dir = "ltr"; - $el.removeAttr("dir"); - var inputData = $el.data('_inputmask'); - inputData['isRTL'] = true; - $el.data('_inputmask', inputData); - isRTL = true; - } - - //unbind all events - to make sure that no other mask will interfere when re-masking - $el.unbind(".inputmask"); - $el.removeClass('focus.inputmask'); - //bind events - $el.closest('form').bind("submit", function () { //trigger change on submit if any - if (valueOnFocus != getActiveBuffer().join('')) { - $el.change(); - } - }).bind('reset', function () { - setTimeout(function () { - $el.trigger("setvalue"); - }, 0); - }); - $el.bind("mouseenter.inputmask", function () { - var $input = $(this), input = this; - if (!$input.hasClass('focus.inputmask') && opts.showMaskOnHover) { - if (input._valueGet() != getActiveBuffer().join('')) { - writeBuffer(input, getActiveBuffer()); - } - } - }).bind("blur.inputmask", function () { - var $input = $(this), input = this, nptValue = input._valueGet(), buffer = getActiveBuffer(); - $input.removeClass('focus.inputmask'); - if (valueOnFocus != getActiveBuffer().join('')) { - $input.change(); - } - if (opts.clearMaskOnLostFocus && nptValue != '') { - if (nptValue == getActiveBufferTemplate().join('')) - input._valueSet(''); - else { //clearout optional tail of the mask - clearOptionalTail(input); - } - } - if (isComplete(buffer) === false) { - $input.trigger("incomplete"); - if (opts.clearIncomplete) { - $.each(masksets, function (ndx, ms) { - if (typeof (ms) == "object") { - ms["buffer"] = ms["_buffer"].slice(); - ms["lastValidPosition"] = -1; - } - }); - activeMasksetIndex = 0; - if (opts.clearMaskOnLostFocus) - input._valueSet(''); - else { - buffer = getActiveBufferTemplate().slice(); - writeBuffer(input, buffer); - } - } - } - }).bind("focus.inputmask", function () { - var $input = $(this), input = this, nptValue = input._valueGet(); - if (opts.showMaskOnFocus && !$input.hasClass('focus.inputmask') && (!opts.showMaskOnHover || (opts.showMaskOnHover && nptValue == ''))) { - if (input._valueGet() != getActiveBuffer().join('')) { - writeBuffer(input, getActiveBuffer(), seekNext(getActiveMaskSet()["lastValidPosition"])); - } - } - $input.addClass('focus.inputmask'); - valueOnFocus = getActiveBuffer().join(''); - }).bind("mouseleave.inputmask", function () { - var $input = $(this), input = this; - if (opts.clearMaskOnLostFocus) { - if (!$input.hasClass('focus.inputmask') && input._valueGet() != $input.attr("placeholder")) { - if (input._valueGet() == getActiveBufferTemplate().join('') || input._valueGet() == '') - input._valueSet(''); - else { //clearout optional tail of the mask - clearOptionalTail(input); - } - } - } - }).bind("click.inputmask", function () { - var input = this; - setTimeout(function () { - var selectedCaret = caret(input), buffer = getActiveBuffer(); - if (selectedCaret.begin == selectedCaret.end) { - var clickPosition = isRTL ? TranslatePosition(selectedCaret.begin) : selectedCaret.begin, - lvp = getActiveMaskSet()["lastValidPosition"], - lastPosition; - if (opts.isNumeric) { - lastPosition = opts.skipRadixDance === false && opts.radixPoint != "" && $.inArray(opts.radixPoint, buffer) != -1 ? - (opts.numericInput ? seekNext($.inArray(opts.radixPoint, buffer)) : $.inArray(opts.radixPoint, buffer)) : - seekNext(lvp); - } else { - lastPosition = seekNext(lvp); - } - if (clickPosition < lastPosition) { - if (isMask(clickPosition)) - caret(input, clickPosition); - else caret(input, seekNext(clickPosition)); - } else - caret(input, lastPosition); - } - }, 0); - }).bind('dblclick.inputmask', function () { - var input = this; - setTimeout(function () { - caret(input, 0, seekNext(getActiveMaskSet()["lastValidPosition"])); - }, 0); - }).bind(pasteEvent + ".inputmask dragdrop.inputmask drop.inputmask", function (e) { - if (skipInputEvent === true) { - skipInputEvent = false; - return true; - } - var input = this, $input = $(input); - - //paste event for IE8 and lower I guess ;-) - if (e.type == "propertychange" && input._valueGet().length <= getMaskLength()) { - return true; - } - setTimeout(function () { - var pasteValue = opts.onBeforePaste != undefined ? opts.onBeforePaste.call(this, input._valueGet()) : input._valueGet(); - checkVal(input, true, false, pasteValue.split(''), true); - if (isComplete(getActiveBuffer()) === true) - $input.trigger("complete"); - $input.click(); - }, 0); - }).bind('setvalue.inputmask', function () { - var input = this; - checkVal(input, true); - valueOnFocus = getActiveBuffer().join(''); - if (input._valueGet() == getActiveBufferTemplate().join('')) - input._valueSet(''); - }).bind('complete.inputmask', opts.oncomplete - ).bind('incomplete.inputmask', opts.onincomplete - ).bind('cleared.inputmask', opts.oncleared - ).bind("keyup.inputmask", keyupEvent); - - if (androidchrome) { - $el.bind("input.inputmask", inputEvent); - } else { - $el.bind("keydown.inputmask", keydownEvent - ).bind("keypress.inputmask", keypressEvent); - } - - if (msie10) - $el.bind("input.inputmask", inputEvent); - - //apply mask - checkVal(el, true, false); - valueOnFocus = getActiveBuffer().join(''); - // Wrap document.activeElement in a try/catch block since IE9 throw "Unspecified error" if document.activeElement is undefined when we are in an IFrame. - var activeElement; - try { - activeElement = document.activeElement; - } catch (e) { - } - if (activeElement === el) { //position the caret when in focus - $el.addClass('focus.inputmask'); - caret(el, seekNext(getActiveMaskSet()["lastValidPosition"])); - } else if (opts.clearMaskOnLostFocus) { - if (getActiveBuffer().join('') == getActiveBufferTemplate().join('')) { - el._valueSet(''); - } else { - clearOptionalTail(el); - } - } else { - writeBuffer(el, getActiveBuffer()); - } - - installEventRuler(el); - } - } - - //action object - if (actionObj != undefined) { - switch (actionObj["action"]) { - case "isComplete": - return isComplete(actionObj["buffer"]); - case "unmaskedvalue": - isRTL = actionObj["$input"].data('_inputmask')['isRTL']; - return unmaskedvalue(actionObj["$input"], actionObj["skipDatepickerCheck"]); - case "mask": - mask(actionObj["el"]); - break; - case "format": - $el = $({}); - $el.data('_inputmask', { - 'masksets': masksets, - 'activeMasksetIndex': activeMasksetIndex, - 'opts': opts, - 'isRTL': opts.numericInput - }); - if (opts.numericInput) { - opts.isNumeric = opts.numericInput; - isRTL = true; - } - - checkVal($el, false, false, actionObj["value"].split(''), true); - return getActiveBuffer().join(''); - } - } - } - $.inputmask = { - //options default - defaults: { - placeholder: "_", - optionalmarker: { start: "[", end: "]" }, - quantifiermarker: { start: "{", end: "}" }, - groupmarker: { start: "(", end: ")" }, - escapeChar: "\\", - mask: null, - oncomplete: $.noop, //executes when the mask is complete - onincomplete: $.noop, //executes when the mask is incomplete and focus is lost - oncleared: $.noop, //executes when the mask is cleared - repeat: 0, //repetitions of the mask: * ~ forever, otherwise specify an integer - greedy: true, //true: allocated buffer for the mask and repetitions - false: allocate only if needed - autoUnmask: false, //automatically unmask when retrieving the value with $.fn.val or value if the browser supports __lookupGetter__ or getOwnPropertyDescriptor - clearMaskOnLostFocus: true, - insertMode: true, //insert the input or overwrite the input - clearIncomplete: false, //clear the incomplete input on blur - aliases: {}, //aliases definitions => see jquery.inputmask.extensions.js - onKeyUp: $.noop, //override to implement autocomplete on certain keys for example - onKeyDown: $.noop, //override to implement autocomplete on certain keys for example - onBeforePaste: undefined, //executes before masking the pasted value to allow preprocessing of the pasted value. args => pastedValue => return processedValue - onUnMask: undefined, //executes after unmasking to allow postprocessing of the unmaskedvalue. args => maskedValue, unmaskedValue - showMaskOnFocus: true, //show the mask-placeholder when the input has focus - showMaskOnHover: true, //show the mask-placeholder when hovering the empty input - onKeyValidation: $.noop, //executes on every key-press with the result of isValid. Params: result, opts - skipOptionalPartCharacter: " ", //a character which can be used to skip an optional part of a mask - showTooltip: false, //show the activemask as tooltip - numericInput: false, //numericInput input direction style (input shifts to the left while holding the caret position) - //numeric basic properties - isNumeric: false, //enable numeric features - radixPoint: "", //".", // | "," - skipRadixDance: false, //disable radixpoint caret positioning - rightAlignNumerics: true, //align numerics to the right - //numeric basic properties - definitions: { - '9': { - validator: "[0-9]", - cardinality: 1 - }, - 'a': { - validator: "[A-Za-z\u0410-\u044F\u0401\u0451]", - cardinality: 1 - }, - '*': { - validator: "[A-Za-z\u0410-\u044F\u0401\u04510-9]", - cardinality: 1 - } - }, - keyCode: { - ALT: 18, BACKSPACE: 8, CAPS_LOCK: 20, COMMA: 188, COMMAND: 91, COMMAND_LEFT: 91, COMMAND_RIGHT: 93, CONTROL: 17, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, INSERT: 45, LEFT: 37, MENU: 93, NUMPAD_ADD: 107, NUMPAD_DECIMAL: 110, NUMPAD_DIVIDE: 111, NUMPAD_ENTER: 108, - NUMPAD_MULTIPLY: 106, NUMPAD_SUBTRACT: 109, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SHIFT: 16, SPACE: 32, TAB: 9, UP: 38, WINDOWS: 91 - }, - //specify keycodes which should not be considered in the keypress event, otherwise the preventDefault will stop their default behavior especially in FF - ignorables: [8, 9, 13, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123], - getMaskLength: function (buffer, greedy, repeat, currentBuffer, opts) { - var calculatedLength = buffer.length; - if (!greedy) { - if (repeat == "*") { - calculatedLength = currentBuffer.length + 1; - } else if (repeat > 1) { - calculatedLength += (buffer.length * (repeat - 1)); - } - } - return calculatedLength; - } - }, - escapeRegex: function (str) { - var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\']; - return str.replace(new RegExp('(\\' + specials.join('|\\') + ')', 'gim'), '\\$1'); - }, - format: function (value, options) { - var opts = $.extend(true, {}, $.inputmask.defaults, options); - resolveAlias(opts.alias, options, opts); - return maskScope(generateMaskSets(opts), 0, opts, { "action": "format", "value": value }); - } - }; - - $.fn.inputmask = function (fn, options) { - var opts = $.extend(true, {}, $.inputmask.defaults, options), - masksets, - activeMasksetIndex = 0; - - if (typeof fn === "string") { - switch (fn) { - case "mask": - //resolve possible aliases given by options - resolveAlias(opts.alias, options, opts); - masksets = generateMaskSets(opts); - if (masksets.length == 0) { return this; } - - return this.each(function () { - maskScope($.extend(true, {}, masksets), 0, opts, { "action": "mask", "el": this }); - }); - case "unmaskedvalue": - var $input = $(this), input = this; - if ($input.data('_inputmask')) { - masksets = $input.data('_inputmask')['masksets']; - activeMasksetIndex = $input.data('_inputmask')['activeMasksetIndex']; - opts = $input.data('_inputmask')['opts']; - return maskScope(masksets, activeMasksetIndex, opts, { "action": "unmaskedvalue", "$input": $input }); - } else return $input.val(); - case "remove": - return this.each(function () { - var $input = $(this), input = this; - if ($input.data('_inputmask')) { - masksets = $input.data('_inputmask')['masksets']; - activeMasksetIndex = $input.data('_inputmask')['activeMasksetIndex']; - opts = $input.data('_inputmask')['opts']; - //writeout the unmaskedvalue - input._valueSet(maskScope(masksets, activeMasksetIndex, opts, { "action": "unmaskedvalue", "$input": $input, "skipDatepickerCheck": true })); - //clear data - $input.removeData('_inputmask'); - //unbind all events - $input.unbind(".inputmask"); - $input.removeClass('focus.inputmask'); - //restore the value property - var valueProperty; - if (Object.getOwnPropertyDescriptor) - valueProperty = Object.getOwnPropertyDescriptor(input, "value"); - if (valueProperty && valueProperty.get) { - if (input._valueGet) { - Object.defineProperty(input, "value", { - get: input._valueGet, - set: input._valueSet - }); - } - } else if (document.__lookupGetter__ && input.__lookupGetter__("value")) { - if (input._valueGet) { - input.__defineGetter__("value", input._valueGet); - input.__defineSetter__("value", input._valueSet); - } - } - try { //try catch needed for IE7 as it does not supports deleting fns - delete input._valueGet; - delete input._valueSet; - } catch (e) { - input._valueGet = undefined; - input._valueSet = undefined; - - } - } - }); - break; - case "getemptymask": //return the default (empty) mask value, usefull for setting the default value in validation - if (this.data('_inputmask')) { - masksets = this.data('_inputmask')['masksets']; - activeMasksetIndex = this.data('_inputmask')['activeMasksetIndex']; - return masksets[activeMasksetIndex]['_buffer'].join(''); - } - else return ""; - case "hasMaskedValue": //check wheter the returned value is masked or not; currently only works reliable when using jquery.val fn to retrieve the value - return this.data('_inputmask') ? !this.data('_inputmask')['opts'].autoUnmask : false; - case "isComplete": - masksets = this.data('_inputmask')['masksets']; - activeMasksetIndex = this.data('_inputmask')['activeMasksetIndex']; - opts = this.data('_inputmask')['opts']; - return maskScope(masksets, activeMasksetIndex, opts, { "action": "isComplete", "buffer": this[0]._valueGet().split('') }); - case "getmetadata": //return mask metadata if exists - if (this.data('_inputmask')) { - masksets = this.data('_inputmask')['masksets']; - activeMasksetIndex = this.data('_inputmask')['activeMasksetIndex']; - return masksets[activeMasksetIndex]['metadata']; - } - else return undefined; - default: - //check if the fn is an alias - if (!resolveAlias(fn, options, opts)) { - //maybe fn is a mask so we try - //set mask - opts.mask = fn; - } - masksets = generateMaskSets(opts); - if (masksets.length == 0) { return this; } - return this.each(function () { - maskScope($.extend(true, {}, masksets), activeMasksetIndex, opts, { "action": "mask", "el": this }); - }); - - break; - } - } else if (typeof fn == "object") { - opts = $.extend(true, {}, $.inputmask.defaults, fn); - - resolveAlias(opts.alias, fn, opts); //resolve aliases - masksets = generateMaskSets(opts); - if (masksets.length == 0) { return this; } - return this.each(function () { - maskScope($.extend(true, {}, masksets), activeMasksetIndex, opts, { "action": "mask", "el": this }); - }); - } else if (fn == undefined) { - //look for data-inputmask atribute - the attribute should only contain optipns - return this.each(function () { - var attrOptions = $(this).attr("data-inputmask"); - if (attrOptions && attrOptions != "") { - try { - attrOptions = attrOptions.replace(new RegExp("'", "g"), '"'); - var dataoptions = $.parseJSON("{" + attrOptions + "}"); - $.extend(true, dataoptions, options); - opts = $.extend(true, {}, $.inputmask.defaults, dataoptions); - resolveAlias(opts.alias, dataoptions, opts); - opts.alias = undefined; - $(this).inputmask(opts); - } catch (ex) { } //need a more relax parseJSON - } - }); - } - }; - } -})(jQuery); diff --git a/settings.php b/settings.php index fca9a3cd..e2063097 100644 --- a/settings.php +++ b/settings.php @@ -400,7 +400,6 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "blocklists"
    From
    disabled>
    @@ -411,7 +410,6 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "blocklists"
    To
    disabled>
    @@ -425,7 +423,6 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "blocklists"
    Router
    disabled>
    @@ -464,7 +461,6 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "blocklists" disabled> @@ -856,7 +852,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "blocklists" when enabling DNSSEC. A DNSSEC resolver test can be found here.

    -

    If not configured as your DHCP server, Pi-hole won't able to +

    If not configured as your DHCP server, Pi-hole won't be able to determine the names of devices on your local network. As a result, tables such as Top Clients will only show IP addresses.

    One solution for this is to configure Pi-hole to forward these @@ -880,7 +876,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "blocklists"

    - value="">
    - - diff --git a/style/pi-hole.css b/style/pi-hole.css index d622e9bc..eec770c6 100644 --- a/style/pi-hole.css +++ b/style/pi-hole.css @@ -175,3 +175,13 @@ .float-left{ float:left; } + +.fa-paypal-icon { + width: 18px; + margin-left: 2px; +} + +.sidebar-toggle:before { + font-weight: 900; + font-family: "Font Awesome 5 Free"; +} diff --git a/style/vendor/font-awesome-4.5.0/css/font-awesome.min.css b/style/vendor/font-awesome-4.5.0/css/font-awesome.min.css deleted file mode 100644 index 1fcacfd3..00000000 --- a/style/vendor/font-awesome-4.5.0/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.5.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} .fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%} .fa-2x{font-size:2em} .fa-3x{font-size:3em} .fa-4x{font-size:4em} .fa-5x{font-size:5em} .fa-fw{width:1.28571429em;text-align:center} .fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none} .fa-ul>li{position:relative} .fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center} .fa-li.fa-lg{left:-1.85714286em} .fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em} .fa-pull-left{float:left} .fa-pull-right{float:right} .fa.fa-pull-left{margin-right:.3em} .fa.fa-pull-right{margin-left:.3em} .pull-right{float:right} .pull-left{float:left} .fa.pull-left{margin-right:.3em} .fa.pull-right{margin-left:.3em} .fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear} .fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)} @-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} @keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} .fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)} .fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)} .fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)} .fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)} .fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)} :root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none} .fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle} .fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center} .fa-stack-1x{line-height:inherit} .fa-stack-2x{font-size:2em} .fa-inverse{color:#fff} .fa-glass:before{content:"\f000"} .fa-music:before{content:"\f001"} .fa-search:before{content:"\f002"} .fa-envelope-o:before{content:"\f003"} .fa-heart:before{content:"\f004"} .fa-star:before{content:"\f005"} .fa-star-o:before{content:"\f006"} .fa-user:before{content:"\f007"} .fa-film:before{content:"\f008"} .fa-th-large:before{content:"\f009"} .fa-th:before{content:"\f00a"} .fa-th-list:before{content:"\f00b"} .fa-check:before{content:"\f00c"} .fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"} .fa-search-plus:before{content:"\f00e"} .fa-search-minus:before{content:"\f010"} .fa-power-off:before{content:"\f011"} .fa-signal:before{content:"\f012"} .fa-gear:before,.fa-cog:before{content:"\f013"} .fa-trash-o:before{content:"\f014"} .fa-home:before{content:"\f015"} .fa-file-o:before{content:"\f016"} .fa-clock-o:before{content:"\f017"} .fa-road:before{content:"\f018"} .fa-download:before{content:"\f019"} .fa-arrow-circle-o-down:before{content:"\f01a"} .fa-arrow-circle-o-up:before{content:"\f01b"} .fa-inbox:before{content:"\f01c"} .fa-play-circle-o:before{content:"\f01d"} .fa-rotate-right:before,.fa-repeat:before{content:"\f01e"} .fa-refresh:before{content:"\f021"} .fa-list-alt:before{content:"\f022"} .fa-lock:before{content:"\f023"} .fa-flag:before{content:"\f024"} .fa-headphones:before{content:"\f025"} .fa-volume-off:before{content:"\f026"} .fa-volume-down:before{content:"\f027"} .fa-volume-up:before{content:"\f028"} .fa-qrcode:before{content:"\f029"} .fa-barcode:before{content:"\f02a"} .fa-tag:before{content:"\f02b"} .fa-tags:before{content:"\f02c"} .fa-book:before{content:"\f02d"} .fa-bookmark:before{content:"\f02e"} .fa-print:before{content:"\f02f"} .fa-camera:before{content:"\f030"} .fa-font:before{content:"\f031"} .fa-bold:before{content:"\f032"} .fa-italic:before{content:"\f033"} .fa-text-height:before{content:"\f034"} .fa-text-width:before{content:"\f035"} .fa-align-left:before{content:"\f036"} .fa-align-center:before{content:"\f037"} .fa-align-right:before{content:"\f038"} .fa-align-justify:before{content:"\f039"} .fa-list:before{content:"\f03a"} .fa-dedent:before,.fa-outdent:before{content:"\f03b"} .fa-indent:before{content:"\f03c"} .fa-video-camera:before{content:"\f03d"} .fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"} .fa-pencil:before{content:"\f040"} .fa-map-marker:before{content:"\f041"} .fa-adjust:before{content:"\f042"} .fa-tint:before{content:"\f043"} .fa-edit:before,.fa-pencil-square-o:before{content:"\f044"} .fa-share-square-o:before{content:"\f045"} .fa-check-square-o:before{content:"\f046"} .fa-arrows:before{content:"\f047"} .fa-step-backward:before{content:"\f048"} .fa-fast-backward:before{content:"\f049"} .fa-backward:before{content:"\f04a"} .fa-play:before{content:"\f04b"} .fa-pause:before{content:"\f04c"} .fa-stop:before{content:"\f04d"} .fa-forward:before{content:"\f04e"} .fa-fast-forward:before{content:"\f050"} .fa-step-forward:before{content:"\f051"} .fa-eject:before{content:"\f052"} .fa-chevron-left:before{content:"\f053"} .fa-chevron-right:before{content:"\f054"} .fa-plus-circle:before{content:"\f055"} .fa-minus-circle:before{content:"\f056"} .fa-times-circle:before{content:"\f057"} .fa-check-circle:before{content:"\f058"} .fa-question-circle:before{content:"\f059"} .fa-info-circle:before{content:"\f05a"} .fa-crosshairs:before{content:"\f05b"} .fa-times-circle-o:before{content:"\f05c"} .fa-check-circle-o:before{content:"\f05d"} .fa-ban:before{content:"\f05e"} .fa-arrow-left:before{content:"\f060"} .fa-arrow-right:before{content:"\f061"} .fa-arrow-up:before{content:"\f062"} .fa-arrow-down:before{content:"\f063"} .fa-mail-forward:before,.fa-share:before{content:"\f064"} .fa-expand:before{content:"\f065"} .fa-compress:before{content:"\f066"} .fa-plus:before{content:"\f067"} .fa-minus:before{content:"\f068"} .fa-asterisk:before{content:"\f069"} .fa-exclamation-circle:before{content:"\f06a"} .fa-gift:before{content:"\f06b"} .fa-leaf:before{content:"\f06c"} .fa-fire:before{content:"\f06d"} .fa-eye:before{content:"\f06e"} .fa-eye-slash:before{content:"\f070"} .fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"} .fa-plane:before{content:"\f072"} .fa-calendar:before{content:"\f073"} .fa-random:before{content:"\f074"} .fa-comment:before{content:"\f075"} .fa-magnet:before{content:"\f076"} .fa-chevron-up:before{content:"\f077"} .fa-chevron-down:before{content:"\f078"} .fa-retweet:before{content:"\f079"} .fa-shopping-cart:before{content:"\f07a"} .fa-folder:before{content:"\f07b"} .fa-folder-open:before{content:"\f07c"} .fa-arrows-v:before{content:"\f07d"} .fa-arrows-h:before{content:"\f07e"} .fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"} .fa-twitter-square:before{content:"\f081"} .fa-facebook-square:before{content:"\f082"} .fa-camera-retro:before{content:"\f083"} .fa-key:before{content:"\f084"} .fa-gears:before,.fa-cogs:before{content:"\f085"} .fa-comments:before{content:"\f086"} .fa-thumbs-o-up:before{content:"\f087"} .fa-thumbs-o-down:before{content:"\f088"} .fa-star-half:before{content:"\f089"} .fa-heart-o:before{content:"\f08a"} .fa-sign-out:before{content:"\f08b"} .fa-linkedin-square:before{content:"\f08c"} .fa-thumb-tack:before{content:"\f08d"} .fa-external-link:before{content:"\f08e"} .fa-sign-in:before{content:"\f090"} .fa-trophy:before{content:"\f091"} .fa-github-square:before{content:"\f092"} .fa-upload:before{content:"\f093"} .fa-lemon-o:before{content:"\f094"} .fa-phone:before{content:"\f095"} .fa-square-o:before{content:"\f096"} .fa-bookmark-o:before{content:"\f097"} .fa-phone-square:before{content:"\f098"} .fa-twitter:before{content:"\f099"} .fa-facebook-f:before,.fa-facebook:before{content:"\f09a"} .fa-github:before{content:"\f09b"} .fa-unlock:before{content:"\f09c"} .fa-credit-card:before{content:"\f09d"} .fa-feed:before,.fa-rss:before{content:"\f09e"} .fa-hdd-o:before{content:"\f0a0"} .fa-bullhorn:before{content:"\f0a1"} .fa-bell:before{content:"\f0f3"} .fa-certificate:before{content:"\f0a3"} .fa-hand-o-right:before{content:"\f0a4"} .fa-hand-o-left:before{content:"\f0a5"} .fa-hand-o-up:before{content:"\f0a6"} .fa-hand-o-down:before{content:"\f0a7"} .fa-arrow-circle-left:before{content:"\f0a8"} .fa-arrow-circle-right:before{content:"\f0a9"} .fa-arrow-circle-up:before{content:"\f0aa"} .fa-arrow-circle-down:before{content:"\f0ab"} .fa-globe:before{content:"\f0ac"} .fa-wrench:before{content:"\f0ad"} .fa-tasks:before{content:"\f0ae"} .fa-filter:before{content:"\f0b0"} .fa-briefcase:before{content:"\f0b1"} .fa-arrows-alt:before{content:"\f0b2"} .fa-group:before,.fa-users:before{content:"\f0c0"} .fa-chain:before,.fa-link:before{content:"\f0c1"} .fa-cloud:before{content:"\f0c2"} .fa-flask:before{content:"\f0c3"} .fa-cut:before,.fa-scissors:before{content:"\f0c4"} .fa-copy:before,.fa-files-o:before{content:"\f0c5"} .fa-paperclip:before{content:"\f0c6"} .fa-save:before,.fa-floppy-o:before{content:"\f0c7"} .fa-square:before{content:"\f0c8"} .fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"} .fa-list-ul:before{content:"\f0ca"} .fa-list-ol:before{content:"\f0cb"} .fa-strikethrough:before{content:"\f0cc"} .fa-underline:before{content:"\f0cd"} .fa-table:before{content:"\f0ce"} .fa-magic:before{content:"\f0d0"} .fa-truck:before{content:"\f0d1"} .fa-pinterest:before{content:"\f0d2"} .fa-pinterest-square:before{content:"\f0d3"} .fa-google-plus-square:before{content:"\f0d4"} .fa-google-plus:before{content:"\f0d5"} .fa-money:before{content:"\f0d6"} .fa-caret-down:before{content:"\f0d7"} .fa-caret-up:before{content:"\f0d8"} .fa-caret-left:before{content:"\f0d9"} .fa-caret-right:before{content:"\f0da"} .fa-columns:before{content:"\f0db"} .fa-unsorted:before,.fa-sort:before{content:"\f0dc"} .fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"} .fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"} .fa-envelope:before{content:"\f0e0"} .fa-linkedin:before{content:"\f0e1"} .fa-rotate-left:before,.fa-undo:before{content:"\f0e2"} .fa-legal:before,.fa-gavel:before{content:"\f0e3"} .fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"} .fa-comment-o:before{content:"\f0e5"} .fa-comments-o:before{content:"\f0e6"} .fa-flash:before,.fa-bolt:before{content:"\f0e7"} .fa-sitemap:before{content:"\f0e8"} .fa-umbrella:before{content:"\f0e9"} .fa-paste:before,.fa-clipboard:before{content:"\f0ea"} .fa-lightbulb-o:before{content:"\f0eb"} .fa-exchange:before{content:"\f0ec"} .fa-cloud-download:before{content:"\f0ed"} .fa-cloud-upload:before{content:"\f0ee"} .fa-user-md:before{content:"\f0f0"} .fa-stethoscope:before{content:"\f0f1"} .fa-suitcase:before{content:"\f0f2"} .fa-bell-o:before{content:"\f0a2"} .fa-coffee:before{content:"\f0f4"} .fa-cutlery:before{content:"\f0f5"} .fa-file-text-o:before{content:"\f0f6"} .fa-building-o:before{content:"\f0f7"} .fa-hospital-o:before{content:"\f0f8"} .fa-ambulance:before{content:"\f0f9"} .fa-medkit:before{content:"\f0fa"} .fa-fighter-jet:before{content:"\f0fb"} .fa-beer:before{content:"\f0fc"} .fa-h-square:before{content:"\f0fd"} .fa-plus-square:before{content:"\f0fe"} .fa-angle-double-left:before{content:"\f100"} .fa-angle-double-right:before{content:"\f101"} .fa-angle-double-up:before{content:"\f102"} .fa-angle-double-down:before{content:"\f103"} .fa-angle-left:before{content:"\f104"} .fa-angle-right:before{content:"\f105"} .fa-angle-up:before{content:"\f106"} .fa-angle-down:before{content:"\f107"} .fa-desktop:before{content:"\f108"} .fa-laptop:before{content:"\f109"} .fa-tablet:before{content:"\f10a"} .fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"} .fa-circle-o:before{content:"\f10c"} .fa-quote-left:before{content:"\f10d"} .fa-quote-right:before{content:"\f10e"} .fa-spinner:before{content:"\f110"} .fa-circle:before{content:"\f111"} .fa-mail-reply:before,.fa-reply:before{content:"\f112"} .fa-github-alt:before{content:"\f113"} .fa-folder-o:before{content:"\f114"} .fa-folder-open-o:before{content:"\f115"} .fa-smile-o:before{content:"\f118"} .fa-frown-o:before{content:"\f119"} .fa-meh-o:before{content:"\f11a"} .fa-gamepad:before{content:"\f11b"} .fa-keyboard-o:before{content:"\f11c"} .fa-flag-o:before{content:"\f11d"} .fa-flag-checkered:before{content:"\f11e"} .fa-terminal:before{content:"\f120"} .fa-code:before{content:"\f121"} .fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"} .fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"} .fa-location-arrow:before{content:"\f124"} .fa-crop:before{content:"\f125"} .fa-code-fork:before{content:"\f126"} .fa-unlink:before,.fa-chain-broken:before{content:"\f127"} .fa-question:before{content:"\f128"} .fa-info:before{content:"\f129"} .fa-exclamation:before{content:"\f12a"} .fa-superscript:before{content:"\f12b"} .fa-subscript:before{content:"\f12c"} .fa-eraser:before{content:"\f12d"} .fa-puzzle-piece:before{content:"\f12e"} .fa-microphone:before{content:"\f130"} .fa-microphone-slash:before{content:"\f131"} .fa-shield:before{content:"\f132"} .fa-calendar-o:before{content:"\f133"} .fa-fire-extinguisher:before{content:"\f134"} .fa-rocket:before{content:"\f135"} .fa-maxcdn:before{content:"\f136"} .fa-chevron-circle-left:before{content:"\f137"} .fa-chevron-circle-right:before{content:"\f138"} .fa-chevron-circle-up:before{content:"\f139"} .fa-chevron-circle-down:before{content:"\f13a"} .fa-html5:before{content:"\f13b"} .fa-css3:before{content:"\f13c"} .fa-anchor:before{content:"\f13d"} .fa-unlock-alt:before{content:"\f13e"} .fa-bullseye:before{content:"\f140"} .fa-ellipsis-h:before{content:"\f141"} .fa-ellipsis-v:before{content:"\f142"} .fa-rss-square:before{content:"\f143"} .fa-play-circle:before{content:"\f144"} .fa-ticket:before{content:"\f145"} .fa-minus-square:before{content:"\f146"} .fa-minus-square-o:before{content:"\f147"} .fa-level-up:before{content:"\f148"} .fa-level-down:before{content:"\f149"} .fa-check-square:before{content:"\f14a"} .fa-pencil-square:before{content:"\f14b"} .fa-external-link-square:before{content:"\f14c"} .fa-share-square:before{content:"\f14d"} .fa-compass:before{content:"\f14e"} .fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"} .fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"} .fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"} .fa-euro:before,.fa-eur:before{content:"\f153"} .fa-gbp:before{content:"\f154"} .fa-dollar:before,.fa-usd:before{content:"\f155"} .fa-rupee:before,.fa-inr:before{content:"\f156"} .fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"} .fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"} .fa-won:before,.fa-krw:before{content:"\f159"} .fa-bitcoin:before,.fa-btc:before{content:"\f15a"} .fa-file:before{content:"\f15b"} .fa-file-text:before{content:"\f15c"} .fa-sort-alpha-asc:before{content:"\f15d"} .fa-sort-alpha-desc:before{content:"\f15e"} .fa-sort-amount-asc:before{content:"\f160"} .fa-sort-amount-desc:before{content:"\f161"} .fa-sort-numeric-asc:before{content:"\f162"} .fa-sort-numeric-desc:before{content:"\f163"} .fa-thumbs-up:before{content:"\f164"} .fa-thumbs-down:before{content:"\f165"} .fa-youtube-square:before{content:"\f166"} .fa-youtube:before{content:"\f167"} .fa-xing:before{content:"\f168"} .fa-xing-square:before{content:"\f169"} .fa-youtube-play:before{content:"\f16a"} .fa-dropbox:before{content:"\f16b"} .fa-stack-overflow:before{content:"\f16c"} .fa-instagram:before{content:"\f16d"} .fa-flickr:before{content:"\f16e"} .fa-adn:before{content:"\f170"} .fa-bitbucket:before{content:"\f171"} .fa-bitbucket-square:before{content:"\f172"} .fa-tumblr:before{content:"\f173"} .fa-tumblr-square:before{content:"\f174"} .fa-long-arrow-down:before{content:"\f175"} .fa-long-arrow-up:before{content:"\f176"} .fa-long-arrow-left:before{content:"\f177"} .fa-long-arrow-right:before{content:"\f178"} .fa-apple:before{content:"\f179"} .fa-windows:before{content:"\f17a"} .fa-android:before{content:"\f17b"} .fa-linux:before{content:"\f17c"} .fa-dribbble:before{content:"\f17d"} .fa-skype:before{content:"\f17e"} .fa-foursquare:before{content:"\f180"} .fa-trello:before{content:"\f181"} .fa-female:before{content:"\f182"} .fa-male:before{content:"\f183"} .fa-gittip:before,.fa-gratipay:before{content:"\f184"} .fa-sun-o:before{content:"\f185"} .fa-moon-o:before{content:"\f186"} .fa-archive:before{content:"\f187"} .fa-bug:before{content:"\f188"} .fa-vk:before{content:"\f189"} .fa-weibo:before{content:"\f18a"} .fa-renren:before{content:"\f18b"} .fa-pagelines:before{content:"\f18c"} .fa-stack-exchange:before{content:"\f18d"} .fa-arrow-circle-o-right:before{content:"\f18e"} .fa-arrow-circle-o-left:before{content:"\f190"} .fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"} .fa-dot-circle-o:before{content:"\f192"} .fa-wheelchair:before{content:"\f193"} .fa-vimeo-square:before{content:"\f194"} .fa-turkish-lira:before,.fa-try:before{content:"\f195"} .fa-plus-square-o:before{content:"\f196"} .fa-space-shuttle:before{content:"\f197"} .fa-slack:before{content:"\f198"} .fa-envelope-square:before{content:"\f199"} .fa-wordpress:before{content:"\f19a"} .fa-openid:before{content:"\f19b"} .fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"} .fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"} .fa-yahoo:before{content:"\f19e"} .fa-google:before{content:"\f1a0"} .fa-reddit:before{content:"\f1a1"} .fa-reddit-square:before{content:"\f1a2"} .fa-stumbleupon-circle:before{content:"\f1a3"} .fa-stumbleupon:before{content:"\f1a4"} .fa-delicious:before{content:"\f1a5"} .fa-digg:before{content:"\f1a6"} .fa-pied-piper:before{content:"\f1a7"} .fa-pied-piper-alt:before{content:"\f1a8"} .fa-drupal:before{content:"\f1a9"} .fa-joomla:before{content:"\f1aa"} .fa-language:before{content:"\f1ab"} .fa-fax:before{content:"\f1ac"} .fa-building:before{content:"\f1ad"} .fa-child:before{content:"\f1ae"} .fa-paw:before{content:"\f1b0"} .fa-spoon:before{content:"\f1b1"} .fa-cube:before{content:"\f1b2"} .fa-cubes:before{content:"\f1b3"} .fa-behance:before{content:"\f1b4"} .fa-behance-square:before{content:"\f1b5"} .fa-steam:before{content:"\f1b6"} .fa-steam-square:before{content:"\f1b7"} .fa-recycle:before{content:"\f1b8"} .fa-automobile:before,.fa-car:before{content:"\f1b9"} .fa-cab:before,.fa-taxi:before{content:"\f1ba"} .fa-tree:before{content:"\f1bb"} .fa-spotify:before{content:"\f1bc"} .fa-deviantart:before{content:"\f1bd"} .fa-soundcloud:before{content:"\f1be"} .fa-database:before{content:"\f1c0"} .fa-file-pdf-o:before{content:"\f1c1"} .fa-file-word-o:before{content:"\f1c2"} .fa-file-excel-o:before{content:"\f1c3"} .fa-file-powerpoint-o:before{content:"\f1c4"} .fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"} .fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"} .fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"} .fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"} .fa-file-code-o:before{content:"\f1c9"} .fa-vine:before{content:"\f1ca"} .fa-codepen:before{content:"\f1cb"} .fa-jsfiddle:before{content:"\f1cc"} .fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"} .fa-circle-o-notch:before{content:"\f1ce"} .fa-ra:before,.fa-rebel:before{content:"\f1d0"} .fa-ge:before,.fa-empire:before{content:"\f1d1"} .fa-git-square:before{content:"\f1d2"} .fa-git:before{content:"\f1d3"} .fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"} .fa-tencent-weibo:before{content:"\f1d5"} .fa-qq:before{content:"\f1d6"} .fa-wechat:before,.fa-weixin:before{content:"\f1d7"} .fa-send:before,.fa-paper-plane:before{content:"\f1d8"} .fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"} .fa-history:before{content:"\f1da"} .fa-circle-thin:before{content:"\f1db"} .fa-header:before{content:"\f1dc"} .fa-paragraph:before{content:"\f1dd"} .fa-sliders:before{content:"\f1de"} .fa-share-alt:before{content:"\f1e0"} .fa-share-alt-square:before{content:"\f1e1"} .fa-bomb:before{content:"\f1e2"} .fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"} .fa-tty:before{content:"\f1e4"} .fa-binoculars:before{content:"\f1e5"} .fa-plug:before{content:"\f1e6"} .fa-slideshare:before{content:"\f1e7"} .fa-twitch:before{content:"\f1e8"} .fa-yelp:before{content:"\f1e9"} .fa-newspaper-o:before{content:"\f1ea"} .fa-wifi:before{content:"\f1eb"} .fa-calculator:before{content:"\f1ec"} .fa-paypal:before{content:"\f1ed"} .fa-google-wallet:before{content:"\f1ee"} .fa-cc-visa:before{content:"\f1f0"} .fa-cc-mastercard:before{content:"\f1f1"} .fa-cc-discover:before{content:"\f1f2"} .fa-cc-amex:before{content:"\f1f3"} .fa-cc-paypal:before{content:"\f1f4"} .fa-cc-stripe:before{content:"\f1f5"} .fa-bell-slash:before{content:"\f1f6"} .fa-bell-slash-o:before{content:"\f1f7"} .fa-trash:before{content:"\f1f8"} .fa-copyright:before{content:"\f1f9"} .fa-at:before{content:"\f1fa"} .fa-eyedropper:before{content:"\f1fb"} .fa-paint-brush:before{content:"\f1fc"} .fa-birthday-cake:before{content:"\f1fd"} .fa-area-chart:before{content:"\f1fe"} .fa-pie-chart:before{content:"\f200"} .fa-line-chart:before{content:"\f201"} .fa-lastfm:before{content:"\f202"} .fa-lastfm-square:before{content:"\f203"} .fa-toggle-off:before{content:"\f204"} .fa-toggle-on:before{content:"\f205"} .fa-bicycle:before{content:"\f206"} .fa-bus:before{content:"\f207"} .fa-ioxhost:before{content:"\f208"} .fa-angellist:before{content:"\f209"} .fa-cc:before{content:"\f20a"} .fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"} .fa-meanpath:before{content:"\f20c"} .fa-buysellads:before{content:"\f20d"} .fa-connectdevelop:before{content:"\f20e"} .fa-dashcube:before{content:"\f210"} .fa-forumbee:before{content:"\f211"} .fa-leanpub:before{content:"\f212"} .fa-sellsy:before{content:"\f213"} .fa-shirtsinbulk:before{content:"\f214"} .fa-simplybuilt:before{content:"\f215"} .fa-skyatlas:before{content:"\f216"} .fa-cart-plus:before{content:"\f217"} .fa-cart-arrow-down:before{content:"\f218"} .fa-diamond:before{content:"\f219"} .fa-ship:before{content:"\f21a"} .fa-user-secret:before{content:"\f21b"} .fa-motorcycle:before{content:"\f21c"} .fa-street-view:before{content:"\f21d"} .fa-heartbeat:before{content:"\f21e"} .fa-venus:before{content:"\f221"} .fa-mars:before{content:"\f222"} .fa-mercury:before{content:"\f223"} .fa-intersex:before,.fa-transgender:before{content:"\f224"} .fa-transgender-alt:before{content:"\f225"} .fa-venus-double:before{content:"\f226"} .fa-mars-double:before{content:"\f227"} .fa-venus-mars:before{content:"\f228"} .fa-mars-stroke:before{content:"\f229"} .fa-mars-stroke-v:before{content:"\f22a"} .fa-mars-stroke-h:before{content:"\f22b"} .fa-neuter:before{content:"\f22c"} .fa-genderless:before{content:"\f22d"} .fa-facebook-official:before{content:"\f230"} .fa-pinterest-p:before{content:"\f231"} .fa-whatsapp:before{content:"\f232"} .fa-server:before{content:"\f233"} .fa-user-plus:before{content:"\f234"} .fa-user-times:before{content:"\f235"} .fa-hotel:before,.fa-bed:before{content:"\f236"} .fa-viacoin:before{content:"\f237"} .fa-train:before{content:"\f238"} .fa-subway:before{content:"\f239"} .fa-medium:before{content:"\f23a"} .fa-yc:before,.fa-y-combinator:before{content:"\f23b"} .fa-optin-monster:before{content:"\f23c"} .fa-opencart:before{content:"\f23d"} .fa-expeditedssl:before{content:"\f23e"} .fa-battery-4:before,.fa-battery-full:before{content:"\f240"} .fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"} .fa-battery-2:before,.fa-battery-half:before{content:"\f242"} .fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"} .fa-battery-0:before,.fa-battery-empty:before{content:"\f244"} .fa-mouse-pointer:before{content:"\f245"} .fa-i-cursor:before{content:"\f246"} .fa-object-group:before{content:"\f247"} .fa-object-ungroup:before{content:"\f248"} .fa-sticky-note:before{content:"\f249"} .fa-sticky-note-o:before{content:"\f24a"} .fa-cc-jcb:before{content:"\f24b"} .fa-cc-diners-club:before{content:"\f24c"} .fa-clone:before{content:"\f24d"} .fa-balance-scale:before{content:"\f24e"} .fa-hourglass-o:before{content:"\f250"} .fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"} .fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"} .fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"} .fa-hourglass:before{content:"\f254"} .fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"} .fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"} .fa-hand-scissors-o:before{content:"\f257"} .fa-hand-lizard-o:before{content:"\f258"} .fa-hand-spock-o:before{content:"\f259"} .fa-hand-pointer-o:before{content:"\f25a"} .fa-hand-peace-o:before{content:"\f25b"} .fa-trademark:before{content:"\f25c"} .fa-registered:before{content:"\f25d"} .fa-creative-commons:before{content:"\f25e"} .fa-gg:before{content:"\f260"} .fa-gg-circle:before{content:"\f261"} .fa-tripadvisor:before{content:"\f262"} .fa-odnoklassniki:before{content:"\f263"} .fa-odnoklassniki-square:before{content:"\f264"} .fa-get-pocket:before{content:"\f265"} .fa-wikipedia-w:before{content:"\f266"} .fa-safari:before{content:"\f267"} .fa-chrome:before{content:"\f268"} .fa-firefox:before{content:"\f269"} .fa-opera:before{content:"\f26a"} .fa-internet-explorer:before{content:"\f26b"} .fa-tv:before,.fa-television:before{content:"\f26c"} .fa-contao:before{content:"\f26d"} .fa-500px:before{content:"\f26e"} .fa-amazon:before{content:"\f270"} .fa-calendar-plus-o:before{content:"\f271"} .fa-calendar-minus-o:before{content:"\f272"} .fa-calendar-times-o:before{content:"\f273"} .fa-calendar-check-o:before{content:"\f274"} .fa-industry:before{content:"\f275"} .fa-map-pin:before{content:"\f276"} .fa-map-signs:before{content:"\f277"} .fa-map-o:before{content:"\f278"} .fa-map:before{content:"\f279"} .fa-commenting:before{content:"\f27a"} .fa-commenting-o:before{content:"\f27b"} .fa-houzz:before{content:"\f27c"} .fa-vimeo:before{content:"\f27d"} .fa-black-tie:before{content:"\f27e"} .fa-fonticons:before{content:"\f280"} .fa-reddit-alien:before{content:"\f281"} .fa-edge:before{content:"\f282"} .fa-credit-card-alt:before{content:"\f283"} .fa-codiepie:before{content:"\f284"} .fa-modx:before{content:"\f285"} .fa-fort-awesome:before{content:"\f286"} .fa-usb:before{content:"\f287"} .fa-product-hunt:before{content:"\f288"} .fa-mixcloud:before{content:"\f289"} .fa-scribd:before{content:"\f28a"} .fa-pause-circle:before{content:"\f28b"} .fa-pause-circle-o:before{content:"\f28c"} .fa-stop-circle:before{content:"\f28d"} .fa-stop-circle-o:before{content:"\f28e"} .fa-shopping-bag:before{content:"\f290"} .fa-shopping-basket:before{content:"\f291"} .fa-hashtag:before{content:"\f292"} .fa-bluetooth:before{content:"\f293"} .fa-bluetooth-b:before{content:"\f294"} .fa-percent:before{content:"\f295"} diff --git a/style/vendor/font-awesome-4.5.0/fonts/FontAwesome.otf b/style/vendor/font-awesome-4.5.0/fonts/FontAwesome.otf deleted file mode 100644 index 3ed7f8b4..00000000 Binary files a/style/vendor/font-awesome-4.5.0/fonts/FontAwesome.otf and /dev/null differ diff --git a/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.eot b/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.eot deleted file mode 100644 index 9b6afaed..00000000 Binary files a/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.svg b/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.svg deleted file mode 100644 index d05688e9..00000000 --- a/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,655 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf b/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 26dea795..00000000 Binary files a/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.woff b/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.woff deleted file mode 100644 index dc35ce3c..00000000 Binary files a/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.woff2 b/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 500e5172..00000000 Binary files a/style/vendor/font-awesome-4.5.0/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/style/vendor/font-awesome-5.6.3/css/all.min.css b/style/vendor/font-awesome-5.6.3/css/all.min.css new file mode 100644 index 00000000..de564737 --- /dev/null +++ b/style/vendor/font-awesome-5.6.3/css/all.min.css @@ -0,0 +1 @@ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.eot b/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.eot new file mode 100644 index 00000000..46aeb5f8 Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.eot differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.svg b/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.svg new file mode 100644 index 00000000..0469118e --- /dev/null +++ b/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.svg @@ -0,0 +1,1260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.ttf b/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.ttf new file mode 100644 index 00000000..0a307750 Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.ttf differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.woff b/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.woff new file mode 100644 index 00000000..bdab4ca8 Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.woff differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.woff2 b/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.woff2 new file mode 100644 index 00000000..0def871a Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-brands-400.woff2 differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.eot b/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.eot new file mode 100644 index 00000000..836e082a Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.eot differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.svg b/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.svg new file mode 100644 index 00000000..81576d25 --- /dev/null +++ b/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.svg @@ -0,0 +1,471 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.ttf b/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.ttf new file mode 100644 index 00000000..b5414de9 Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.ttf differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.woff b/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.woff new file mode 100644 index 00000000..56acb37d Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.woff differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.woff2 b/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.woff2 new file mode 100644 index 00000000..4c5168fd Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-regular-400.woff2 differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.eot b/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.eot new file mode 100644 index 00000000..18c554f4 Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.eot differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.svg b/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.svg new file mode 100644 index 00000000..7316c44f --- /dev/null +++ b/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.svg @@ -0,0 +1,2763 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.ttf b/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.ttf new file mode 100644 index 00000000..53c8f366 Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.ttf differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.woff b/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.woff new file mode 100644 index 00000000..4484e526 Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.woff differ diff --git a/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.woff2 b/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.woff2 new file mode 100644 index 00000000..f0b9b0cd Binary files /dev/null and b/style/vendor/font-awesome-5.6.3/webfonts/fa-solid-900.woff2 differ