├── scraper ├── __init__.py ├── migrations │ ├── __init__.py │ └── __pycache__ │ │ └── __init__.cpython-39.pyc ├── models.py ├── tests.py ├── admin.py ├── __pycache__ │ ├── apps.cpython-39.pyc │ ├── urls.cpython-39.pyc │ ├── admin.cpython-39.pyc │ ├── models.cpython-39.pyc │ ├── views.cpython-39.pyc │ └── __init__.cpython-39.pyc ├── apps.py ├── urls.py └── views.py ├── webscrapper ├── __init__.py ├── __pycache__ │ ├── urls.cpython-39.pyc │ ├── wsgi.cpython-39.pyc │ ├── __init__.cpython-39.pyc │ └── settings.cpython-39.pyc ├── urls.py ├── asgi.py ├── wsgi.py └── settings.py ├── db.sqlite3 ├── Untitled.gif ├── static ├── Web-Scraping.jpg ├── Web-Scrapings.jpg └── w3.css ├── manage.py ├── templates ├── home.html └── result.html └── README.md /scraper/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webscrapper/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scraper/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/db.sqlite3 -------------------------------------------------------------------------------- /Untitled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/Untitled.gif -------------------------------------------------------------------------------- /scraper/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /scraper/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /scraper/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /static/Web-Scraping.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/static/Web-Scraping.jpg -------------------------------------------------------------------------------- /static/Web-Scrapings.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/static/Web-Scrapings.jpg -------------------------------------------------------------------------------- /scraper/__pycache__/apps.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/scraper/__pycache__/apps.cpython-39.pyc -------------------------------------------------------------------------------- /scraper/__pycache__/urls.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/scraper/__pycache__/urls.cpython-39.pyc -------------------------------------------------------------------------------- /scraper/__pycache__/admin.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/scraper/__pycache__/admin.cpython-39.pyc -------------------------------------------------------------------------------- /scraper/__pycache__/models.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/scraper/__pycache__/models.cpython-39.pyc -------------------------------------------------------------------------------- /scraper/__pycache__/views.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/scraper/__pycache__/views.cpython-39.pyc -------------------------------------------------------------------------------- /scraper/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/scraper/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /webscrapper/__pycache__/urls.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/webscrapper/__pycache__/urls.cpython-39.pyc -------------------------------------------------------------------------------- /webscrapper/__pycache__/wsgi.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/webscrapper/__pycache__/wsgi.cpython-39.pyc -------------------------------------------------------------------------------- /webscrapper/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/webscrapper/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /webscrapper/__pycache__/settings.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/webscrapper/__pycache__/settings.cpython-39.pyc -------------------------------------------------------------------------------- /scraper/migrations/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alaminmagaga/webscrapper/HEAD/scraper/migrations/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /scraper/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ScraperConfig(AppConfig): 5 | default_auto_field = "django.db.models.BigAutoField" 6 | name = "scraper" 7 | -------------------------------------------------------------------------------- /webscrapper/urls.py: -------------------------------------------------------------------------------- 1 | 2 | from django.contrib import admin 3 | from django.urls import path,include 4 | 5 | urlpatterns = [ 6 | path("admin/", admin.site.urls), 7 | path('',include('scraper.urls')), 8 | ] 9 | -------------------------------------------------------------------------------- /scraper/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | urlpatterns = [ 5 | path('', views.home, name='home'), 6 | path('scrape/', views.scrape, name='scrape'), 7 | path('download/', views.download_file, name='download_file'), 8 | ] 9 | -------------------------------------------------------------------------------- /webscrapper/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for webscrapper project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "webscrapper.settings") 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /webscrapper/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for webscrapper project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "webscrapper.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "webscrapper.settings") 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == "__main__": 22 | main() 23 | -------------------------------------------------------------------------------- /templates/home.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | Web Scraper 7 | 47 | 48 | 49 |

Web Scraper

50 |
51 | 52 |
53 | {% csrf_token %} 54 | 55 | 56 |
57 | 58 |
59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /templates/result.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Scraped Data 7 | 68 | 69 | 70 | 71 |

72 |
73 |

{{ title }}

74 | {% for heading in headings %} 75 |

{{ heading }}

76 | {% endfor %} 77 | {% for paragraph in paragraphs %} 78 |

{{ paragraph }}

79 | {% endfor %} 80 | 81 |
82 | 83 |

84 | 85 | 86 |
87 |
88 | {% csrf_token %} 89 |

Download Option

90 | 91 | 97 |

98 |

99 | 100 | 101 | 102 | 103 | 104 |
105 |
106 |

107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /scraper/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | import requests 3 | from bs4 import BeautifulSoup 4 | from io import BytesIO 5 | from reportlab.pdfgen import canvas 6 | from django.http import HttpResponse 7 | import csv 8 | import json 9 | from django.urls import path 10 | from django.template.loader import get_template 11 | from xhtml2pdf import pisa 12 | 13 | def home(request): 14 | return render(request, 'home.html') 15 | 16 | def scrape(request): 17 | if request.method == 'POST': 18 | url = request.POST.get('url') 19 | r = requests.get(url) 20 | soup = BeautifulSoup(r.content, 'lxml') 21 | # get the required data from soup object 22 | title = soup.title.string 23 | headings = [] 24 | for heading in soup.find_all(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']): 25 | headings.append(heading.text.strip()) 26 | paragraphs = [] 27 | for paragraph in soup.find_all('p'): 28 | paragraphs.append(paragraph.text.strip()) 29 | context = { 30 | 'title': title, 31 | 'headings': headings, 32 | 'paragraphs': paragraphs, 33 | } 34 | request.session['scraped_data'] = context 35 | return render(request, 'result.html', context) 36 | else: 37 | return render(request, 'home.html') 38 | 39 | def download_file(request): 40 | if 'scraped_data' in request.session: 41 | context = request.session['scraped_data'] 42 | response = HttpResponse(content_type='') 43 | if request.POST['download_type'] == 'pdf': 44 | template_path = 'result.html' 45 | template = get_template(template_path) 46 | html = template.render(context) 47 | response = HttpResponse(content_type='application/pdf') 48 | filename = f"{context['title']}.pdf" 49 | response['Content-Disposition'] = f'attachment; filename="{filename}"' 50 | buffer = BytesIO() 51 | pisa_status = pisa.CreatePDF(html, dest=response, encoding='utf-8') 52 | if pisa_status.err: 53 | return HttpResponse('PDF generation failed') 54 | elif request.POST['download_type'] == 'csv': 55 | response = HttpResponse(content_type='text/csv') 56 | filename = f"{context['title']}.csv" 57 | response['Content-Disposition'] = f'attachment; filename="{filename}"' 58 | writer = csv.writer(response) 59 | writer.writerow(['Title', 'Headings', 'Paragraphs']) 60 | rows = zip([context['title']], context['headings'], context['paragraphs']) 61 | for row in rows: 62 | writer.writerow(row) 63 | elif request.POST['download_type'] == 'json': 64 | response = HttpResponse(content_type='application/json') 65 | filename = f"{context['title']}.json" 66 | response['Content-Disposition'] = f'attachment; filename="{filename}"' 67 | json.dump(context, response, indent=4) 68 | return response 69 | else: 70 | return render(request, 'home.html') -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Web Scraper with Python and Django

2 | 3 |

4 | Python 3.8+ 5 |

6 | 7 |

8 | App 9 |

10 | 11 |

Description

12 | 13 | This web scraper application is built using Python and Django. It allows users to enter a URL and scrape the content of the page. The scraped data is then displayed in a user-friendly format. Additionally, users have the option to download the scraped data in PDF, CSV, or JSON format. 14 | 15 | ## Features 16 | 17 | - **URL Input**: Users can enter the URL of a web page they want to scrape. 18 | - **Content Scraping**: The web scraper retrieves the content of the provided URL and extracts the relevant data. 19 | - **User-Friendly Display**: The scraped data is displayed in a user-friendly format, making it easy for users to view and analyze. 20 | - **Data Download**: Users have the option to download the scraped data in PDF, CSV, or JSON format for further analysis or storage. 21 | 22 | ## Installation 23 | 24 | To run the web scraper locally, follow these steps: 25 | 26 | 1. Clone this repository to your local machine using the following command: 27 |
git clone git clone https://github.com/alaminmagaga/webscrapper.git 28 | 29 | 2. Change to the project directory: 30 | ``` 31 | cd web-scraper 32 | ``` 33 | 34 | 3. Create a virtual environment to install the required dependencies: 35 | ``` 36 | python3 -m venv venv 37 | ``` 38 | 39 | 4. Activate the virtual environment: 40 | - For Windows: 41 | ``` 42 | venv\Scripts\activate 43 | ``` 44 | - For macOS/Linux: 45 | ``` 46 | source venv/bin/activate 47 | ``` 48 | 49 | 5. Install the dependencies: 50 | ``` 51 | pip install -r requirements.txt 52 | ``` 53 | 54 | 6. Run the Django development server: 55 | Open your web browser and navigate to `http://localhost:8000` to access the web scraper. 56 | 57 | ## Usage 58 | 59 | 1. Once you access the web scraper in your web browser, you will see an input field to enter the URL of the web page you want to scrape. 60 | 61 | 2. Enter the URL and click the "Scrape" button to initiate the scraping process. 62 | 63 | 3. The web scraper will retrieve the content of the provided URL and extract the relevant data. 64 | 65 | 4. The scraped data will be displayed in a user-friendly format on the web page. 66 | 67 | 5. To download the scraped data, click on the desired format (PDF, CSV, or JSON) link provided on the web page. 68 | 69 | 6. The downloaded file can be further analyzed or stored for future reference. 70 | 71 | ## Contributing 72 | 73 | Contributions are welcome! If you encounter any issues with the web scraper or would like to contribute improvements, please follow these steps: 74 | 75 | 1. Fork the repository on GitHub. 76 | 77 | 2. Create a new branch from the main branch. 78 | ``` 79 | git checkout -b my-branch 80 | ``` 81 | 82 | 3. Make the desired changes and commit them with descriptive commit messages. 83 | ``` 84 | git commit -m "Add feature or fix issue" 85 | ``` 86 | 87 | 4. Push the branch to your forked repository. 88 | ``` 89 | git push origin my-branch 90 | ``` 91 | 92 | 5. Open a pull request on the original repository, describing the changes you made. 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /webscrapper/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for webscrapper project. 3 | 4 | Generated by 'django-admin startproject' using Django 4.1.7. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/4.1/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | 15 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 16 | BASE_DIR = Path(__file__).resolve().parent.parent 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = "django-insecure-y%0m(_6$@u39v-uyy&^)*2c-u84f$ufex$xg^7l_b2#be#ncai" 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | "django.contrib.admin", 35 | "django.contrib.auth", 36 | "django.contrib.contenttypes", 37 | "django.contrib.sessions", 38 | "django.contrib.messages", 39 | "django.contrib.staticfiles", 40 | "scraper", 41 | ] 42 | 43 | MIDDLEWARE = [ 44 | "django.middleware.security.SecurityMiddleware", 45 | "django.contrib.sessions.middleware.SessionMiddleware", 46 | "django.middleware.common.CommonMiddleware", 47 | "django.middleware.csrf.CsrfViewMiddleware", 48 | "django.contrib.auth.middleware.AuthenticationMiddleware", 49 | "django.contrib.messages.middleware.MessageMiddleware", 50 | "django.middleware.clickjacking.XFrameOptionsMiddleware", 51 | ] 52 | 53 | ROOT_URLCONF = "webscrapper.urls" 54 | 55 | TEMPLATES = [ 56 | { 57 | "BACKEND": "django.template.backends.django.DjangoTemplates", 58 | "DIRS": ["templates"], 59 | "APP_DIRS": True, 60 | "OPTIONS": { 61 | "context_processors": [ 62 | "django.template.context_processors.debug", 63 | "django.template.context_processors.request", 64 | "django.contrib.auth.context_processors.auth", 65 | "django.contrib.messages.context_processors.messages", 66 | ], 67 | }, 68 | }, 69 | ] 70 | 71 | WSGI_APPLICATION = "webscrapper.wsgi.application" 72 | 73 | 74 | # Database 75 | # https://docs.djangoproject.com/en/4.1/ref/settings/#databases 76 | 77 | DATABASES = { 78 | "default": { 79 | "ENGINE": "django.db.backends.sqlite3", 80 | "NAME": BASE_DIR / "db.sqlite3", 81 | } 82 | } 83 | 84 | 85 | # Password validation 86 | # https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators 87 | 88 | AUTH_PASSWORD_VALIDATORS = [ 89 | { 90 | "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", 91 | }, 92 | {"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",}, 93 | {"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",}, 94 | {"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",}, 95 | ] 96 | 97 | 98 | # Internationalization 99 | # https://docs.djangoproject.com/en/4.1/topics/i18n/ 100 | 101 | LANGUAGE_CODE = "en-us" 102 | 103 | TIME_ZONE = "UTC" 104 | 105 | USE_I18N = True 106 | 107 | USE_TZ = True 108 | 109 | 110 | # Static files (CSS, JavaScript, Images) 111 | # https://docs.djangoproject.com/en/4.1/howto/static-files/ 112 | import os 113 | STATIC_URL = '/static/' 114 | STATICFILES_DIRS=( 115 | os.path.join(BASE_DIR,'static'), 116 | ) 117 | 118 | # Default primary key field type 119 | # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field 120 | 121 | DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" 122 | -------------------------------------------------------------------------------- /static/w3.css: -------------------------------------------------------------------------------- 1 | /* W3.CSS 4.11 October 2018 by Jan Egil and Borge Refsnes */ 2 | html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} 3 | /* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ 4 | html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} 5 | article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block} 6 | audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} 7 | audio:not([controls]){display:none;height:0}[hidden],template{display:none} 8 | a{background-color:transparent;-webkit-text-decoration-skip:objects} 9 | a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} 10 | dfn{font-style:italic}mark{background:#ff0;color:#000} 11 | small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} 12 | sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}svg:not(:root){overflow:hidden} 13 | code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} 14 | button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold} 15 | button,input{overflow:visible}button,select{text-transform:none} 16 | button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button} 17 | button::-moz-focus-inner, [type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner{border-style:none;padding:0} 18 | button:-moz-focusring, [type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring{outline:1px dotted ButtonText} 19 | fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} 20 | legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} 21 | [type=checkbox],[type=radio]{padding:0} 22 | [type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} 23 | [type=search]{-webkit-appearance:textfield;outline-offset:-2px} 24 | [type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none} 25 | ::-webkit-input-placeholder{color:inherit;opacity:0.54} 26 | ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} 27 | /* End extract */ 28 | html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} 29 | 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:serif} 30 | h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} 31 | hr{border:0;border-top:1px solid #eee;margin:20px 0} 32 | .w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} 33 | .w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} 34 | .w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} 35 | .w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} 36 | .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} 37 | .w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} 38 | .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} 39 | .w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} 40 | .w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} 41 | .w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} 42 | .w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} 43 | .w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} 44 | .w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} 45 | .w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} 46 | .w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} 47 | .w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} 48 | .w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} 49 | .w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} 50 | .w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} 51 | .w3-dropdown-hover:hover .w3-dropdown-content{display:block} 52 | .w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} 53 | .w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} 54 | .w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} 55 | .w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} 56 | .w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} 57 | .w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} 58 | .w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} 59 | .w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} 60 | .w3-main,#main{transition:margin-left .4s} 61 | .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)} 62 | .w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} 63 | .w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} 64 | .w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} 65 | .w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} 66 | .w3-bar .w3-button{white-space:normal} 67 | .w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} 68 | .w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} 69 | .w3-responsive{display:block;overflow-x:auto} 70 | .w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, 71 | .w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} 72 | .w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} 73 | .w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} 74 | .w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} 75 | .w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} 76 | @media (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%} 77 | .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%} 78 | .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%}} 79 | @media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} 80 | .w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} 81 | .w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} 82 | .w3-rest{overflow:hidden} 83 | .w3-content,.w3-auto{margin-left:auto;margin-right:auto} 84 | .w3-content{max-width:980px}.w3-auto{max-width:1140px} 85 | .w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} 86 | .w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} 87 | .w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} 88 | @media (max-width:1205px){.w3-auto{max-width:95%}} 89 | @media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} 90 | .w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} 91 | .w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} 92 | .w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} 93 | @media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} 94 | @media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} 95 | @media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} 96 | @media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}} 97 | .w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} 98 | .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} 99 | .w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} 100 | .w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} 101 | .w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} 102 | .w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} 103 | .w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} 104 | .w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} 105 | .w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} 106 | .w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} 107 | .w3-display-position{position:absolute} 108 | .w3-circle{border-radius:50%} 109 | .w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} 110 | .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} 111 | .w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} 112 | .w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} 113 | .w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} 114 | .w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} 115 | .w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} 116 | .w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} 117 | .w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} 118 | .w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} 119 | .w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} 120 | .w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} 121 | .w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} 122 | .w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} 123 | .w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} 124 | .w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} 125 | .w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} 126 | .w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} 127 | .w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} 128 | .w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} 129 | .w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} 130 | .w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} 131 | .w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} 132 | .w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} 133 | .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} 134 | .w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} 135 | .w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} 136 | .w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} 137 | .w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} 138 | .w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} 139 | .w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} 140 | .w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} 141 | .w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} 142 | .w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} 143 | .w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} 144 | .w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} 145 | .w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} 146 | .w3-left{float:left!important}.w3-right{float:right!important} 147 | .w3-button:hover{color:#000!important;background-color:#ccc!important} 148 | .w3-transparent,.w3-hover-none:hover{background-color:transparent!important} 149 | .w3-hover-none:hover{box-shadow:none!important} 150 | /* Colors */ 151 | .w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} 152 | .w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} 153 | .w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} 154 | .w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} 155 | .w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} 156 | .w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} 157 | .w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important} 158 | .w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} 159 | .w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} 160 | .w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} 161 | .w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} 162 | .w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} 163 | .w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} 164 | .w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} 165 | .w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} 166 | .w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} 167 | .w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} 168 | .w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} 169 | .w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} 170 | .w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} 171 | .w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} 172 | .w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} 173 | .w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} 174 | .w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important} 175 | .w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important} 176 | .w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important} 177 | .w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important} 178 | .w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important} 179 | .w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important} 180 | .w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important} 181 | .w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} 182 | .w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} 183 | .w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} 184 | .w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} 185 | .w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} 186 | .w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} 187 | .w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important} 188 | .w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} 189 | .w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} 190 | .w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} 191 | .w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} 192 | .w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} 193 | .w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} 194 | .w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} 195 | .w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} 196 | .w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} 197 | .w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} 198 | .w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} 199 | .w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} 200 | .w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} 201 | .w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} 202 | .w3-text-white,.w3-hover-text-white:hover{color:#fff!important} 203 | .w3-text-black,.w3-hover-text-black:hover{color:#000!important} 204 | .w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important} 205 | .w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important} 206 | .w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important} 207 | .w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} 208 | .w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} 209 | .w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} 210 | .w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} 211 | .w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} 212 | .w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} 213 | .w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important} 214 | .w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} 215 | .w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} 216 | .w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} 217 | .w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} 218 | .w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} 219 | .w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} 220 | .w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} 221 | .w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} 222 | .w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} 223 | .w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} 224 | .w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} 225 | .w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} 226 | .w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} 227 | .w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} 228 | .w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} 229 | .w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} 230 | .w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important} 231 | .w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important} 232 | .w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important} 233 | .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} 234 | .w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} --------------------------------------------------------------------------------