summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2019-02-14 22:45:27 +0800
committerGravatar Chris Xiong <chirs241097@gmail.com> 2019-02-14 22:45:27 +0800
commit98c5434a32cc546937550726aebf3cbc1b1b6b9e (patch)
tree61cceb107483b8246c2dacd88c10045b1683a3d0 /libs
parent2702467eda7328115d827656e3804e063fe2341c (diff)
downloadweb-98c5434a32cc546937550726aebf3cbc1b1b6b9e.tar.xz
Pineapple Cloud Music.
Diffstat (limited to 'libs')
-rw-r--r--libs/music/pcm73
-rwxr-xr-xlibs/music/player.d/cgi-bin/pcm.cgi31
-rw-r--r--libs/music/player.d/pcm.js365
-rw-r--r--libs/music/player.d/w3.css384
4 files changed, 853 insertions, 0 deletions
diff --git a/libs/music/pcm b/libs/music/pcm
new file mode 100644
index 0000000..99185f4
--- /dev/null
+++ b/libs/music/pcm
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>Private Playlist</title>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="theme-color" content="#f44336">
+<link rel="stylesheet" href="/libs/music/player.d/w3.css">
+<style>
+ .w3-sidenav ul li {padding-left: 2px;}
+ #playlist li {word-break: break-all;}
+ .ellipsis {overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
+</style>
+
+<nav class="w3-sidenav w3-collapse w3-light-grey w3-animate-left w3-card-2" style="z-index: 3; width: 250px; display: none;" id="mySidenav">
+<header class="w3-container w3-dark-grey">
+ <h2>Albums <a href="javascript:void(0)" onclick="w3_close()" class="w3-right w3-xlarge w3-hide-large w3-closenav" title="close sidenav">×</a></h2>
+</header>
+<ul class="w3-ul" style="margin-bottom: 120px;" id="folderlist">
+</ul>
+</nav>
+<div class="w3-overlay w3-hide-large w3-animate-opacity" onclick="w3_close()" style="cursor: pointer; display: none;" id="myOverlay"></div>
+<div class="w3-main" style="margin-left:250px;">
+ <header class="w3-container w3-red w3-top">
+ <h2 class="ellipsis"><span class="w3-opennav w3-xlarge w3-left w3-hide-large" onclick="w3_open()" id="openNav">&#9776;</span>&nbsp;Pineapple Cloud Music</h2>
+ </header>
+ <header class="w3-container w3-yellow"><h2 class="ellipsis">You can't see me</h2></header>
+ <ul class="w3-ul w3-hoverable w3-pale-yellow" id="subfolderlist">
+ </ul>
+ <ul class="w3-ul w3-hoverable" style="margin-bottom: 120px;" id="playlist">
+ </ul>
+</div>
+<div class="w3-bottom" style="z-index: 6;">
+ <div class="w3-panel w3-brown">
+ <div class="w3-row">
+ <div class="w3-col s2 w3-container w3-left-align">
+ <p><span id="curTime">0:00</span></p>
+ </div>
+ <div class="w3-col s8 w3-container w3-center">
+ <p id="nowPlaying" class="ellipsis">Not playing at all.</p>
+ <audio></audio>
+ </div>
+ <div class="w3-col s2 w3-container w3-right-align">
+ <p><span id="totalTime">0:00</span></p>
+ </div>
+ </div>
+ <div class="w3-container">
+ <div id="progressbar" class="w3-progress-container">
+ <div id="bufferbar" class="w3-progressbar" style="background-color:#AAA; width:0%"></div>
+ <div id="timebar" class="w3-progressbar w3-blue" style="width:0%"></div>
+ </div>
+ </div>
+ <div class="w3-container w3-center" style="padding:6px 0px;">
+ <button class="w3-btn w3-tiny" id="btn-prev">&lt;&lt;</button>
+ <button class="w3-btn w3-tiny" id="btn-play">Play</button>
+ <button class="w3-btn w3-tiny" id="btn-next">&gt;&gt;</button>
+ <button class="w3-btn w3-tiny" id="btn-loop">Loop</button>
+ <button class="w3-btn w3-tiny" id="btn-order">Order</button>
+ </div>
+ </div>
+</div>
+
+<script src="/libs/music/player.d/pcm.js"></script>
+<script>
+function w3_open() {
+ document.getElementById("mySidenav").style.display = "block";
+ document.getElementById("myOverlay").style.display = "block";
+}
+function w3_close() {
+ document.getElementById("mySidenav").style.display = "none";
+ document.getElementById("myOverlay").style.display = "none";
+}
+</script>
+</html>
diff --git a/libs/music/player.d/cgi-bin/pcm.cgi b/libs/music/player.d/cgi-bin/pcm.cgi
new file mode 100755
index 0000000..65aa0a6
--- /dev/null
+++ b/libs/music/player.d/cgi-bin/pcm.cgi
@@ -0,0 +1,31 @@
+#!/usr/bin/python3
+import sys,os,cgi,json
+from urllib.parse import quote
+d=cgi.parse(fp=sys.stdin)
+
+print('Status: 200 OK',end='\r\n')
+print('Content-type: application/json',end='\r\n')
+print(end='\r\n')
+
+ro={'status':200,'message':'OK'}
+if 'folder' not in d or d['folder']=='':
+ plp=os.environ['DOCUMENT_ROOT']+'/libs/music/player.d/playlists/playlists'
+ alblist=list()
+ with open(plp,mode='r',encoding='utf-8') as f:
+ for line in f:
+ line=line.strip()
+ if len(line)>0:alblist.append(quote(line))
+ rro={'type':'fileList','data':{'subFolderList':alblist}}
+ ro['result']=rro
+ print(json.dumps(ro))
+else:
+ alp=os.environ['DOCUMENT_ROOT']+'/libs/music/player.d/playlists/'+d['folder'][0].strip('/')+'.playlist'
+ alblist=list()
+ with open(alp,mode='r',encoding='utf-8') as f:
+ for line in f:
+ line=line.strip()
+ if len(line)>0:
+ alblist.append({'fileName':quote(line),'fileSize':0,'modifiedTime':0})
+ rro={'type':'fileList','data':{'musicList':alblist[1:],'subFolderList':list()}}
+ ro['result']=rro
+ print(json.dumps(ro))
diff --git a/libs/music/player.d/pcm.js b/libs/music/player.d/pcm.js
new file mode 100644
index 0000000..575b7f7
--- /dev/null
+++ b/libs/music/player.d/pcm.js
@@ -0,0 +1,365 @@
+; // Private Cloud Music - player.js
+; // Licence: WTFPL
+; // BLumia - 2016/11/11
+; // szO Chris && 2jjy && jxpxxzj Orz
+; // ↑ Moe ↑ Moe ↑ Moe
+; // Modified to use on chrisoft.org by Chris Xiong
+; // szO BLumia Orz
+; // ↑ Moe
+// formatTime,getCookie by Chrissssss
+function formatTime(t) {
+ if(isNaN(t))return '--:--';
+ let m=Math.floor(t/60),s=Math.round(t-Math.floor(t/60)*60);
+ if(s<10)return `${m}:0${s}`;
+ else if(s==60)return `${m+1}:00`;
+ else return `${m}:${s}`;
+}
+function getCookie(key) {
+ if (!navigator.cookieEnabled) return "";
+ return document.cookie.replace(new RegExp('(?:(?:^|.*;\\s*)'+key+'\\s*\\=\\s*([^;]*).*$)|^.*$'),'$1');
+}
+function setCookie(cookieName, cookieValue, maxAge = 0) {
+ if (!navigator.cookieEnabled) return;
+ var cookieStr = cookieName + "=" + cookieValue;
+ if (maxAge > 0) cookieStr += ";max-age=" + maxAge;
+ document.cookie = cookieStr;
+}
+
+const PCMAPI_URL='/libs/music/player.d/cgi-bin/pcm.cgi';
+const AUDIO_URL='//filestorage.chrisoft.org/music/ogg/';
+
+(function() {
+ var Helper = function() {
+ this.el = null;
+ this.entry = function(selector) {
+ if (typeof selector == 'string') {
+ if (selector[0] == '<') {
+ var singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/;
+ if (singleTagRE.test(selector)) this.el = document.createElement(RegExp.$1);
+ } else {
+ this.el = document.getElementById(selector);
+ }
+ }
+ else this.el = selector;
+ return this;
+ }
+ }
+ Helper.prototype = {
+ css: function(property, value) {
+ if(this.el) this.el.style.cssText += ';' + property + ":" + value;
+ return this;
+ },
+ attr: function(property, value) {
+ if(this.el) this.el.setAttribute(property, value);
+ return this;
+ },
+ append: function(node) {
+ if(this.el) this.el.appendChild(node);
+ return this;
+ },
+ text: function(content) {
+ if(this.el) this.el.textContent = content;
+ return this;
+ },
+ click: function(handler) {
+ if(!this.el) return this;
+ if (typeof(handler) == "function") this.el.onclick = handler;
+ else this.el.click();
+ return this;
+ },
+ innerHTML: function(text) {
+ if(this.el) this.el.innerHTML = text;
+ return this;
+ }
+ }
+ var H = function(selector) {
+ var f = new Helper();
+ return f.entry(selector);
+ }
+ var Player = {
+ path: null, // sample: 'Test/'
+ data: null,
+ audio: document.getElementsByTagName('audio')[0],
+ currentIndex: -1,
+ loop: 0,
+ order: 0,
+ playlist: H("playlist").el,
+ folderlist: H("folderlist").el,
+ nowPlaying: H("nowPlaying").el,
+
+ updateMetadata: function() {
+ if ('mediaSession' in navigator) {
+ window.navigator.mediaSession.metadata = new MediaMetadata({
+ title: nowPlaying.innerHTML,
+ album: decodeURIComponent(this.path)
+ });
+ }
+ },
+
+ playAtIndex: function(i) {
+ // FIXME: trigger this when audio doesn't finished load will cause play promise error.
+ this.audio.pause();
+ this.currentIndex = i;
+ this.audio.src = AUDIO_URL + this.data[i].fileName + '.ogg';
+ this.audio.load();
+ this.audio.play();
+ window.history.replaceState("","Useless Title","#/"+this.path+this.data[i].fileName+"/"); // title seems be fucked.
+ H(this.nowPlaying).innerHTML(decodeURIComponent(this.data[i].fileName));
+ },
+
+ freshFolderlist: function(callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open("POST", PCMAPI_URL, true);
+ xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+ var that = this;
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState != 4 || xhr.status != 200) return;
+ var data = JSON.parse(xhr.responseText);
+ if (data.status != 200) {
+ console.error("Fetch error. Reason: " + data.message + " Url: ./api.php");
+ return;
+ }
+ data.result.data.subFolderList.forEach(function(item, i) {
+ var decodedFolderName = decodeURIComponent(item);
+ if (that.path == null) that.path = item + '/';
+ // attr aim data as uriencoded path.
+ H(that.folderlist).append(
+ H("<a>").attr('aim', item).append(
+ H("<li>").text(decodedFolderName + '/').el
+ ).el
+ );
+ });
+ };
+ xhr.onerror = function() {
+ console.error("Ajax load folders failed. Status: " + xhr.status + " Url: ./api.php");
+ };
+ xhr.onloadend = function() {
+ var nodeList = document.querySelectorAll('#folderlist a');
+ for(var i = 0; i < nodeList.length; i++) {
+ var el = nodeList[i];
+ el.onclick = function() {
+ that.path = this.getAttribute('aim') + '/';
+ that.fetchData();
+ };
+ }
+ typeof callback === 'function' && callback();
+ }
+ xhr.send("do=getfilelist");
+ },
+
+ fetchData: function() {
+ var that = this;
+ var xhr = new XMLHttpRequest();
+ xhr.open("POST", PCMAPI_URL, true);
+ xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState != 4 || xhr.status != 200) return;
+ var data = JSON.parse(xhr.responseText);
+ if (data.status != 200) {
+ console.error("Fetch error. Reason: " + data.message + " Url: ./api.php");
+ return;
+ }
+ that.data = data.result.data.musicList;
+ that.freshPlaylist();
+ that.freshSubFolderList(data.result.data.subFolderList);
+ };
+ xhr.onerror = function() {
+ console.error("Ajax load playlist failed. Status: " + xhr.status + " Url: ./api.php");
+ that.data = [];
+ };
+ xhr.send("do=getfilelist&folder="+that.path);
+ },
+
+ freshPlaylist : function() {
+ var that = this;
+ var data = this.data;
+ var songTitle = '';
+ this.playlist.innerHTML = '';
+ data.forEach(function(item, i) {
+ songTitle = decodeURIComponent(item.fileName);
+ H(that.playlist).append(
+ H("<a>").attr('index', i).append(
+ H("<li>").text(songTitle).el
+ ).el
+ );
+ });
+ // everytime after update playlist dom, do this.
+ var nodeList = document.querySelectorAll('#playlist a');
+ for(var i = 0; i < nodeList.length; i++) {
+ var el = nodeList[i];
+ el.onclick = function() {
+ that.playAtIndex(this.getAttribute('index'));
+ };
+ }
+ },
+
+ freshSubFolderList : function(list) {
+ var that = this;
+ H("subfolderlist").innerHTML("");
+ list.forEach(function(item, i) {
+ var decodedFolderName = decodeURIComponent(item);
+ // attr aim data as uriencoded path.
+ H("subfolderlist").append(
+ H("<a>").attr('aim', item).append(
+ H("<li>").text(decodedFolderName + '/').el
+ ).el
+ );
+ });
+ var nodeList = document.querySelectorAll('#subfolderlist a');
+ for(var i = 0; i < nodeList.length; i++) {
+ var el = nodeList[i];
+ el.onclick = function() {
+ that.path = this.getAttribute('aim') + '/';
+ that.fetchData();
+ };
+ }
+ },
+
+ urlMatch : function() {
+ var isUrlMatched = false;
+ // Match folder name and song title.
+ var re = new RegExp("[#][/](.*[/])(.*)[/]$");
+ var urlMatch = re.exec(location.href);
+ if (urlMatch != null) {
+ isUrlMatched = true;
+ this.path = urlMatch[1];
+ this.audio.src = AUDIO_URL + urlMatch[2] + '.ogg';
+ this.audio.play();
+ H(this.nowPlaying).innerHTML(decodeURIComponent(urlMatch[2]));
+ }
+ // Only match folder name.
+ if (!isUrlMatched) {
+ re = new RegExp("[#][/](.*[/])");
+ urlMatch = re.exec(location.href);
+ if (urlMatch != null) {
+ isUrlMatched = true;
+ this.path = urlMatch[1];
+ }
+ }
+ },
+
+ applyLoop : function() {
+ if (this.loop == 1) {
+ this.audio.loop = true;
+ H("btn-loop").innerHTML("Loop: √");
+ } else {
+ this.audio.loop = false;
+ H("btn-loop").innerHTML("Loop: ×");
+ }
+ },
+
+ applyOrder : function() {
+ if (this.order == 1) {
+ this.audio.onended = function() {
+ if (this.loop == 0) {
+ H("btn-next").click();
+ }
+ };
+ H("btn-order").innerHTML("Order: √");
+ } else {
+ this.audio.onended = undefined;
+ H("btn-order").innerHTML("Order: ×");
+ }
+ },
+
+ init : function() {
+ var that = this;
+ this.freshFolderlist(function() {
+ that.urlMatch();
+ that.fetchData();
+ });
+ this.loop = getCookie("pcm-loop") == "1" ? 1 : 0;
+ this.order = getCookie("pcm-order") == "1" ? 1 : 0;
+ this.applyLoop();
+ this.applyOrder();
+ },
+
+ ready : function() {
+ var that = this;
+
+ this.audio.ontimeupdate = function() {
+ H("curTime").innerHTML(formatTime(Player.audio.currentTime));
+ H("totalTime").innerHTML(formatTime(Player.audio.duration));
+ H("timebar").css("width", Player.audio.currentTime / Player.audio.duration*100+"%");
+ var r = 0;
+ for(var i=0; i<Player.audio.buffered.length; ++i)
+ r = r<Player.audio.buffered.end(i) ? Player.audio.buffered.end(i) : r;
+ H("bufferbar").css("width", r / Player.audio.duration*100+"%");
+ };
+
+ this.audio.onpause = function() {
+ H("btn-play").innerHTML("Play");
+ }
+
+ this.audio.onplay = function() {
+ H("btn-play").innerHTML("Pause");
+ that.updateMetadata();
+ }
+
+ H("progressbar").click(function(e) {
+ var sr=this.getBoundingClientRect();
+ var p=(e.clientX-sr.left)/sr.width;
+ that.audio.currentTime=that.audio.duration*p;
+ });
+
+ var nodeList = document.getElementsByTagName('button');
+ for(var i = 0; i < nodeList.length; i++) {
+ var el = nodeList[i];
+ el.onclick = function() {
+ if(that.data[that.currentIndex]) H(that.nowPlaying).innerHTML(decodeURIComponent(that.data[that.currentIndex].fileName));
+ };
+ }
+
+ H("btn-play").click(function() {
+ if(that.audio.paused) {
+ that.audio.play();
+ } else {
+ that.audio.pause();
+ }
+ if (that.currentIndex == -1 && that.audio.readyState == 0) {
+ H("btn-next").click();
+ }
+ });
+
+ H("btn-next").click(function() {
+ if (that.currentIndex == -1) {
+ that.playAtIndex(0);
+ } else if (that.currentIndex == (that.data.length - 1)) {
+ that.playAtIndex(0);
+ } else {
+ that.playAtIndex(Number(that.currentIndex) + 1);
+ }
+ });
+
+ H("btn-prev").click(function() {
+ if (that.currentIndex == -1) {
+ that.playAtIndex(0);
+ } else if (that.currentIndex == 0) {
+ that.playAtIndex(that.data.length - 1);
+ } else {
+ that.playAtIndex(Number(that.currentIndex) - 1);
+ }
+ });
+
+ H("btn-loop").click(function() {
+ that.loop = 1 - that.loop;
+ that.applyLoop();
+ setCookie("pcm-loop", that.loop, 157680000);
+ });
+
+ H("btn-order").click(function() {
+ that.order = 1 - that.order;
+ that.applyOrder();
+ setCookie("pcm-order", that.order, 157680000);
+ });
+
+ if ('mediaSession' in navigator) {
+ navigator.mediaSession.setActionHandler('previoustrack', function() { H("btn-prev").click(); });
+ navigator.mediaSession.setActionHandler('nexttrack', function() { H("btn-next").click(); });
+ }
+ }
+ };
+
+ Player.init();
+ Player.ready();
+}());
diff --git a/libs/music/player.d/w3.css b/libs/music/player.d/w3.css
new file mode 100644
index 0000000..6683c67
--- /dev/null
+++ b/libs/music/player.d/w3.css
@@ -0,0 +1,384 @@
+/* W3.CSS 2.5 by Jan Egil and Borge Refsnes. Do not remove this line */
+*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}
+/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */
+html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
+article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}
+audio,canvas,video{display:inline-block;vertical-align:baseline}
+audio:not([controls]){display:none;height:0}
+[hidden],template{display:none}
+a{background-color:transparent}
+a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}
+b,strong,optgroup{font-weight:bold}dfn{font-style:italic}
+mark{background:#ff0;color:#000}small{font-size:80%}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+sup{top:-0.5em}sub{bottom:-0.25em}
+img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}
+hr{-moz-box-sizing:content-box;box-sizing:content-box}
+code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}
+button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}
+button{overflow:visible}button,select{text-transform:none}
+button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
+button[disabled],html input[disabled]{cursor:default}
+button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
+input[type=checkbox],input[type=radio]{padding:0}
+input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}
+input[type=search]{box-sizing:content-box;-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}
+input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}
+fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}
+legend{border:0;padding:0}pre,textarea{overflow:auto}
+/*End extract from normalize.css*/
+html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}
+html{overflow-x:hidden}
+h1,h2,h3,h4,h5,h6,.w3-slim,.w3-wide{font-family:"Segoe UI",Arial,sans-serif}
+h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}
+.w3-serif{font-family:"Times New Roman",Times,serif}
+h1,h2,h3,h4,h5,h6{font-weight:400;margin:10px 0}
+.w3-wide{letter-spacing:4px}
+h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}
+hr{height:0;border:0;border-top:1px solid #eee;margin:20px 0}
+img{margin-bottom:-5px}
+a{color:inherit}
+table{border-collapse:collapse;border-spacing:0;width:100%;display:table}
+table,th,td{border:none}
+.w3-table-all{border:1px solid #ccc}
+.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}
+.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1}
+.w3-table-all tr:nth-child(odd){background-color:#fff}
+.w3-table-all tr:nth-child(even){background-color:#f1f1f1}
+.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}
+.w3-centered tr th,.w3-centered tr td{text-align:center}
+.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:6px 8px;display:table-cell;text-align:left;vertical-align:top}
+.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px}
+.w3-btn,.w3-btn-block{border:none;display:inline-block;outline:0;padding:6px 16px;vertical-align:middle;overflow:hidden;text-decoration:none!important;color:#fff;background-color:#000;text-align:center;cursor:pointer;white-space:nowrap}
+.w3-btn.w3-disabled,.w3-btn-block.w3-disabled,.w3-btn-floating.w3-disabled,.w3-btn:disabled,.w3-btn-floating:disabled,.w3-btn-floating-large.w3-disabled,.w3-btn-floating-large:disabled{cursor:not-allowed;opacity:0.3}
+.w3-btn.w3-disabled *,.w3-btn-block.w3-disabled,.w3-btn-floating.w3-disabled *,.w3-btn:disabled *,.w3-btn-floating:disabled *{pointer-events:none}
+.w3-btn.w3-disabled:hover,.w3-btn-block.w3-disabled:hover,.w3-btn:disabled:hover,.w3-btn-floating.w3-disabled:hover,.w3-btn-floating:disabled:hover,
+.w3-btn-floating-large.w3-disabled:hover,.w3-btn-floating-large:disabled:hover{box-shadow:none}
+.w3-btn:hover,.w3-btn-block:hover,.w3-btn-floating:hover,.w3-btn-floating-large:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
+.w3-btn-block{width:100%}
+.w3-btn,.w3-btn-floating,.w3-btn-floating-large,.w3-closenav,.w3-opennav{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
+.w3-btn-floating,.w3-btn-floating-large{display:inline-block;text-align:center;color:#fff;background-color:#000;position:relative;overflow:hidden;z-index:1;padding:0;border-radius:50%;cursor:pointer;font-size:24px}
+.w3-btn-floating{width:40px;height:40px;line-height:40px}
+.w3-btn-floating-large{width:56px;height:56px;line-height:56px}
+.w3-btn-group .w3-btn{float:left}
+.w3-btn.w3-ripple{position:relative}
+.w3-ripple:after{content:"";background:#90EE90;display:block;position:absolute;padding-top:300%;padding-left:350%;margin-left:-20px!important;margin-top:-120%;opacity:0;transition:.8s}
+.w3-ripple:active:after{padding:0;margin:0;opacity:1;transition:0s}
+.w3-badge,.w3-tag,.w3-sign{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;font-weight:bold;text-align:center}
+.w3-badge{border-radius:50%}
+ul.w3-ul{list-style-type:none;padding:0;margin:0}
+ul.w3-ul li{padding:6px 2px 6px 16px;border-bottom:1px solid #ddd}
+ul.w3-ul li:last-child{border-bottom:none}
+.w3-image,.w3-tooltip,.w3-display-container{position:relative}
+img.w3-image,.w3-image img{max-width:100%;height:auto}
+.w3-image .w3-title{position:absolute;bottom:8px;left:16px;color:#fff;font-size:20px}
+.w3-fluid{max-width:100%;height:auto}
+.w3-tooltip .w3-text{display:none}
+.w3-tooltip:hover .w3-text{display:inline-block}
+.w3-navbar{list-style-type:none;margin:0;padding:0;overflow:hidden}
+.w3-navbar li{float:left}.w3-navbar li a{display:block;padding:8px 16px}.w3-navbar li a:hover{color:#000;background-color:#ccc}
+.w3-navbar .w3-dropdown-hover,.w3-navbar .w3-dropdown-click{position:static}
+.w3-navbar .w3-dropdown-hover:hover,.w3-navbar .w3-dropdown-hover:first-child,.w3-navbar .w3-dropdown-click:hover{background-color:#ccc;color:#000}
+.w3-navbar a,.w3-topnav a,.w3-sidenav a,.w3-dropnav a,.w3-dropdown-content a,.w3-accordion-content a{text-decoration:none!important}
+.w3-navbar .w3-opennav.w3-right{float:right!important}
+.w3-topnav{padding:8px 8px}
+.w3-topnav a{padding:0 8px;border-bottom:3px solid transparent;-webkit-transition:border-bottom .3s;transition:border-bottom .3s}
+.w3-topnav a:hover{border-bottom:3px solid #fff}
+.w3-topnav .w3-dropdown-hover a{border-bottom:0}
+.w3-opennav,.w3-closenav{color:inherit}
+.w3-opennav:hover,.w3-closenav:hover{cursor:pointer;opacity:0.8}
+.w3-btn,.w3-btn-floating,.w3-btn-floating-large,.w3-hover-shadow,.w3-hover-opacity,
+.w3-navbar a,.w3-sidenav a,.w3-dropnav a,.w3-pagination li a,.w3-hoverable tbody tr,.w3-hoverable li,.w3-accordion-content a,.w3-dropdown-content a,.w3-dropdown-click:hover,.w3-dropdown-hover:hover,.w3-opennav,.w3-closenav,.w3-closebtn,
+.w3-hover-amber,.w3-hover-aqua,.w3-hover-blue,.w3-hover-light-blue,.w3-hover-brown,.w3-hover-cyan,.w3-hover-blue-grey,.w3-hover-green,.w3-hover-light-green,.w3-hover-indigo,.w3-hover-khaki,.w3-hover-lime,.w3-hover-orange,.w3-hover-deep-orange,.w3-hover-pink,
+.w3-hover-purple,.w3-hover-deep-purple,.w3-hover-red,.w3-hover-sand,.w3-hover-teal,.w3-hover-yellow,.w3-hover-white,.w3-hover-black,.w3-hover-grey,.w3-hover-light-grey,.w3-hover-dark-grey,.w3-hover-text-amber,.w3-hover-text-aqua,.w3-hover-text-blue,.w3-hover-text-light-blue,
+.w3-hover-text-brown,.w3-hover-text-cyan,.w3-hover-text-blue-grey,.w3-hover-text-green,.w3-hover-text-light-green,.w3-hover-text-indigo,.w3-hover-text-khaki,.w3-hover-text-lime,.w3-hover-text-orange,.w3-hover-text-deep-orange,.w3-hover-text-pink,.w3-hover-text-purple,
+.w3-hover-text-deep-purple,.w3-hover-text-red,.w3-hover-text-sand,.w3-hover-text-teal,.w3-hover-text-yellow,.w3-hover-text-white,.w3-hover-text-black,.w3-hover-text-grey,.w3-hover-text-light-grey,.w3-hover-text-dark-grey
+{-webkit-transition:background-color .3s,color .15s,box-shadow .3s,opacity 0.3s;transition:background-color .3s,color .15s,box-shadow .3s,opacity 0.3s}
+.w3-sidenav{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto}
+.w3-sidenav a{padding:4px 2px 4px 16px}
+.w3-sidenav a:hover{background-color:#ccc}
+.w3-sidenav a,.w3-dropnav a{display:block}
+.w3-sidenav .w3-dropdown-hover:hover,.w3-sidenav .w3-dropdown-hover:first-child,.w3-sidenav .w3-dropdown-click:hover{background-color:#ccc;color:#000}
+.w3-sidenav .w3-dropdown-hover,.w3-sidenav .w3-dropdown-click {width:100%}.w3-sidenav .w3-dropdown-hover .w3-dropdown-content,.w3-sidenav .w3-dropdown-click .w3-dropdown-content{min-width:100%}
+.w3-main,#main{transition:margin-left .4s}
+.w3-dropnav{background-color:#fff}
+.w3-dropnav a:hover{text-decoration:underline!important}
+.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)}
+.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px}.w3-closebtn{text-decoration:none;float:right;font-size:24px;font-weight:bold;color:inherit}
+.w3-closebtn:hover,.w3-closebtn:focus{color:#000;text-decoration:none;cursor:pointer}
+.w3-pagination{display:inline-block;padding:0;margin:0}
+.w3-pagination li{display:inline}
+.w3-pagination li a{text-decoration:none;color:#000;float:left;padding:8px 16px}
+.w3-pagination li a:hover,.w3-pagination li a:focus{background-color:#ccc}
+.w3-input-group,.w3-group{margin-top:24px;margin-bottom:24px}
+.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #808080;width:100%}
+.w3-label{color:#009688}
+.w3-input:not(:valid)~.w3-validate{color:#f44336}
+.w3-select{padding:4px 0;width:100%;color:#000;border:1px solid transparent;border-bottom:1px solid #009688}
+.w3-select select:focus{color:#000;border:1px solid #009688}.w3-select option[disabled]{color:#009688}
+.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
+.w3-dropdown-hover:hover .w3-dropdown-content{display:block;z-index:1}
+.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0}
+.w3-dropdown-content a{padding:6px 16px;display:block}
+.w3-dropdown-content a:hover{background-color:#ccc}
+.w3-accordion {width:100%;cursor:pointer}
+.w3-accordion-content{cursor:auto;display:none;position:relative;width:100%;margin:0;padding:0}
+.w3-accordion-content a{padding:6px 16px;display:block}
+.w3-accordion-content a:hover{background-color:#ccc}
+.w3-progress-container{width:100%;height:1.5em;position:relative;background-color:#f1f1f1}
+.w3-progressbar{background-color:#757575;height:100%;position:absolute;line-height:inherit}
+input[type=checkbox].w3-check,input[type=radio].w3-radio{width:24px;height:24px;position:relative;top:6px}
+input[type=checkbox].w3-check:checked+.w3-validate,input[type=radio].w3-radio:checked+.w3-validate{color:#009688}
+input[type=checkbox].w3-check:disabled+.w3-validate,input[type=radio].w3-radio:disabled+.w3-validate{color:#aaa}
+.w3-responsive{overflow-x:auto}
+.w3-container-4:after,.w3-container-8:after,.w3-container-12:after,.w3-container:after,.w3-container-16:after,
+.w3-container-24:after,.w3-container-32:after,.w3-container-48:after,.w3-container-64:after,
+.w3-row:after,.w3-row-padding:after,.w3-topnav:after,.w3-clear:after,.w3-btn-group:before,.w3-btn-group:after{content:"";display:table;clear:both}
+.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%}
+.w3-col.s1{width:8.33333%}
+.w3-col.s2{width:16.66666%}
+.w3-col.s3{width:24.99999%}
+.w3-col.s4{width:33.33333%}
+.w3-col.s5{width:41.66666%}
+.w3-col.s6{width:49.99999%}
+.w3-col.s7{width:58.33333%}
+.w3-col.s8{width:66.66666%}
+.w3-col.s9{width:74.99999%}
+.w3-col.s10{width:83.33333%}
+.w3-col.s11{width:91.66666%}
+.w3-col.s12,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{width:99.99999%}
+@media only screen and (min-width:601px){
+.w3-col.m1{width:8.33333%}
+.w3-col.m2{width:16.66666%}
+.w3-col.m3,.w3-quarter{width:24.99999%}
+.w3-col.m4,.w3-third{width:33.33333%}
+.w3-col.m5{width:41.66666%}
+.w3-col.m6,.w3-half{width:49.99999%}
+.w3-col.m7{width:58.33333%}
+.w3-col.m8,.w3-twothird{width:66.66666%}
+.w3-col.m9,.w3-threequarter{width:74.99999%}
+.w3-col.m10{width:83.33333%}
+.w3-col.m11{width:91.66666%}
+.w3-col.m12{width:99.99999%}}
+@media only screen and (min-width:993px){
+.w3-col.l1{width:8.33333%}
+.w3-col.l2{width:16.66666%}
+.w3-col.l3,.w3-quarter{width:24.99999%}
+.w3-col.l4,.w3-third{width:33.33333%}
+.w3-col.l5{width:41.66666%}
+.w3-col.l6,.w3-half{width:49.99999%}
+.w3-col.l7{width:58.33333%}
+.w3-col.l8,.w3-twothird{width:66.66666%}
+.w3-col.l9,.w3-threequarter{width:74.99999%}
+.w3-col.l10{width:83.33333%}
+.w3-col.l11{width:91.66666%}
+.w3-col.l12{width:99.99999%}}
+.w3-content{max-width:980px;margin:auto}
+.w3-rest{overflow:hidden}
+.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important}
+@media (max-width:600px){.w3-modal-content{margin:50px 10px 10px 10px;width:auto!important}}
+@media (max-width:768px){.w3-modal-content{width:500px}}
+@media (min-width:993px){.w3-modal-content{width:900px}}
+@media screen and (max-width:600px){.w3-topnav a{display:block}.w3-navbar li:not(.w3-opennav){float:none;width:100%!important}.w3-navbar li.w3-right{float:none!important}}
+@media screen and (max-width:600px){.w3-topnav .w3-dropdown-hover .w3-dropdown-content,.w3-navbar .w3-dropdown-click .w3-dropdown-content,.w3-navbar .w3-dropdown-hover .w3-dropdown-content{position:relative}}
+@media screen and (max-width:600px){.w3-topnav,.w3-navbar{text-align:center}}
+@media (max-width:600px){.w3-hide-small{display:none!important}}
+@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}}
+@media (min-width:993px){.w3-hide-large{display:none!important}}
+@media screen and (max-width:992px){.w3-sidenav.w3-collapse{display:none}.w3-main{margin-left:0!important}}
+@media screen and (min-width:992px){.w3-sidenav.w3-collapse{display:block!important}}
+.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0}
+.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2}
+.w3-left{float:left!important}.w3-right{float:right!important}
+.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}
+.w3-medium{font-size:15px!important}
+.w3-large{font-size:18px!important}
+.w3-xlarge{font-size:24px!important}
+.w3-xxlarge{font-size:36px!important}
+.w3-xxxlarge{font-size:48px!important}
+.w3-jumbo{font-size:64px!important}
+.w3-vertical{word-break:break-all;line-height:1;text-align:center;width:0.6em}
+.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}
+.w3-justify{text-align:justify!important}
+.w3-center{text-align:center!important}
+.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0}
+.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0}
+.w3-display-middle{position:absolute;left:0;bottom:50%;width:100%;text-align:center}
+.w3-display-topmiddle{position:absolute;left:0;top:0;width:100%;text-align:center}.w3-display-bottommiddle{position:absolute;left:0;bottom:0;width:100%;text-align:center}
+.w3-circle{border-radius:50%!important}
+.w3-round-small{border-radius:2px!important}.w3-round,.w3-round-medium{border-radius:4px!important}
+.w3-round-large{border-radius:8px!important}.w3-round-xlarge{border-radius:16px!important}
+.w3-round-xxlarge{border-radius:32px!important}.w3-round-jumbo{border-radius:64px!important}
+.w3-border-0{border:0!important}
+.w3-border{border:1px solid #ccc!important}
+.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important}
+.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important}
+.w3-section-4{margin-top:4px;margin-bottom:4px}
+.w3-section-8{margin-top:8px;margin-bottom:8px}
+.w3-section-12{margin-top:12px;margin-bottom:12px}
+.w3-section,.w3-section-16,.w3.paragraph{margin-top:16px;margin-bottom:16px}
+.w3-section-24{margin-top:24px;margin-bottom:24px}
+.w3-section-32{margin-top:32px;margin-bottom:32px}
+.w3-section-48{margin-top:48px;margin-bottom:48px}
+.w3-section-64{margin-top:64px;margin-bottom:64px}
+.w3-section-128{margin-top:128px;margin-bottom:128px}
+.w3-margin-0{margin:0!important}
+.w3-margin-4{margin:4px!important}
+.w3-margin-8{margin:8px!important}
+.w3-margin-12{margin:12px!important}
+.w3-margin-16,.w3-margin{margin:16px!important}
+.w3-margin-24{margin:24px!important}
+.w3-margin-32{margin:32px!important}
+.w3-margin-48{margin:48px!important}
+.w3-margin-64{margin:64px!important}
+.w3-padding-tiny{padding:2px 4px!important}
+.w3-padding-small{padding:4px 8px!important}
+.w3-padding-medium,.w3-padding,.w3-form{padding:8px 16px!important}
+.w3-padding-large{padding:12px 24px!important}
+.w3-padding-xlarge{padding:16px 32px!important}
+.w3-padding-xxlarge{padding:24px 48px!important}
+.w3-padding-jumbo{padding:32px 64px!important}
+.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important}
+.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important}
+.w3-padding-0{padding:0!important}
+.w3-padding-4{padding-top:4px!important;padding-bottom:4px!important}
+.w3-padding-8{padding-top:8px!important;padding-bottom:8px!important}
+.w3-padding-12{padding-top:12px!important;padding-bottom:12px!important}
+.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}
+.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important}
+.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}
+.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important}
+.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important}
+.w3-padding-128{padding-top:128px!important;padding-bottom:128px!important}
+.w3-padding-top{padding-top:8px!important}.w3-padding-bottom{padding-bottom:8px!important}
+.w3-padding-left{padding-left:16px!important}.w3-padding-right{padding-right:16px!important}
+.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important}
+.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important}
+.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px}
+.w3-spin{animation:w3-spin 2s infinite linear;-webkit-animation:w3-spin 2s infinite linear}
+@-webkit-keyframes w3-spin{
+0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}
+100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
+@keyframes w3-spin{
+0%{-webkit-transform:rotate(0deg);transform: rotate(0deg)}
+100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
+.w3-container-4{padding:0.01em 4px}.w3-container-8{padding:0.01em 8px}.w3-container-12{padding:0.01em 12px}.w3-container,.w3-container-16{padding:0.01em 16px}
+.w3-container-24{padding:0.01em 24px}.w3-container-32{padding:0.01em 32px}.w3-container-48{padding:0.01em 48px}.w3-container-64{padding:0.01em 64px}
+.w3-example{background-color:#f1f1f1;padding:0.01em 16px}
+.w3-code{font-family:Consolas,"courier new";font-size:16px;line-height:1.4;width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #009688;word-wrap:break-word}
+.w3-example,.w3-code,.w3-reference{margin:20px 0}
+.w3-card{border:1px solid #ccc}
+.w3-card-2,.w3-example{box-shadow:0 2px 4px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)!important}
+.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)!important}
+.w3-card-8{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)!important}
+.w3-card-12{box-shadow:0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19)!important}
+.w3-card-16{box-shadow:0 16px 24px 0 rgba(0,0,0,0.22),0 25px 55px 0 rgba(0,0,0,0.21)!important}
+.w3-card-24{box-shadow:0 24px 24px 0 rgba(0,0,0,0.2),0 40px 77px 0 rgba(0,0,0,0.22)!important}
+.w3-animate-fading{-webkit-animation:fading 10s infinite;animation:fading 10s infinite}
+@-webkit-keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}}
+@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}}
+.w3-animate-opacity{-webkit-animation:opac 1.5s;animation:opac 1.5s}
+@-webkit-keyframes opac{from{opacity:0} to{opacity:1}}
+@keyframes opac{from{opacity:0} to{opacity:1}}
+.w3-animate-top{position:relative;-webkit-animation:animatetop 0.4s;animation:animatetop 0.4s}
+@-webkit-keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}}
+@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}}
+.w3-animate-left{position:relative;-webkit-animation:animateleft 0.4s;animation:animateleft 0.4s}
+@-webkit-keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}
+@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}
+.w3-animate-right{position:relative;-webkit-animation:animateright 0.4s;animation:animateright 0.4s}
+@-webkit-keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}}
+@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}}
+.w3-animate-bottom{position:relative;-webkit-animation:animatebottom 0.4s;animation:animatebottom 0.4s}
+@-webkit-keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0px;opacity:1}}
+@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}}
+.w3-animate-zoom {-webkit-animation:animatezoom 0.6s;animation:animatezoom 0.6s}
+@-webkit-keyframes animatezoom{from{-webkit-transform:scale(0)} to{-webkit-transform:scale(1)}}
+@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}}
+.w3-animate-input{-webkit-transition:width 0.4s ease-in-out;transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important}
+.w3-transparent{background-color:transparent!important}
+.w3-hover-none:hover{box-shadow:none!important;background-color:transparent!important}
+.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important}
+.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important}
+.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important}
+.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important}
+.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important}
+.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important}
+.w3-blue-grey,.w3-hover-blue-grey:hover{color:#fff!important;background-color:#607d8b!important}
+.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important}
+.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important}
+.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important}
+.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important}
+.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important}
+.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important}
+.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important}
+.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important}
+.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important}
+.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important}
+.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important}
+.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important}
+.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important}
+.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important}
+.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important}
+.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important}
+.w3-grey,.w3-hover-grey:hover{color:#000!important;background-color:#9e9e9e!important}
+.w3-light-grey,.w3-hover-light-grey:hover{color:#000!important;background-color:#f1f1f1!important}
+.w3-dark-grey,.w3-hover-dark-grey:hover{color:#fff!important;background-color:#616161!important}
+.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffe7e7!important}.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#e7ffe7!important}
+.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffd7!important}.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#e7ffff!important}
+.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important}
+.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important}
+.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important}
+.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important}
+.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important}
+.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important}
+.w3-text-blue-grey,.w3-hover-text-blue-grey:hover{color:#607d8b!important}
+.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important}
+.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important}
+.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important}
+.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important}
+.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important}
+.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important}
+.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important}
+.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important}
+.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important}
+.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important}
+.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important}
+.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important}
+.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important}
+.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important}
+.w3-text-white,.w3-hover-text-white:hover{color:#fff!important}
+.w3-text-black,.w3-hover-text-black:hover{color:#000!important}
+.w3-text-grey,.w3-hover-text-grey:hover{color:#757575!important}
+.w3-text-light-grey,.w3-hover-text-light-grey:hover{color:#f1f1f1!important}
+.w3-text-dark-grey,.w3-hover-text-dark-grey:hover{color:#3a3a3a!important}
+.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important}
+.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important}
+.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important}
+.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important}
+.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important}
+.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important}
+.w3-border-blue-grey,.w3-hover-blue-grey:hover{border-color:#607d8b!important}
+.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important}
+.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important}
+.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important}
+.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important}
+.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important}
+.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important}
+.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important}
+.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important}
+.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important}
+.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important}
+.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important}
+.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important}
+.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important}
+.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important}
+.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important}
+.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important}
+.w3-border-grey,.w3-hover-border-grey:hover{border-color:#9e9e9e!important}
+.w3-border-light-grey,.w3-hover-border-light-grey:hover{border-color:#f1f1f1!important}
+.w3-border-dark-grey,.w3-hover-border-dark-grey:hover{border-color:#616161!important}
+.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important}
+.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffd7!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important}
+.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}
+.w3-text-shadow{text-shadow:1px 1px 0 #444}.w3-text-shadow-white{text-shadow:1px 1px 0 #ddd} \ No newline at end of file