diff options
Diffstat (limited to 'libs/music')
-rw-r--r-- | libs/music/pcm | 73 | ||||
-rwxr-xr-x | libs/music/player.d/cgi-bin/pcm.cgi | 31 | ||||
-rw-r--r-- | libs/music/player.d/pcm.js | 365 | ||||
-rw-r--r-- | libs/music/player.d/w3.css | 384 |
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">☰</span> 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"><<</button> + <button class="w3-btn w3-tiny" id="btn-play">Play</button> + <button class="w3-btn w3-tiny" id="btn-next">>></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 |