From 9d5b54a5ea72a8f6f7beaac5f33e7cfa245ffb7b Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Tue, 14 Apr 2020 15:58:24 +0200 Subject: [PATCH] - SAML OK - TOTP OK - STATUS Checker (to do : code) - EDL Web edit --- .../API/StatusCheckerController.php | 44 + .../Auth/ConfirmPasswordController.php | 40 - .../Auth/ForgotPasswordController.php | 22 - app/Http/Controllers/Auth/LoginController.php | 40 - .../Controllers/Auth/RegisterController.php | 73 - .../Auth/ResetPasswordController.php | 30 - .../Auth/VerificationController.php | 42 - app/Http/Controllers/HomeController.php | 11 +- app/Http/Controllers/OTPController.php | 46 + app/Http/Controllers/ProjectsController.php | 128 + .../Controllers/StatusCheckerController.php | 14 + app/Http/Kernel.php | 6 + app/Http/Middleware/Authenticate.php | 4 +- .../Middleware/RedirectIfAuthenticated.php | 10 +- app/Providers/AppServiceProvider.php | 5 +- app/Providers/EventServiceProvider.php | 25 +- app/Providers/RouteServiceProvider.php | 2 +- composer.json | 4 +- config/app.php | 4 +- public/css/app.css | 6097 +++++++++++++++++ public/js/app.js | 396 +- resources/js/app.js | 2 +- resources/js/components/ExampleComponent.vue | 23 - resources/js/components/OTPFormComponent.vue | 78 + resources/sass/app.scss | 52 + resources/views/auth/login.blade.php | 73 - .../views/auth/passwords/email.blade.php | 47 - .../views/auth/passwords/reset.blade.php | 65 - resources/views/auth/register.blade.php | 77 - resources/views/auth/unauthorized.blade.php | 12 + .../views/auth/verification_failed.blade.php | 11 + resources/views/auth/verify.blade.php | 15 +- resources/views/home.blade.php | 12 +- resources/views/layouts/app.blade.php | 30 +- resources/views/projects/edit.blade.php | 383 ++ resources/views/projects/index.blade.php | 49 + .../views/status-checker/index.blade.php | 78 + resources/views/welcome.blade.php | 100 - routes/api.php | 2 + routes/web.php | 19 +- 40 files changed, 7432 insertions(+), 739 deletions(-) create mode 100644 app/Http/Controllers/API/StatusCheckerController.php delete mode 100644 app/Http/Controllers/Auth/ConfirmPasswordController.php delete mode 100644 app/Http/Controllers/Auth/ForgotPasswordController.php delete mode 100644 app/Http/Controllers/Auth/LoginController.php delete mode 100644 app/Http/Controllers/Auth/RegisterController.php delete mode 100644 app/Http/Controllers/Auth/ResetPasswordController.php delete mode 100644 app/Http/Controllers/Auth/VerificationController.php create mode 100644 app/Http/Controllers/OTPController.php create mode 100644 app/Http/Controllers/ProjectsController.php create mode 100644 app/Http/Controllers/StatusCheckerController.php delete mode 100644 resources/js/components/ExampleComponent.vue create mode 100644 resources/js/components/OTPFormComponent.vue delete mode 100644 resources/views/auth/login.blade.php delete mode 100644 resources/views/auth/passwords/email.blade.php delete mode 100644 resources/views/auth/passwords/reset.blade.php delete mode 100644 resources/views/auth/register.blade.php create mode 100644 resources/views/auth/unauthorized.blade.php create mode 100644 resources/views/auth/verification_failed.blade.php create mode 100644 resources/views/projects/edit.blade.php create mode 100644 resources/views/projects/index.blade.php create mode 100644 resources/views/status-checker/index.blade.php delete mode 100644 resources/views/welcome.blade.php diff --git a/app/Http/Controllers/API/StatusCheckerController.php b/app/Http/Controllers/API/StatusCheckerController.php new file mode 100644 index 0000000..0dfe435 --- /dev/null +++ b/app/Http/Controllers/API/StatusCheckerController.php @@ -0,0 +1,44 @@ +token; + $datas = $request->datas; + + if ($token !== 'CE8S52Qq7stf5k8frF4T') + return response('Unauthorized', 401); + + $oDatas = json_decode($datas); + + $app_uuid = $oDatas->uuid; + $sitemap = $oDatas->sitemap; + $robots = $oDatas->robots; + $code = json_encode($oDatas->code); + $logs = $oDatas->logs; + + $project_sc = ProjectsStatusChecker::where('project_uuid', '=', $app_uuid)->first(); + if (!$project_sc) { + $project = Projects::where('uuid', '=', $app_uuid)->first(); + if (!$project) + return response('Unknown', 404); + $project_sc = new ProjectsStatusChecker(); + $project_sc->project_uuid = $app_uuid; + } + + $project_sc->code = $code; + $project_sc->sitemap = $sitemap; + $project_sc->robots = $robots; + $project_sc->logs = $logs; + $project_sc->save(); + + return response('OK'); + } +} diff --git a/app/Http/Controllers/Auth/ConfirmPasswordController.php b/app/Http/Controllers/Auth/ConfirmPasswordController.php deleted file mode 100644 index 138c1f0..0000000 --- a/app/Http/Controllers/Auth/ConfirmPasswordController.php +++ /dev/null @@ -1,40 +0,0 @@ -middleware('auth'); - } -} diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php deleted file mode 100644 index 465c39c..0000000 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ /dev/null @@ -1,22 +0,0 @@ -middleware('guest')->except('logout'); - } -} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php deleted file mode 100644 index c6a6de6..0000000 --- a/app/Http/Controllers/Auth/RegisterController.php +++ /dev/null @@ -1,73 +0,0 @@ -middleware('guest'); - } - - /** - * Get a validator for an incoming registration request. - * - * @param array $data - * @return \Illuminate\Contracts\Validation\Validator - */ - protected function validator(array $data) - { - return Validator::make($data, [ - 'name' => ['required', 'string', 'max:255'], - 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], - 'password' => ['required', 'string', 'min:8', 'confirmed'], - ]); - } - - /** - * Create a new user instance after a valid registration. - * - * @param array $data - * @return \App\User - */ - protected function create(array $data) - { - return User::create([ - 'name' => $data['name'], - 'email' => $data['email'], - 'password' => Hash::make($data['password']), - ]); - } -} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php deleted file mode 100644 index b1726a3..0000000 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ /dev/null @@ -1,30 +0,0 @@ -middleware('auth'); - $this->middleware('signed')->only('verify'); - $this->middleware('throttle:6,1')->only('verify', 'resend'); - } -} diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 7cbc2c3..81dce69 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -6,16 +6,6 @@ use Illuminate\Http\Request; class HomeController extends Controller { - /** - * Create a new controller instance. - * - * @return void - */ - public function __construct() - { - $this->middleware('auth'); - } - /** * Show the application dashboard. * @@ -23,6 +13,7 @@ class HomeController extends Controller */ public function index() { + // otpauth://totp/LDC%20WEB:vincent.bridier@ldc.fr?secret=JWAQXGWVH2UDGEPFIY6IOHDZIY&issuer=LDC%20WEB return view('home'); } } diff --git a/app/Http/Controllers/OTPController.php b/app/Http/Controllers/OTPController.php new file mode 100644 index 0000000..a4cfd35 --- /dev/null +++ b/app/Http/Controllers/OTPController.php @@ -0,0 +1,46 @@ +get('tmpUserOTP'); + if (!$user) + return redirect(RouteServiceProvider::HOME); + return view('auth.verify'); + } + + public function check(Request $request) { + $otp1 = $request->otp1; + $otp2 = $request->otp2; + $otp3 = $request->otp3; + $otp4 = $request->otp4; + $otp5 = $request->otp5; + $otp6 = $request->otp6; + + $otp = $otp1 . $otp2 . $otp3 . $otp4 . $otp5 . $otp6; + $user = session()->get('tmpUserOTP'); + if (!$user) + return redirect(RouteServiceProvider::HOME); + $lastCode = (new Totp())->GenerateToken(Base32::decode($user->totp_secret), Carbon::now()->subSeconds(30)->timestamp); + $code = (new Totp())->GenerateToken(Base32::decode($user->totp_secret)); + + if ($otp === $code || $otp === $lastCode) { + Auth::login($user); + return redirect(RouteServiceProvider::HOME); + } else { + Auth::logout(); + Session::flush(); + return redirect()->route('verification_failed'); + } + } + +} diff --git a/app/Http/Controllers/ProjectsController.php b/app/Http/Controllers/ProjectsController.php new file mode 100644 index 0000000..e892f6e --- /dev/null +++ b/app/Http/Controllers/ProjectsController.php @@ -0,0 +1,128 @@ + $projects]); + } + + public function edit(Request $request) { + $uuid = $request->uuid; + $project = Projects::where('uuid', '=', $uuid)->first(); + if (!$project) + abort(404); + + $dev_db_server = Servers::where([ + ['env', 'DEV'], + ['type', 'DB'] + ])->get(); + $dev_web_server = Servers::where([ + ['env', 'DEV'], + ['type', 'WEB'] + ])->get(); + $prod_db_server = Servers::where([ + ['env', 'PROD'], + ['type', 'DB'] + ])->get(); + $prod_web_server = Servers::where([ + ['env', 'PROD'], + ['type', 'WEB'] + ])->get(); + return view('projects.edit', ['project' => $project, 'dev_db_server' => $dev_db_server, 'dev_web_server' => $dev_web_server, 'prod_db_server' => $prod_db_server, 'prod_web_server' => $prod_web_server]); + } + + public function update(Request $request) { + $uuid = $request->uuid; + $project = Projects::where('uuid', '=', $uuid)->first(); + if (!$project) + abort(404); + + $name = $request->name; + $display_name = $request->display_name; + $php = $request->php; + $type = $request->type; + $https = $request->https; + $git_repo = $request->git_repo; + $git_user = $request->git_user; + $git_pwd = $request->git_pwd; + $prod_url = $request->prod_url; + $dev_url = $request->dev_url; + $prod_certificats = $request->prod_certificats; + $dev_certificats = $request->dev_certificats; + $prod_document_root = $request->prod_document_root; + $dev_document_root = $request->dev_document_root; + $prod_unix_user = $request->prod_unix_user; + $dev_unix_user = $request->dev_unix_user; + $prod_unix_pwd = $request->prod_unix_pwd; + $dev_unix_pwd = $request->dev_unix_pwd; + $prod_db_user = $request->prod_db_user; + $dev_db_user = $request->dev_db_user; + $prod_db_pwd = $request->prod_db_pwd; + $dev_db_pwd = $request->dev_db_pwd; + $prod_db_schema = $request->prod_db_schema; + $dev_db_schema = $request->dev_db_schema; + $prod_db_server_id = $request->prod_db_server_id; + $dev_db_server_id = $request->dev_db_server_id; + $prod_web_server_id = $request->prod_web_server_id; + $dev_web_server_id = $request->dev_web_server_id; + $prod_comment = $request->prod_comment; + $dev_comment = $request->dev_comment; + $prod_eai = $request->prod_eai; + $dev_eai = $request->dev_eai; + $prod_whitelist_fw = $request->prod_whitelist_fw; + $dev_whitelist_fw = $request->dev_whitelist_fw; + $prod_redirect_dns = $request->prod_redirect_dns; + $dev_redirect_dns = $request->dev_redirect_dns; + $dev_htaccess_user = $request->dev_htaccess_user; + $dev_htaccess_pwd = $request->dev_htaccess_pwd; + + $project->name = $name; + $project->display_name = $display_name; + $project->php = $php; + $project->type = $type; + $project->https = $https; + $project->git_repo = $git_repo; + $project->git_user = $git_user; + $project->git_pwd = $git_pwd; + $project->prod_url = $prod_url; + $project->dev_url = $dev_url; + $project->prod_certificats = $prod_certificats; + $project->dev_certificats = $dev_certificats; + $project->prod_document_root = $prod_document_root; + $project->dev_document_root = $dev_document_root; + $project->prod_unix_user = $prod_unix_user; + $project->dev_unix_user = $dev_unix_user; + $project->prod_unix_pwd = $prod_unix_pwd; + $project->dev_unix_pwd = $dev_unix_pwd; + $project->prod_db_user = $prod_db_user; + $project->dev_db_user = $dev_db_user; + $project->prod_db_pwd = $prod_db_pwd; + $project->dev_db_pwd = $dev_db_pwd; + $project->prod_db_schema = $prod_db_schema; + $project->dev_db_schema = $dev_db_schema; + $project->prod_db_server_id = $prod_db_server_id; + $project->dev_db_server_id = $dev_db_server_id; + $project->prod_web_server_id = $prod_web_server_id; + $project->dev_web_server_id = $dev_web_server_id; + $project->prod_comment = $prod_comment; + $project->dev_comment = $dev_comment; + $project->prod_eai = $prod_eai; + $project->dev_eai = $dev_eai; + $project->prod_whitelist_fw = $prod_whitelist_fw; + $project->dev_whitelist_fw = $dev_whitelist_fw; + $project->prod_redirect_dns = $prod_redirect_dns; + $project->dev_redirect_dns = $dev_redirect_dns; + $project->dev_htaccess_user = $dev_htaccess_user; + $project->dev_htaccess_pwd = $dev_htaccess_pwd; + $project->save(); + + return redirect()->route('projects.edit', ['uuid' => $project->uuid])->with('status', 'Sauvegardé !'); + } +} diff --git a/app/Http/Controllers/StatusCheckerController.php b/app/Http/Controllers/StatusCheckerController.php new file mode 100644 index 0000000..cd03fe7 --- /dev/null +++ b/app/Http/Controllers/StatusCheckerController.php @@ -0,0 +1,14 @@ + $projects]); + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index deb65e8..8c5491f 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -41,6 +41,12 @@ class Kernel extends HttpKernel 'throttle:60,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], + + 'saml' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + ], ]; /** diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 704089a..c89fea1 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -3,6 +3,7 @@ namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; +use Illuminate\Support\Facades\URL; class Authenticate extends Middleware { @@ -15,7 +16,8 @@ class Authenticate extends Middleware protected function redirectTo($request) { if (! $request->expectsJson()) { - return route('login'); + session(['redirectURL' => URL::full()]); + return route('saml2_login', 'ldc'); } } } diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 2395ddc..35bc55f 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -2,9 +2,11 @@ namespace App\Http\Middleware; +use Aacotroneo\Saml2\Saml2Auth; use App\Providers\RouteServiceProvider; use Closure; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\URL; class RedirectIfAuthenticated { @@ -18,8 +20,12 @@ class RedirectIfAuthenticated */ public function handle($request, Closure $next, $guard = null) { - if (Auth::guard($guard)->check()) { - return redirect(RouteServiceProvider::HOME); + if ($request->ajax()) { + return response('Unauthorized.', 401); // Or, return a response that causes client side js to redirect to '/routesPrefix/myIdp1/login' + } else { + $saml2Auth = new Saml2Auth(Saml2Auth::loadOneLoginAuthFromIpdConfig('ldc')); + session(['redirectURL' => URL::full()]); + return $saml2Auth->login(RouteServiceProvider::HOME); } return $next($request); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index ee8ca5b..e413ca9 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use Illuminate\Support\Facades\URL; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -23,6 +24,8 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { - // + if (!app()->environment('local')) { + URL::forceScheme('https'); + } } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 723a290..3488b2a 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,10 +2,14 @@ namespace App\Providers; +use Aacotroneo\Saml2\Events\Saml2LoginEvent; +use App\User; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Event; +use Illuminate\Support\Facades\Session; class EventServiceProvider extends ServiceProvider { @@ -29,6 +33,25 @@ class EventServiceProvider extends ServiceProvider { parent::boot(); - // + Event::listen('Aacotroneo\Saml2\Events\Saml2LoginEvent', function (Saml2LoginEvent $event) { + $messageId = $event->getSaml2Auth()->getLastMessageId(); + // TODO : Add your own code preventing reuse of a $messageId to stop replay attacks + + $user = $event->getSaml2User(); + $email = $user->getNameId(); + $lUser = User::where('email', '=', $email)->first(); + if (!$lUser) { + abort(redirect()->route('unauthorized')); + } + session(['sessionIndex' => $user->getSessionIndex()]); + session(['nameId' => $email]); + session(['tmpUserOTP' => $lUser]); + abort(redirect()->route('auth.verify')); + }); + + Event::listen('Aacotroneo\Saml2\Events\Saml2LogoutEvent', function ($event) { + Auth::logout(); + Session::save(); + }); } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 527eee3..269fabb 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -21,7 +21,7 @@ class RouteServiceProvider extends ServiceProvider * * @var string */ - public const HOME = '/home'; + public const HOME = '/'; /** * Define your route model bindings, pattern filters, etc. diff --git a/composer.json b/composer.json index 863df44..efb3197 100644 --- a/composer.json +++ b/composer.json @@ -9,10 +9,12 @@ "license": "MIT", "require": { "php": "^7.2", + "aacotroneo/laravel-saml2": "^2.1", "fideloper/proxy": "^4.0", "laravel/framework": "^6.2", "laravel/tinker": "^2.0", - "laravel/ui": "1.0" + "laravel/ui": "1.0", + "lfkeitel/phptotp": " 1.0" }, "require-dev": { "facade/ignition": "^1.4", diff --git a/config/app.php b/config/app.php index 9e5b36c..3ccb8ae 100644 --- a/config/app.php +++ b/config/app.php @@ -67,7 +67,7 @@ return [ | */ - 'timezone' => 'UTC', + 'timezone' => 'Europe/Paris', /* |-------------------------------------------------------------------------- @@ -80,7 +80,7 @@ return [ | */ - 'locale' => 'en', + 'locale' => 'fr', /* |-------------------------------------------------------------------------- diff --git a/public/css/app.css b/public/css/app.css index 41395b9..ca2b5cb 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -10882,3 +10882,6100 @@ a.text-dark:focus { } } +/*! + * Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ + +.fa, +.fas, +.far, +.fal, +.fad, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; +} + +.fa-lg { + font-size: 1.3333333333em; + line-height: 0.75em; + vertical-align: -0.0667em; +} + +.fa-xs { + font-size: 0.75em; +} + +.fa-sm { + font-size: 0.875em; +} + +.fa-1x { + font-size: 1em; +} + +.fa-2x { + font-size: 2em; +} + +.fa-3x { + font-size: 3em; +} + +.fa-4x { + font-size: 4em; +} + +.fa-5x { + font-size: 5em; +} + +.fa-6x { + font-size: 6em; +} + +.fa-7x { + font-size: 7em; +} + +.fa-8x { + font-size: 8em; +} + +.fa-9x { + font-size: 9em; +} + +.fa-10x { + font-size: 10em; +} + +.fa-fw { + text-align: center; + width: 1.25em; +} + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; +} + +.fa-ul > li { + position: relative; +} + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; +} + +.fa-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.fa-pull-left { + float: left; +} + +.fa-pull-right { + float: right; +} + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: 0.3em; +} + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: 0.3em; +} + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +@keyframes fa-spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + transform: rotate(90deg); +} + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + transform: rotate(180deg); +} + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + transform: rotate(270deg); +} + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + transform: scale(-1, 1); +} + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + transform: scale(1, -1); +} + +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + transform: scale(-1, -1); +} + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical, +:root .fa-flip-both { + -webkit-filter: none; + filter: none; +} + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; +} + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; +} + +.fa-stack-1x { + line-height: inherit; +} + +.fa-stack-2x { + font-size: 2em; +} + +.fa-inverse { + color: #fff; +} + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ + +.fa-500px:before { + content: "\F26E"; +} + +.fa-accessible-icon:before { + content: "\F368"; +} + +.fa-accusoft:before { + content: "\F369"; +} + +.fa-acquisitions-incorporated:before { + content: "\F6AF"; +} + +.fa-ad:before { + content: "\F641"; +} + +.fa-address-book:before { + content: "\F2B9"; +} + +.fa-address-card:before { + content: "\F2BB"; +} + +.fa-adjust:before { + content: "\F042"; +} + +.fa-adn:before { + content: "\F170"; +} + +.fa-adobe:before { + content: "\F778"; +} + +.fa-adversal:before { + content: "\F36A"; +} + +.fa-affiliatetheme:before { + content: "\F36B"; +} + +.fa-air-freshener:before { + content: "\F5D0"; +} + +.fa-airbnb:before { + content: "\F834"; +} + +.fa-algolia:before { + content: "\F36C"; +} + +.fa-align-center:before { + content: "\F037"; +} + +.fa-align-justify:before { + content: "\F039"; +} + +.fa-align-left:before { + content: "\F036"; +} + +.fa-align-right:before { + content: "\F038"; +} + +.fa-alipay:before { + content: "\F642"; +} + +.fa-allergies:before { + content: "\F461"; +} + +.fa-amazon:before { + content: "\F270"; +} + +.fa-amazon-pay:before { + content: "\F42C"; +} + +.fa-ambulance:before { + content: "\F0F9"; +} + +.fa-american-sign-language-interpreting:before { + content: "\F2A3"; +} + +.fa-amilia:before { + content: "\F36D"; +} + +.fa-anchor:before { + content: "\F13D"; +} + +.fa-android:before { + content: "\F17B"; +} + +.fa-angellist:before { + content: "\F209"; +} + +.fa-angle-double-down:before { + content: "\F103"; +} + +.fa-angle-double-left:before { + content: "\F100"; +} + +.fa-angle-double-right:before { + content: "\F101"; +} + +.fa-angle-double-up:before { + content: "\F102"; +} + +.fa-angle-down:before { + content: "\F107"; +} + +.fa-angle-left:before { + content: "\F104"; +} + +.fa-angle-right:before { + content: "\F105"; +} + +.fa-angle-up:before { + content: "\F106"; +} + +.fa-angry:before { + content: "\F556"; +} + +.fa-angrycreative:before { + content: "\F36E"; +} + +.fa-angular:before { + content: "\F420"; +} + +.fa-ankh:before { + content: "\F644"; +} + +.fa-app-store:before { + content: "\F36F"; +} + +.fa-app-store-ios:before { + content: "\F370"; +} + +.fa-apper:before { + content: "\F371"; +} + +.fa-apple:before { + content: "\F179"; +} + +.fa-apple-alt:before { + content: "\F5D1"; +} + +.fa-apple-pay:before { + content: "\F415"; +} + +.fa-archive:before { + content: "\F187"; +} + +.fa-archway:before { + content: "\F557"; +} + +.fa-arrow-alt-circle-down:before { + content: "\F358"; +} + +.fa-arrow-alt-circle-left:before { + content: "\F359"; +} + +.fa-arrow-alt-circle-right:before { + content: "\F35A"; +} + +.fa-arrow-alt-circle-up:before { + content: "\F35B"; +} + +.fa-arrow-circle-down:before { + content: "\F0AB"; +} + +.fa-arrow-circle-left:before { + content: "\F0A8"; +} + +.fa-arrow-circle-right:before { + content: "\F0A9"; +} + +.fa-arrow-circle-up:before { + content: "\F0AA"; +} + +.fa-arrow-down:before { + content: "\F063"; +} + +.fa-arrow-left:before { + content: "\F060"; +} + +.fa-arrow-right:before { + content: "\F061"; +} + +.fa-arrow-up:before { + content: "\F062"; +} + +.fa-arrows-alt:before { + content: "\F0B2"; +} + +.fa-arrows-alt-h:before { + content: "\F337"; +} + +.fa-arrows-alt-v:before { + content: "\F338"; +} + +.fa-artstation:before { + content: "\F77A"; +} + +.fa-assistive-listening-systems:before { + content: "\F2A2"; +} + +.fa-asterisk:before { + content: "\F069"; +} + +.fa-asymmetrik:before { + content: "\F372"; +} + +.fa-at:before { + content: "\F1FA"; +} + +.fa-atlas:before { + content: "\F558"; +} + +.fa-atlassian:before { + content: "\F77B"; +} + +.fa-atom:before { + content: "\F5D2"; +} + +.fa-audible:before { + content: "\F373"; +} + +.fa-audio-description:before { + content: "\F29E"; +} + +.fa-autoprefixer:before { + content: "\F41C"; +} + +.fa-avianex:before { + content: "\F374"; +} + +.fa-aviato:before { + content: "\F421"; +} + +.fa-award:before { + content: "\F559"; +} + +.fa-aws:before { + content: "\F375"; +} + +.fa-baby:before { + content: "\F77C"; +} + +.fa-baby-carriage:before { + content: "\F77D"; +} + +.fa-backspace:before { + content: "\F55A"; +} + +.fa-backward:before { + content: "\F04A"; +} + +.fa-bacon:before { + content: "\F7E5"; +} + +.fa-bahai:before { + content: "\F666"; +} + +.fa-balance-scale:before { + content: "\F24E"; +} + +.fa-balance-scale-left:before { + content: "\F515"; +} + +.fa-balance-scale-right:before { + content: "\F516"; +} + +.fa-ban:before { + content: "\F05E"; +} + +.fa-band-aid:before { + content: "\F462"; +} + +.fa-bandcamp:before { + content: "\F2D5"; +} + +.fa-barcode:before { + content: "\F02A"; +} + +.fa-bars:before { + content: "\F0C9"; +} + +.fa-baseball-ball:before { + content: "\F433"; +} + +.fa-basketball-ball:before { + content: "\F434"; +} + +.fa-bath:before { + content: "\F2CD"; +} + +.fa-battery-empty:before { + content: "\F244"; +} + +.fa-battery-full:before { + content: "\F240"; +} + +.fa-battery-half:before { + content: "\F242"; +} + +.fa-battery-quarter:before { + content: "\F243"; +} + +.fa-battery-three-quarters:before { + content: "\F241"; +} + +.fa-battle-net:before { + content: "\F835"; +} + +.fa-bed:before { + content: "\F236"; +} + +.fa-beer:before { + content: "\F0FC"; +} + +.fa-behance:before { + content: "\F1B4"; +} + +.fa-behance-square:before { + content: "\F1B5"; +} + +.fa-bell:before { + content: "\F0F3"; +} + +.fa-bell-slash:before { + content: "\F1F6"; +} + +.fa-bezier-curve:before { + content: "\F55B"; +} + +.fa-bible:before { + content: "\F647"; +} + +.fa-bicycle:before { + content: "\F206"; +} + +.fa-biking:before { + content: "\F84A"; +} + +.fa-bimobject:before { + content: "\F378"; +} + +.fa-binoculars:before { + content: "\F1E5"; +} + +.fa-biohazard:before { + content: "\F780"; +} + +.fa-birthday-cake:before { + content: "\F1FD"; +} + +.fa-bitbucket:before { + content: "\F171"; +} + +.fa-bitcoin:before { + content: "\F379"; +} + +.fa-bity:before { + content: "\F37A"; +} + +.fa-black-tie:before { + content: "\F27E"; +} + +.fa-blackberry:before { + content: "\F37B"; +} + +.fa-blender:before { + content: "\F517"; +} + +.fa-blender-phone:before { + content: "\F6B6"; +} + +.fa-blind:before { + content: "\F29D"; +} + +.fa-blog:before { + content: "\F781"; +} + +.fa-blogger:before { + content: "\F37C"; +} + +.fa-blogger-b:before { + content: "\F37D"; +} + +.fa-bluetooth:before { + content: "\F293"; +} + +.fa-bluetooth-b:before { + content: "\F294"; +} + +.fa-bold:before { + content: "\F032"; +} + +.fa-bolt:before { + content: "\F0E7"; +} + +.fa-bomb:before { + content: "\F1E2"; +} + +.fa-bone:before { + content: "\F5D7"; +} + +.fa-bong:before { + content: "\F55C"; +} + +.fa-book:before { + content: "\F02D"; +} + +.fa-book-dead:before { + content: "\F6B7"; +} + +.fa-book-medical:before { + content: "\F7E6"; +} + +.fa-book-open:before { + content: "\F518"; +} + +.fa-book-reader:before { + content: "\F5DA"; +} + +.fa-bookmark:before { + content: "\F02E"; +} + +.fa-bootstrap:before { + content: "\F836"; +} + +.fa-border-all:before { + content: "\F84C"; +} + +.fa-border-none:before { + content: "\F850"; +} + +.fa-border-style:before { + content: "\F853"; +} + +.fa-bowling-ball:before { + content: "\F436"; +} + +.fa-box:before { + content: "\F466"; +} + +.fa-box-open:before { + content: "\F49E"; +} + +.fa-box-tissue:before { + content: "\F95B"; +} + +.fa-boxes:before { + content: "\F468"; +} + +.fa-braille:before { + content: "\F2A1"; +} + +.fa-brain:before { + content: "\F5DC"; +} + +.fa-bread-slice:before { + content: "\F7EC"; +} + +.fa-briefcase:before { + content: "\F0B1"; +} + +.fa-briefcase-medical:before { + content: "\F469"; +} + +.fa-broadcast-tower:before { + content: "\F519"; +} + +.fa-broom:before { + content: "\F51A"; +} + +.fa-brush:before { + content: "\F55D"; +} + +.fa-btc:before { + content: "\F15A"; +} + +.fa-buffer:before { + content: "\F837"; +} + +.fa-bug:before { + content: "\F188"; +} + +.fa-building:before { + content: "\F1AD"; +} + +.fa-bullhorn:before { + content: "\F0A1"; +} + +.fa-bullseye:before { + content: "\F140"; +} + +.fa-burn:before { + content: "\F46A"; +} + +.fa-buromobelexperte:before { + content: "\F37F"; +} + +.fa-bus:before { + content: "\F207"; +} + +.fa-bus-alt:before { + content: "\F55E"; +} + +.fa-business-time:before { + content: "\F64A"; +} + +.fa-buy-n-large:before { + content: "\F8A6"; +} + +.fa-buysellads:before { + content: "\F20D"; +} + +.fa-calculator:before { + content: "\F1EC"; +} + +.fa-calendar:before { + content: "\F133"; +} + +.fa-calendar-alt:before { + content: "\F073"; +} + +.fa-calendar-check:before { + content: "\F274"; +} + +.fa-calendar-day:before { + content: "\F783"; +} + +.fa-calendar-minus:before { + content: "\F272"; +} + +.fa-calendar-plus:before { + content: "\F271"; +} + +.fa-calendar-times:before { + content: "\F273"; +} + +.fa-calendar-week:before { + content: "\F784"; +} + +.fa-camera:before { + content: "\F030"; +} + +.fa-camera-retro:before { + content: "\F083"; +} + +.fa-campground:before { + content: "\F6BB"; +} + +.fa-canadian-maple-leaf:before { + content: "\F785"; +} + +.fa-candy-cane:before { + content: "\F786"; +} + +.fa-cannabis:before { + content: "\F55F"; +} + +.fa-capsules:before { + content: "\F46B"; +} + +.fa-car:before { + content: "\F1B9"; +} + +.fa-car-alt:before { + content: "\F5DE"; +} + +.fa-car-battery:before { + content: "\F5DF"; +} + +.fa-car-crash:before { + content: "\F5E1"; +} + +.fa-car-side:before { + content: "\F5E4"; +} + +.fa-caravan:before { + content: "\F8FF"; +} + +.fa-caret-down:before { + content: "\F0D7"; +} + +.fa-caret-left:before { + content: "\F0D9"; +} + +.fa-caret-right:before { + content: "\F0DA"; +} + +.fa-caret-square-down:before { + content: "\F150"; +} + +.fa-caret-square-left:before { + content: "\F191"; +} + +.fa-caret-square-right:before { + content: "\F152"; +} + +.fa-caret-square-up:before { + content: "\F151"; +} + +.fa-caret-up:before { + content: "\F0D8"; +} + +.fa-carrot:before { + content: "\F787"; +} + +.fa-cart-arrow-down:before { + content: "\F218"; +} + +.fa-cart-plus:before { + content: "\F217"; +} + +.fa-cash-register:before { + content: "\F788"; +} + +.fa-cat:before { + content: "\F6BE"; +} + +.fa-cc-amazon-pay:before { + content: "\F42D"; +} + +.fa-cc-amex:before { + content: "\F1F3"; +} + +.fa-cc-apple-pay:before { + content: "\F416"; +} + +.fa-cc-diners-club:before { + content: "\F24C"; +} + +.fa-cc-discover:before { + content: "\F1F2"; +} + +.fa-cc-jcb:before { + content: "\F24B"; +} + +.fa-cc-mastercard:before { + content: "\F1F1"; +} + +.fa-cc-paypal:before { + content: "\F1F4"; +} + +.fa-cc-stripe:before { + content: "\F1F5"; +} + +.fa-cc-visa:before { + content: "\F1F0"; +} + +.fa-centercode:before { + content: "\F380"; +} + +.fa-centos:before { + content: "\F789"; +} + +.fa-certificate:before { + content: "\F0A3"; +} + +.fa-chair:before { + content: "\F6C0"; +} + +.fa-chalkboard:before { + content: "\F51B"; +} + +.fa-chalkboard-teacher:before { + content: "\F51C"; +} + +.fa-charging-station:before { + content: "\F5E7"; +} + +.fa-chart-area:before { + content: "\F1FE"; +} + +.fa-chart-bar:before { + content: "\F080"; +} + +.fa-chart-line:before { + content: "\F201"; +} + +.fa-chart-pie:before { + content: "\F200"; +} + +.fa-check:before { + content: "\F00C"; +} + +.fa-check-circle:before { + content: "\F058"; +} + +.fa-check-double:before { + content: "\F560"; +} + +.fa-check-square:before { + content: "\F14A"; +} + +.fa-cheese:before { + content: "\F7EF"; +} + +.fa-chess:before { + content: "\F439"; +} + +.fa-chess-bishop:before { + content: "\F43A"; +} + +.fa-chess-board:before { + content: "\F43C"; +} + +.fa-chess-king:before { + content: "\F43F"; +} + +.fa-chess-knight:before { + content: "\F441"; +} + +.fa-chess-pawn:before { + content: "\F443"; +} + +.fa-chess-queen:before { + content: "\F445"; +} + +.fa-chess-rook:before { + content: "\F447"; +} + +.fa-chevron-circle-down:before { + content: "\F13A"; +} + +.fa-chevron-circle-left:before { + content: "\F137"; +} + +.fa-chevron-circle-right:before { + content: "\F138"; +} + +.fa-chevron-circle-up:before { + content: "\F139"; +} + +.fa-chevron-down:before { + content: "\F078"; +} + +.fa-chevron-left:before { + content: "\F053"; +} + +.fa-chevron-right:before { + content: "\F054"; +} + +.fa-chevron-up:before { + content: "\F077"; +} + +.fa-child:before { + content: "\F1AE"; +} + +.fa-chrome:before { + content: "\F268"; +} + +.fa-chromecast:before { + content: "\F838"; +} + +.fa-church:before { + content: "\F51D"; +} + +.fa-circle:before { + content: "\F111"; +} + +.fa-circle-notch:before { + content: "\F1CE"; +} + +.fa-city:before { + content: "\F64F"; +} + +.fa-clinic-medical:before { + content: "\F7F2"; +} + +.fa-clipboard:before { + content: "\F328"; +} + +.fa-clipboard-check:before { + content: "\F46C"; +} + +.fa-clipboard-list:before { + content: "\F46D"; +} + +.fa-clock:before { + content: "\F017"; +} + +.fa-clone:before { + content: "\F24D"; +} + +.fa-closed-captioning:before { + content: "\F20A"; +} + +.fa-cloud:before { + content: "\F0C2"; +} + +.fa-cloud-download-alt:before { + content: "\F381"; +} + +.fa-cloud-meatball:before { + content: "\F73B"; +} + +.fa-cloud-moon:before { + content: "\F6C3"; +} + +.fa-cloud-moon-rain:before { + content: "\F73C"; +} + +.fa-cloud-rain:before { + content: "\F73D"; +} + +.fa-cloud-showers-heavy:before { + content: "\F740"; +} + +.fa-cloud-sun:before { + content: "\F6C4"; +} + +.fa-cloud-sun-rain:before { + content: "\F743"; +} + +.fa-cloud-upload-alt:before { + content: "\F382"; +} + +.fa-cloudscale:before { + content: "\F383"; +} + +.fa-cloudsmith:before { + content: "\F384"; +} + +.fa-cloudversify:before { + content: "\F385"; +} + +.fa-cocktail:before { + content: "\F561"; +} + +.fa-code:before { + content: "\F121"; +} + +.fa-code-branch:before { + content: "\F126"; +} + +.fa-codepen:before { + content: "\F1CB"; +} + +.fa-codiepie:before { + content: "\F284"; +} + +.fa-coffee:before { + content: "\F0F4"; +} + +.fa-cog:before { + content: "\F013"; +} + +.fa-cogs:before { + content: "\F085"; +} + +.fa-coins:before { + content: "\F51E"; +} + +.fa-columns:before { + content: "\F0DB"; +} + +.fa-comment:before { + content: "\F075"; +} + +.fa-comment-alt:before { + content: "\F27A"; +} + +.fa-comment-dollar:before { + content: "\F651"; +} + +.fa-comment-dots:before { + content: "\F4AD"; +} + +.fa-comment-medical:before { + content: "\F7F5"; +} + +.fa-comment-slash:before { + content: "\F4B3"; +} + +.fa-comments:before { + content: "\F086"; +} + +.fa-comments-dollar:before { + content: "\F653"; +} + +.fa-compact-disc:before { + content: "\F51F"; +} + +.fa-compass:before { + content: "\F14E"; +} + +.fa-compress:before { + content: "\F066"; +} + +.fa-compress-alt:before { + content: "\F422"; +} + +.fa-compress-arrows-alt:before { + content: "\F78C"; +} + +.fa-concierge-bell:before { + content: "\F562"; +} + +.fa-confluence:before { + content: "\F78D"; +} + +.fa-connectdevelop:before { + content: "\F20E"; +} + +.fa-contao:before { + content: "\F26D"; +} + +.fa-cookie:before { + content: "\F563"; +} + +.fa-cookie-bite:before { + content: "\F564"; +} + +.fa-copy:before { + content: "\F0C5"; +} + +.fa-copyright:before { + content: "\F1F9"; +} + +.fa-cotton-bureau:before { + content: "\F89E"; +} + +.fa-couch:before { + content: "\F4B8"; +} + +.fa-cpanel:before { + content: "\F388"; +} + +.fa-creative-commons:before { + content: "\F25E"; +} + +.fa-creative-commons-by:before { + content: "\F4E7"; +} + +.fa-creative-commons-nc:before { + content: "\F4E8"; +} + +.fa-creative-commons-nc-eu:before { + content: "\F4E9"; +} + +.fa-creative-commons-nc-jp:before { + content: "\F4EA"; +} + +.fa-creative-commons-nd:before { + content: "\F4EB"; +} + +.fa-creative-commons-pd:before { + content: "\F4EC"; +} + +.fa-creative-commons-pd-alt:before { + content: "\F4ED"; +} + +.fa-creative-commons-remix:before { + content: "\F4EE"; +} + +.fa-creative-commons-sa:before { + content: "\F4EF"; +} + +.fa-creative-commons-sampling:before { + content: "\F4F0"; +} + +.fa-creative-commons-sampling-plus:before { + content: "\F4F1"; +} + +.fa-creative-commons-share:before { + content: "\F4F2"; +} + +.fa-creative-commons-zero:before { + content: "\F4F3"; +} + +.fa-credit-card:before { + content: "\F09D"; +} + +.fa-critical-role:before { + content: "\F6C9"; +} + +.fa-crop:before { + content: "\F125"; +} + +.fa-crop-alt:before { + content: "\F565"; +} + +.fa-cross:before { + content: "\F654"; +} + +.fa-crosshairs:before { + content: "\F05B"; +} + +.fa-crow:before { + content: "\F520"; +} + +.fa-crown:before { + content: "\F521"; +} + +.fa-crutch:before { + content: "\F7F7"; +} + +.fa-css3:before { + content: "\F13C"; +} + +.fa-css3-alt:before { + content: "\F38B"; +} + +.fa-cube:before { + content: "\F1B2"; +} + +.fa-cubes:before { + content: "\F1B3"; +} + +.fa-cut:before { + content: "\F0C4"; +} + +.fa-cuttlefish:before { + content: "\F38C"; +} + +.fa-d-and-d:before { + content: "\F38D"; +} + +.fa-d-and-d-beyond:before { + content: "\F6CA"; +} + +.fa-dailymotion:before { + content: "\F952"; +} + +.fa-dashcube:before { + content: "\F210"; +} + +.fa-database:before { + content: "\F1C0"; +} + +.fa-deaf:before { + content: "\F2A4"; +} + +.fa-delicious:before { + content: "\F1A5"; +} + +.fa-democrat:before { + content: "\F747"; +} + +.fa-deploydog:before { + content: "\F38E"; +} + +.fa-deskpro:before { + content: "\F38F"; +} + +.fa-desktop:before { + content: "\F108"; +} + +.fa-dev:before { + content: "\F6CC"; +} + +.fa-deviantart:before { + content: "\F1BD"; +} + +.fa-dharmachakra:before { + content: "\F655"; +} + +.fa-dhl:before { + content: "\F790"; +} + +.fa-diagnoses:before { + content: "\F470"; +} + +.fa-diaspora:before { + content: "\F791"; +} + +.fa-dice:before { + content: "\F522"; +} + +.fa-dice-d20:before { + content: "\F6CF"; +} + +.fa-dice-d6:before { + content: "\F6D1"; +} + +.fa-dice-five:before { + content: "\F523"; +} + +.fa-dice-four:before { + content: "\F524"; +} + +.fa-dice-one:before { + content: "\F525"; +} + +.fa-dice-six:before { + content: "\F526"; +} + +.fa-dice-three:before { + content: "\F527"; +} + +.fa-dice-two:before { + content: "\F528"; +} + +.fa-digg:before { + content: "\F1A6"; +} + +.fa-digital-ocean:before { + content: "\F391"; +} + +.fa-digital-tachograph:before { + content: "\F566"; +} + +.fa-directions:before { + content: "\F5EB"; +} + +.fa-discord:before { + content: "\F392"; +} + +.fa-discourse:before { + content: "\F393"; +} + +.fa-disease:before { + content: "\F7FA"; +} + +.fa-divide:before { + content: "\F529"; +} + +.fa-dizzy:before { + content: "\F567"; +} + +.fa-dna:before { + content: "\F471"; +} + +.fa-dochub:before { + content: "\F394"; +} + +.fa-docker:before { + content: "\F395"; +} + +.fa-dog:before { + content: "\F6D3"; +} + +.fa-dollar-sign:before { + content: "\F155"; +} + +.fa-dolly:before { + content: "\F472"; +} + +.fa-dolly-flatbed:before { + content: "\F474"; +} + +.fa-donate:before { + content: "\F4B9"; +} + +.fa-door-closed:before { + content: "\F52A"; +} + +.fa-door-open:before { + content: "\F52B"; +} + +.fa-dot-circle:before { + content: "\F192"; +} + +.fa-dove:before { + content: "\F4BA"; +} + +.fa-download:before { + content: "\F019"; +} + +.fa-draft2digital:before { + content: "\F396"; +} + +.fa-drafting-compass:before { + content: "\F568"; +} + +.fa-dragon:before { + content: "\F6D5"; +} + +.fa-draw-polygon:before { + content: "\F5EE"; +} + +.fa-dribbble:before { + content: "\F17D"; +} + +.fa-dribbble-square:before { + content: "\F397"; +} + +.fa-dropbox:before { + content: "\F16B"; +} + +.fa-drum:before { + content: "\F569"; +} + +.fa-drum-steelpan:before { + content: "\F56A"; +} + +.fa-drumstick-bite:before { + content: "\F6D7"; +} + +.fa-drupal:before { + content: "\F1A9"; +} + +.fa-dumbbell:before { + content: "\F44B"; +} + +.fa-dumpster:before { + content: "\F793"; +} + +.fa-dumpster-fire:before { + content: "\F794"; +} + +.fa-dungeon:before { + content: "\F6D9"; +} + +.fa-dyalog:before { + content: "\F399"; +} + +.fa-earlybirds:before { + content: "\F39A"; +} + +.fa-ebay:before { + content: "\F4F4"; +} + +.fa-edge:before { + content: "\F282"; +} + +.fa-edit:before { + content: "\F044"; +} + +.fa-egg:before { + content: "\F7FB"; +} + +.fa-eject:before { + content: "\F052"; +} + +.fa-elementor:before { + content: "\F430"; +} + +.fa-ellipsis-h:before { + content: "\F141"; +} + +.fa-ellipsis-v:before { + content: "\F142"; +} + +.fa-ello:before { + content: "\F5F1"; +} + +.fa-ember:before { + content: "\F423"; +} + +.fa-empire:before { + content: "\F1D1"; +} + +.fa-envelope:before { + content: "\F0E0"; +} + +.fa-envelope-open:before { + content: "\F2B6"; +} + +.fa-envelope-open-text:before { + content: "\F658"; +} + +.fa-envelope-square:before { + content: "\F199"; +} + +.fa-envira:before { + content: "\F299"; +} + +.fa-equals:before { + content: "\F52C"; +} + +.fa-eraser:before { + content: "\F12D"; +} + +.fa-erlang:before { + content: "\F39D"; +} + +.fa-ethereum:before { + content: "\F42E"; +} + +.fa-ethernet:before { + content: "\F796"; +} + +.fa-etsy:before { + content: "\F2D7"; +} + +.fa-euro-sign:before { + content: "\F153"; +} + +.fa-evernote:before { + content: "\F839"; +} + +.fa-exchange-alt:before { + content: "\F362"; +} + +.fa-exclamation:before { + content: "\F12A"; +} + +.fa-exclamation-circle:before { + content: "\F06A"; +} + +.fa-exclamation-triangle:before { + content: "\F071"; +} + +.fa-expand:before { + content: "\F065"; +} + +.fa-expand-alt:before { + content: "\F424"; +} + +.fa-expand-arrows-alt:before { + content: "\F31E"; +} + +.fa-expeditedssl:before { + content: "\F23E"; +} + +.fa-external-link-alt:before { + content: "\F35D"; +} + +.fa-external-link-square-alt:before { + content: "\F360"; +} + +.fa-eye:before { + content: "\F06E"; +} + +.fa-eye-dropper:before { + content: "\F1FB"; +} + +.fa-eye-slash:before { + content: "\F070"; +} + +.fa-facebook:before { + content: "\F09A"; +} + +.fa-facebook-f:before { + content: "\F39E"; +} + +.fa-facebook-messenger:before { + content: "\F39F"; +} + +.fa-facebook-square:before { + content: "\F082"; +} + +.fa-fan:before { + content: "\F863"; +} + +.fa-fantasy-flight-games:before { + content: "\F6DC"; +} + +.fa-fast-backward:before { + content: "\F049"; +} + +.fa-fast-forward:before { + content: "\F050"; +} + +.fa-faucet:before { + content: "\F905"; +} + +.fa-fax:before { + content: "\F1AC"; +} + +.fa-feather:before { + content: "\F52D"; +} + +.fa-feather-alt:before { + content: "\F56B"; +} + +.fa-fedex:before { + content: "\F797"; +} + +.fa-fedora:before { + content: "\F798"; +} + +.fa-female:before { + content: "\F182"; +} + +.fa-fighter-jet:before { + content: "\F0FB"; +} + +.fa-figma:before { + content: "\F799"; +} + +.fa-file:before { + content: "\F15B"; +} + +.fa-file-alt:before { + content: "\F15C"; +} + +.fa-file-archive:before { + content: "\F1C6"; +} + +.fa-file-audio:before { + content: "\F1C7"; +} + +.fa-file-code:before { + content: "\F1C9"; +} + +.fa-file-contract:before { + content: "\F56C"; +} + +.fa-file-csv:before { + content: "\F6DD"; +} + +.fa-file-download:before { + content: "\F56D"; +} + +.fa-file-excel:before { + content: "\F1C3"; +} + +.fa-file-export:before { + content: "\F56E"; +} + +.fa-file-image:before { + content: "\F1C5"; +} + +.fa-file-import:before { + content: "\F56F"; +} + +.fa-file-invoice:before { + content: "\F570"; +} + +.fa-file-invoice-dollar:before { + content: "\F571"; +} + +.fa-file-medical:before { + content: "\F477"; +} + +.fa-file-medical-alt:before { + content: "\F478"; +} + +.fa-file-pdf:before { + content: "\F1C1"; +} + +.fa-file-powerpoint:before { + content: "\F1C4"; +} + +.fa-file-prescription:before { + content: "\F572"; +} + +.fa-file-signature:before { + content: "\F573"; +} + +.fa-file-upload:before { + content: "\F574"; +} + +.fa-file-video:before { + content: "\F1C8"; +} + +.fa-file-word:before { + content: "\F1C2"; +} + +.fa-fill:before { + content: "\F575"; +} + +.fa-fill-drip:before { + content: "\F576"; +} + +.fa-film:before { + content: "\F008"; +} + +.fa-filter:before { + content: "\F0B0"; +} + +.fa-fingerprint:before { + content: "\F577"; +} + +.fa-fire:before { + content: "\F06D"; +} + +.fa-fire-alt:before { + content: "\F7E4"; +} + +.fa-fire-extinguisher:before { + content: "\F134"; +} + +.fa-firefox:before { + content: "\F269"; +} + +.fa-firefox-browser:before { + content: "\F907"; +} + +.fa-first-aid:before { + content: "\F479"; +} + +.fa-first-order:before { + content: "\F2B0"; +} + +.fa-first-order-alt:before { + content: "\F50A"; +} + +.fa-firstdraft:before { + content: "\F3A1"; +} + +.fa-fish:before { + content: "\F578"; +} + +.fa-fist-raised:before { + content: "\F6DE"; +} + +.fa-flag:before { + content: "\F024"; +} + +.fa-flag-checkered:before { + content: "\F11E"; +} + +.fa-flag-usa:before { + content: "\F74D"; +} + +.fa-flask:before { + content: "\F0C3"; +} + +.fa-flickr:before { + content: "\F16E"; +} + +.fa-flipboard:before { + content: "\F44D"; +} + +.fa-flushed:before { + content: "\F579"; +} + +.fa-fly:before { + content: "\F417"; +} + +.fa-folder:before { + content: "\F07B"; +} + +.fa-folder-minus:before { + content: "\F65D"; +} + +.fa-folder-open:before { + content: "\F07C"; +} + +.fa-folder-plus:before { + content: "\F65E"; +} + +.fa-font:before { + content: "\F031"; +} + +.fa-font-awesome:before { + content: "\F2B4"; +} + +.fa-font-awesome-alt:before { + content: "\F35C"; +} + +.fa-font-awesome-flag:before { + content: "\F425"; +} + +.fa-font-awesome-logo-full:before { + content: "\F4E6"; +} + +.fa-fonticons:before { + content: "\F280"; +} + +.fa-fonticons-fi:before { + content: "\F3A2"; +} + +.fa-football-ball:before { + content: "\F44E"; +} + +.fa-fort-awesome:before { + content: "\F286"; +} + +.fa-fort-awesome-alt:before { + content: "\F3A3"; +} + +.fa-forumbee:before { + content: "\F211"; +} + +.fa-forward:before { + content: "\F04E"; +} + +.fa-foursquare:before { + content: "\F180"; +} + +.fa-free-code-camp:before { + content: "\F2C5"; +} + +.fa-freebsd:before { + content: "\F3A4"; +} + +.fa-frog:before { + content: "\F52E"; +} + +.fa-frown:before { + content: "\F119"; +} + +.fa-frown-open:before { + content: "\F57A"; +} + +.fa-fulcrum:before { + content: "\F50B"; +} + +.fa-funnel-dollar:before { + content: "\F662"; +} + +.fa-futbol:before { + content: "\F1E3"; +} + +.fa-galactic-republic:before { + content: "\F50C"; +} + +.fa-galactic-senate:before { + content: "\F50D"; +} + +.fa-gamepad:before { + content: "\F11B"; +} + +.fa-gas-pump:before { + content: "\F52F"; +} + +.fa-gavel:before { + content: "\F0E3"; +} + +.fa-gem:before { + content: "\F3A5"; +} + +.fa-genderless:before { + content: "\F22D"; +} + +.fa-get-pocket:before { + content: "\F265"; +} + +.fa-gg:before { + content: "\F260"; +} + +.fa-gg-circle:before { + content: "\F261"; +} + +.fa-ghost:before { + content: "\F6E2"; +} + +.fa-gift:before { + content: "\F06B"; +} + +.fa-gifts:before { + content: "\F79C"; +} + +.fa-git:before { + content: "\F1D3"; +} + +.fa-git-alt:before { + content: "\F841"; +} + +.fa-git-square:before { + content: "\F1D2"; +} + +.fa-github:before { + content: "\F09B"; +} + +.fa-github-alt:before { + content: "\F113"; +} + +.fa-github-square:before { + content: "\F092"; +} + +.fa-gitkraken:before { + content: "\F3A6"; +} + +.fa-gitlab:before { + content: "\F296"; +} + +.fa-gitter:before { + content: "\F426"; +} + +.fa-glass-cheers:before { + content: "\F79F"; +} + +.fa-glass-martini:before { + content: "\F000"; +} + +.fa-glass-martini-alt:before { + content: "\F57B"; +} + +.fa-glass-whiskey:before { + content: "\F7A0"; +} + +.fa-glasses:before { + content: "\F530"; +} + +.fa-glide:before { + content: "\F2A5"; +} + +.fa-glide-g:before { + content: "\F2A6"; +} + +.fa-globe:before { + content: "\F0AC"; +} + +.fa-globe-africa:before { + content: "\F57C"; +} + +.fa-globe-americas:before { + content: "\F57D"; +} + +.fa-globe-asia:before { + content: "\F57E"; +} + +.fa-globe-europe:before { + content: "\F7A2"; +} + +.fa-gofore:before { + content: "\F3A7"; +} + +.fa-golf-ball:before { + content: "\F450"; +} + +.fa-goodreads:before { + content: "\F3A8"; +} + +.fa-goodreads-g:before { + content: "\F3A9"; +} + +.fa-google:before { + content: "\F1A0"; +} + +.fa-google-drive:before { + content: "\F3AA"; +} + +.fa-google-play:before { + content: "\F3AB"; +} + +.fa-google-plus:before { + content: "\F2B3"; +} + +.fa-google-plus-g:before { + content: "\F0D5"; +} + +.fa-google-plus-square:before { + content: "\F0D4"; +} + +.fa-google-wallet:before { + content: "\F1EE"; +} + +.fa-gopuram:before { + content: "\F664"; +} + +.fa-graduation-cap:before { + content: "\F19D"; +} + +.fa-gratipay:before { + content: "\F184"; +} + +.fa-grav:before { + content: "\F2D6"; +} + +.fa-greater-than:before { + content: "\F531"; +} + +.fa-greater-than-equal:before { + content: "\F532"; +} + +.fa-grimace:before { + content: "\F57F"; +} + +.fa-grin:before { + content: "\F580"; +} + +.fa-grin-alt:before { + content: "\F581"; +} + +.fa-grin-beam:before { + content: "\F582"; +} + +.fa-grin-beam-sweat:before { + content: "\F583"; +} + +.fa-grin-hearts:before { + content: "\F584"; +} + +.fa-grin-squint:before { + content: "\F585"; +} + +.fa-grin-squint-tears:before { + content: "\F586"; +} + +.fa-grin-stars:before { + content: "\F587"; +} + +.fa-grin-tears:before { + content: "\F588"; +} + +.fa-grin-tongue:before { + content: "\F589"; +} + +.fa-grin-tongue-squint:before { + content: "\F58A"; +} + +.fa-grin-tongue-wink:before { + content: "\F58B"; +} + +.fa-grin-wink:before { + content: "\F58C"; +} + +.fa-grip-horizontal:before { + content: "\F58D"; +} + +.fa-grip-lines:before { + content: "\F7A4"; +} + +.fa-grip-lines-vertical:before { + content: "\F7A5"; +} + +.fa-grip-vertical:before { + content: "\F58E"; +} + +.fa-gripfire:before { + content: "\F3AC"; +} + +.fa-grunt:before { + content: "\F3AD"; +} + +.fa-guitar:before { + content: "\F7A6"; +} + +.fa-gulp:before { + content: "\F3AE"; +} + +.fa-h-square:before { + content: "\F0FD"; +} + +.fa-hacker-news:before { + content: "\F1D4"; +} + +.fa-hacker-news-square:before { + content: "\F3AF"; +} + +.fa-hackerrank:before { + content: "\F5F7"; +} + +.fa-hamburger:before { + content: "\F805"; +} + +.fa-hammer:before { + content: "\F6E3"; +} + +.fa-hamsa:before { + content: "\F665"; +} + +.fa-hand-holding:before { + content: "\F4BD"; +} + +.fa-hand-holding-heart:before { + content: "\F4BE"; +} + +.fa-hand-holding-medical:before { + content: "\F95C"; +} + +.fa-hand-holding-usd:before { + content: "\F4C0"; +} + +.fa-hand-holding-water:before { + content: "\F4C1"; +} + +.fa-hand-lizard:before { + content: "\F258"; +} + +.fa-hand-middle-finger:before { + content: "\F806"; +} + +.fa-hand-paper:before { + content: "\F256"; +} + +.fa-hand-peace:before { + content: "\F25B"; +} + +.fa-hand-point-down:before { + content: "\F0A7"; +} + +.fa-hand-point-left:before { + content: "\F0A5"; +} + +.fa-hand-point-right:before { + content: "\F0A4"; +} + +.fa-hand-point-up:before { + content: "\F0A6"; +} + +.fa-hand-pointer:before { + content: "\F25A"; +} + +.fa-hand-rock:before { + content: "\F255"; +} + +.fa-hand-scissors:before { + content: "\F257"; +} + +.fa-hand-sparkles:before { + content: "\F95D"; +} + +.fa-hand-spock:before { + content: "\F259"; +} + +.fa-hands:before { + content: "\F4C2"; +} + +.fa-hands-helping:before { + content: "\F4C4"; +} + +.fa-hands-wash:before { + content: "\F95E"; +} + +.fa-handshake:before { + content: "\F2B5"; +} + +.fa-handshake-alt-slash:before { + content: "\F95F"; +} + +.fa-handshake-slash:before { + content: "\F960"; +} + +.fa-hanukiah:before { + content: "\F6E6"; +} + +.fa-hard-hat:before { + content: "\F807"; +} + +.fa-hashtag:before { + content: "\F292"; +} + +.fa-hat-cowboy:before { + content: "\F8C0"; +} + +.fa-hat-cowboy-side:before { + content: "\F8C1"; +} + +.fa-hat-wizard:before { + content: "\F6E8"; +} + +.fa-hdd:before { + content: "\F0A0"; +} + +.fa-head-side-cough:before { + content: "\F961"; +} + +.fa-head-side-cough-slash:before { + content: "\F962"; +} + +.fa-head-side-mask:before { + content: "\F963"; +} + +.fa-head-side-virus:before { + content: "\F964"; +} + +.fa-heading:before { + content: "\F1DC"; +} + +.fa-headphones:before { + content: "\F025"; +} + +.fa-headphones-alt:before { + content: "\F58F"; +} + +.fa-headset:before { + content: "\F590"; +} + +.fa-heart:before { + content: "\F004"; +} + +.fa-heart-broken:before { + content: "\F7A9"; +} + +.fa-heartbeat:before { + content: "\F21E"; +} + +.fa-helicopter:before { + content: "\F533"; +} + +.fa-highlighter:before { + content: "\F591"; +} + +.fa-hiking:before { + content: "\F6EC"; +} + +.fa-hippo:before { + content: "\F6ED"; +} + +.fa-hips:before { + content: "\F452"; +} + +.fa-hire-a-helper:before { + content: "\F3B0"; +} + +.fa-history:before { + content: "\F1DA"; +} + +.fa-hockey-puck:before { + content: "\F453"; +} + +.fa-holly-berry:before { + content: "\F7AA"; +} + +.fa-home:before { + content: "\F015"; +} + +.fa-hooli:before { + content: "\F427"; +} + +.fa-hornbill:before { + content: "\F592"; +} + +.fa-horse:before { + content: "\F6F0"; +} + +.fa-horse-head:before { + content: "\F7AB"; +} + +.fa-hospital:before { + content: "\F0F8"; +} + +.fa-hospital-alt:before { + content: "\F47D"; +} + +.fa-hospital-symbol:before { + content: "\F47E"; +} + +.fa-hospital-user:before { + content: "\F80D"; +} + +.fa-hot-tub:before { + content: "\F593"; +} + +.fa-hotdog:before { + content: "\F80F"; +} + +.fa-hotel:before { + content: "\F594"; +} + +.fa-hotjar:before { + content: "\F3B1"; +} + +.fa-hourglass:before { + content: "\F254"; +} + +.fa-hourglass-end:before { + content: "\F253"; +} + +.fa-hourglass-half:before { + content: "\F252"; +} + +.fa-hourglass-start:before { + content: "\F251"; +} + +.fa-house-damage:before { + content: "\F6F1"; +} + +.fa-house-user:before { + content: "\F965"; +} + +.fa-houzz:before { + content: "\F27C"; +} + +.fa-hryvnia:before { + content: "\F6F2"; +} + +.fa-html5:before { + content: "\F13B"; +} + +.fa-hubspot:before { + content: "\F3B2"; +} + +.fa-i-cursor:before { + content: "\F246"; +} + +.fa-ice-cream:before { + content: "\F810"; +} + +.fa-icicles:before { + content: "\F7AD"; +} + +.fa-icons:before { + content: "\F86D"; +} + +.fa-id-badge:before { + content: "\F2C1"; +} + +.fa-id-card:before { + content: "\F2C2"; +} + +.fa-id-card-alt:before { + content: "\F47F"; +} + +.fa-ideal:before { + content: "\F913"; +} + +.fa-igloo:before { + content: "\F7AE"; +} + +.fa-image:before { + content: "\F03E"; +} + +.fa-images:before { + content: "\F302"; +} + +.fa-imdb:before { + content: "\F2D8"; +} + +.fa-inbox:before { + content: "\F01C"; +} + +.fa-indent:before { + content: "\F03C"; +} + +.fa-industry:before { + content: "\F275"; +} + +.fa-infinity:before { + content: "\F534"; +} + +.fa-info:before { + content: "\F129"; +} + +.fa-info-circle:before { + content: "\F05A"; +} + +.fa-instagram:before { + content: "\F16D"; +} + +.fa-instagram-square:before { + content: "\F955"; +} + +.fa-intercom:before { + content: "\F7AF"; +} + +.fa-internet-explorer:before { + content: "\F26B"; +} + +.fa-invision:before { + content: "\F7B0"; +} + +.fa-ioxhost:before { + content: "\F208"; +} + +.fa-italic:before { + content: "\F033"; +} + +.fa-itch-io:before { + content: "\F83A"; +} + +.fa-itunes:before { + content: "\F3B4"; +} + +.fa-itunes-note:before { + content: "\F3B5"; +} + +.fa-java:before { + content: "\F4E4"; +} + +.fa-jedi:before { + content: "\F669"; +} + +.fa-jedi-order:before { + content: "\F50E"; +} + +.fa-jenkins:before { + content: "\F3B6"; +} + +.fa-jira:before { + content: "\F7B1"; +} + +.fa-joget:before { + content: "\F3B7"; +} + +.fa-joint:before { + content: "\F595"; +} + +.fa-joomla:before { + content: "\F1AA"; +} + +.fa-journal-whills:before { + content: "\F66A"; +} + +.fa-js:before { + content: "\F3B8"; +} + +.fa-js-square:before { + content: "\F3B9"; +} + +.fa-jsfiddle:before { + content: "\F1CC"; +} + +.fa-kaaba:before { + content: "\F66B"; +} + +.fa-kaggle:before { + content: "\F5FA"; +} + +.fa-key:before { + content: "\F084"; +} + +.fa-keybase:before { + content: "\F4F5"; +} + +.fa-keyboard:before { + content: "\F11C"; +} + +.fa-keycdn:before { + content: "\F3BA"; +} + +.fa-khanda:before { + content: "\F66D"; +} + +.fa-kickstarter:before { + content: "\F3BB"; +} + +.fa-kickstarter-k:before { + content: "\F3BC"; +} + +.fa-kiss:before { + content: "\F596"; +} + +.fa-kiss-beam:before { + content: "\F597"; +} + +.fa-kiss-wink-heart:before { + content: "\F598"; +} + +.fa-kiwi-bird:before { + content: "\F535"; +} + +.fa-korvue:before { + content: "\F42F"; +} + +.fa-landmark:before { + content: "\F66F"; +} + +.fa-language:before { + content: "\F1AB"; +} + +.fa-laptop:before { + content: "\F109"; +} + +.fa-laptop-code:before { + content: "\F5FC"; +} + +.fa-laptop-house:before { + content: "\F966"; +} + +.fa-laptop-medical:before { + content: "\F812"; +} + +.fa-laravel:before { + content: "\F3BD"; +} + +.fa-lastfm:before { + content: "\F202"; +} + +.fa-lastfm-square:before { + content: "\F203"; +} + +.fa-laugh:before { + content: "\F599"; +} + +.fa-laugh-beam:before { + content: "\F59A"; +} + +.fa-laugh-squint:before { + content: "\F59B"; +} + +.fa-laugh-wink:before { + content: "\F59C"; +} + +.fa-layer-group:before { + content: "\F5FD"; +} + +.fa-leaf:before { + content: "\F06C"; +} + +.fa-leanpub:before { + content: "\F212"; +} + +.fa-lemon:before { + content: "\F094"; +} + +.fa-less:before { + content: "\F41D"; +} + +.fa-less-than:before { + content: "\F536"; +} + +.fa-less-than-equal:before { + content: "\F537"; +} + +.fa-level-down-alt:before { + content: "\F3BE"; +} + +.fa-level-up-alt:before { + content: "\F3BF"; +} + +.fa-life-ring:before { + content: "\F1CD"; +} + +.fa-lightbulb:before { + content: "\F0EB"; +} + +.fa-line:before { + content: "\F3C0"; +} + +.fa-link:before { + content: "\F0C1"; +} + +.fa-linkedin:before { + content: "\F08C"; +} + +.fa-linkedin-in:before { + content: "\F0E1"; +} + +.fa-linode:before { + content: "\F2B8"; +} + +.fa-linux:before { + content: "\F17C"; +} + +.fa-lira-sign:before { + content: "\F195"; +} + +.fa-list:before { + content: "\F03A"; +} + +.fa-list-alt:before { + content: "\F022"; +} + +.fa-list-ol:before { + content: "\F0CB"; +} + +.fa-list-ul:before { + content: "\F0CA"; +} + +.fa-location-arrow:before { + content: "\F124"; +} + +.fa-lock:before { + content: "\F023"; +} + +.fa-lock-open:before { + content: "\F3C1"; +} + +.fa-long-arrow-alt-down:before { + content: "\F309"; +} + +.fa-long-arrow-alt-left:before { + content: "\F30A"; +} + +.fa-long-arrow-alt-right:before { + content: "\F30B"; +} + +.fa-long-arrow-alt-up:before { + content: "\F30C"; +} + +.fa-low-vision:before { + content: "\F2A8"; +} + +.fa-luggage-cart:before { + content: "\F59D"; +} + +.fa-lungs:before { + content: "\F604"; +} + +.fa-lungs-virus:before { + content: "\F967"; +} + +.fa-lyft:before { + content: "\F3C3"; +} + +.fa-magento:before { + content: "\F3C4"; +} + +.fa-magic:before { + content: "\F0D0"; +} + +.fa-magnet:before { + content: "\F076"; +} + +.fa-mail-bulk:before { + content: "\F674"; +} + +.fa-mailchimp:before { + content: "\F59E"; +} + +.fa-male:before { + content: "\F183"; +} + +.fa-mandalorian:before { + content: "\F50F"; +} + +.fa-map:before { + content: "\F279"; +} + +.fa-map-marked:before { + content: "\F59F"; +} + +.fa-map-marked-alt:before { + content: "\F5A0"; +} + +.fa-map-marker:before { + content: "\F041"; +} + +.fa-map-marker-alt:before { + content: "\F3C5"; +} + +.fa-map-pin:before { + content: "\F276"; +} + +.fa-map-signs:before { + content: "\F277"; +} + +.fa-markdown:before { + content: "\F60F"; +} + +.fa-marker:before { + content: "\F5A1"; +} + +.fa-mars:before { + content: "\F222"; +} + +.fa-mars-double:before { + content: "\F227"; +} + +.fa-mars-stroke:before { + content: "\F229"; +} + +.fa-mars-stroke-h:before { + content: "\F22B"; +} + +.fa-mars-stroke-v:before { + content: "\F22A"; +} + +.fa-mask:before { + content: "\F6FA"; +} + +.fa-mastodon:before { + content: "\F4F6"; +} + +.fa-maxcdn:before { + content: "\F136"; +} + +.fa-mdb:before { + content: "\F8CA"; +} + +.fa-medal:before { + content: "\F5A2"; +} + +.fa-medapps:before { + content: "\F3C6"; +} + +.fa-medium:before { + content: "\F23A"; +} + +.fa-medium-m:before { + content: "\F3C7"; +} + +.fa-medkit:before { + content: "\F0FA"; +} + +.fa-medrt:before { + content: "\F3C8"; +} + +.fa-meetup:before { + content: "\F2E0"; +} + +.fa-megaport:before { + content: "\F5A3"; +} + +.fa-meh:before { + content: "\F11A"; +} + +.fa-meh-blank:before { + content: "\F5A4"; +} + +.fa-meh-rolling-eyes:before { + content: "\F5A5"; +} + +.fa-memory:before { + content: "\F538"; +} + +.fa-mendeley:before { + content: "\F7B3"; +} + +.fa-menorah:before { + content: "\F676"; +} + +.fa-mercury:before { + content: "\F223"; +} + +.fa-meteor:before { + content: "\F753"; +} + +.fa-microblog:before { + content: "\F91A"; +} + +.fa-microchip:before { + content: "\F2DB"; +} + +.fa-microphone:before { + content: "\F130"; +} + +.fa-microphone-alt:before { + content: "\F3C9"; +} + +.fa-microphone-alt-slash:before { + content: "\F539"; +} + +.fa-microphone-slash:before { + content: "\F131"; +} + +.fa-microscope:before { + content: "\F610"; +} + +.fa-microsoft:before { + content: "\F3CA"; +} + +.fa-minus:before { + content: "\F068"; +} + +.fa-minus-circle:before { + content: "\F056"; +} + +.fa-minus-square:before { + content: "\F146"; +} + +.fa-mitten:before { + content: "\F7B5"; +} + +.fa-mix:before { + content: "\F3CB"; +} + +.fa-mixcloud:before { + content: "\F289"; +} + +.fa-mixer:before { + content: "\F956"; +} + +.fa-mizuni:before { + content: "\F3CC"; +} + +.fa-mobile:before { + content: "\F10B"; +} + +.fa-mobile-alt:before { + content: "\F3CD"; +} + +.fa-modx:before { + content: "\F285"; +} + +.fa-monero:before { + content: "\F3D0"; +} + +.fa-money-bill:before { + content: "\F0D6"; +} + +.fa-money-bill-alt:before { + content: "\F3D1"; +} + +.fa-money-bill-wave:before { + content: "\F53A"; +} + +.fa-money-bill-wave-alt:before { + content: "\F53B"; +} + +.fa-money-check:before { + content: "\F53C"; +} + +.fa-money-check-alt:before { + content: "\F53D"; +} + +.fa-monument:before { + content: "\F5A6"; +} + +.fa-moon:before { + content: "\F186"; +} + +.fa-mortar-pestle:before { + content: "\F5A7"; +} + +.fa-mosque:before { + content: "\F678"; +} + +.fa-motorcycle:before { + content: "\F21C"; +} + +.fa-mountain:before { + content: "\F6FC"; +} + +.fa-mouse:before { + content: "\F8CC"; +} + +.fa-mouse-pointer:before { + content: "\F245"; +} + +.fa-mug-hot:before { + content: "\F7B6"; +} + +.fa-music:before { + content: "\F001"; +} + +.fa-napster:before { + content: "\F3D2"; +} + +.fa-neos:before { + content: "\F612"; +} + +.fa-network-wired:before { + content: "\F6FF"; +} + +.fa-neuter:before { + content: "\F22C"; +} + +.fa-newspaper:before { + content: "\F1EA"; +} + +.fa-nimblr:before { + content: "\F5A8"; +} + +.fa-node:before { + content: "\F419"; +} + +.fa-node-js:before { + content: "\F3D3"; +} + +.fa-not-equal:before { + content: "\F53E"; +} + +.fa-notes-medical:before { + content: "\F481"; +} + +.fa-npm:before { + content: "\F3D4"; +} + +.fa-ns8:before { + content: "\F3D5"; +} + +.fa-nutritionix:before { + content: "\F3D6"; +} + +.fa-object-group:before { + content: "\F247"; +} + +.fa-object-ungroup:before { + content: "\F248"; +} + +.fa-odnoklassniki:before { + content: "\F263"; +} + +.fa-odnoklassniki-square:before { + content: "\F264"; +} + +.fa-oil-can:before { + content: "\F613"; +} + +.fa-old-republic:before { + content: "\F510"; +} + +.fa-om:before { + content: "\F679"; +} + +.fa-opencart:before { + content: "\F23D"; +} + +.fa-openid:before { + content: "\F19B"; +} + +.fa-opera:before { + content: "\F26A"; +} + +.fa-optin-monster:before { + content: "\F23C"; +} + +.fa-orcid:before { + content: "\F8D2"; +} + +.fa-osi:before { + content: "\F41A"; +} + +.fa-otter:before { + content: "\F700"; +} + +.fa-outdent:before { + content: "\F03B"; +} + +.fa-page4:before { + content: "\F3D7"; +} + +.fa-pagelines:before { + content: "\F18C"; +} + +.fa-pager:before { + content: "\F815"; +} + +.fa-paint-brush:before { + content: "\F1FC"; +} + +.fa-paint-roller:before { + content: "\F5AA"; +} + +.fa-palette:before { + content: "\F53F"; +} + +.fa-palfed:before { + content: "\F3D8"; +} + +.fa-pallet:before { + content: "\F482"; +} + +.fa-paper-plane:before { + content: "\F1D8"; +} + +.fa-paperclip:before { + content: "\F0C6"; +} + +.fa-parachute-box:before { + content: "\F4CD"; +} + +.fa-paragraph:before { + content: "\F1DD"; +} + +.fa-parking:before { + content: "\F540"; +} + +.fa-passport:before { + content: "\F5AB"; +} + +.fa-pastafarianism:before { + content: "\F67B"; +} + +.fa-paste:before { + content: "\F0EA"; +} + +.fa-patreon:before { + content: "\F3D9"; +} + +.fa-pause:before { + content: "\F04C"; +} + +.fa-pause-circle:before { + content: "\F28B"; +} + +.fa-paw:before { + content: "\F1B0"; +} + +.fa-paypal:before { + content: "\F1ED"; +} + +.fa-peace:before { + content: "\F67C"; +} + +.fa-pen:before { + content: "\F304"; +} + +.fa-pen-alt:before { + content: "\F305"; +} + +.fa-pen-fancy:before { + content: "\F5AC"; +} + +.fa-pen-nib:before { + content: "\F5AD"; +} + +.fa-pen-square:before { + content: "\F14B"; +} + +.fa-pencil-alt:before { + content: "\F303"; +} + +.fa-pencil-ruler:before { + content: "\F5AE"; +} + +.fa-penny-arcade:before { + content: "\F704"; +} + +.fa-people-arrows:before { + content: "\F968"; +} + +.fa-people-carry:before { + content: "\F4CE"; +} + +.fa-pepper-hot:before { + content: "\F816"; +} + +.fa-percent:before { + content: "\F295"; +} + +.fa-percentage:before { + content: "\F541"; +} + +.fa-periscope:before { + content: "\F3DA"; +} + +.fa-person-booth:before { + content: "\F756"; +} + +.fa-phabricator:before { + content: "\F3DB"; +} + +.fa-phoenix-framework:before { + content: "\F3DC"; +} + +.fa-phoenix-squadron:before { + content: "\F511"; +} + +.fa-phone:before { + content: "\F095"; +} + +.fa-phone-alt:before { + content: "\F879"; +} + +.fa-phone-slash:before { + content: "\F3DD"; +} + +.fa-phone-square:before { + content: "\F098"; +} + +.fa-phone-square-alt:before { + content: "\F87B"; +} + +.fa-phone-volume:before { + content: "\F2A0"; +} + +.fa-photo-video:before { + content: "\F87C"; +} + +.fa-php:before { + content: "\F457"; +} + +.fa-pied-piper:before { + content: "\F2AE"; +} + +.fa-pied-piper-alt:before { + content: "\F1A8"; +} + +.fa-pied-piper-hat:before { + content: "\F4E5"; +} + +.fa-pied-piper-pp:before { + content: "\F1A7"; +} + +.fa-pied-piper-square:before { + content: "\F91E"; +} + +.fa-piggy-bank:before { + content: "\F4D3"; +} + +.fa-pills:before { + content: "\F484"; +} + +.fa-pinterest:before { + content: "\F0D2"; +} + +.fa-pinterest-p:before { + content: "\F231"; +} + +.fa-pinterest-square:before { + content: "\F0D3"; +} + +.fa-pizza-slice:before { + content: "\F818"; +} + +.fa-place-of-worship:before { + content: "\F67F"; +} + +.fa-plane:before { + content: "\F072"; +} + +.fa-plane-arrival:before { + content: "\F5AF"; +} + +.fa-plane-departure:before { + content: "\F5B0"; +} + +.fa-plane-slash:before { + content: "\F969"; +} + +.fa-play:before { + content: "\F04B"; +} + +.fa-play-circle:before { + content: "\F144"; +} + +.fa-playstation:before { + content: "\F3DF"; +} + +.fa-plug:before { + content: "\F1E6"; +} + +.fa-plus:before { + content: "\F067"; +} + +.fa-plus-circle:before { + content: "\F055"; +} + +.fa-plus-square:before { + content: "\F0FE"; +} + +.fa-podcast:before { + content: "\F2CE"; +} + +.fa-poll:before { + content: "\F681"; +} + +.fa-poll-h:before { + content: "\F682"; +} + +.fa-poo:before { + content: "\F2FE"; +} + +.fa-poo-storm:before { + content: "\F75A"; +} + +.fa-poop:before { + content: "\F619"; +} + +.fa-portrait:before { + content: "\F3E0"; +} + +.fa-pound-sign:before { + content: "\F154"; +} + +.fa-power-off:before { + content: "\F011"; +} + +.fa-pray:before { + content: "\F683"; +} + +.fa-praying-hands:before { + content: "\F684"; +} + +.fa-prescription:before { + content: "\F5B1"; +} + +.fa-prescription-bottle:before { + content: "\F485"; +} + +.fa-prescription-bottle-alt:before { + content: "\F486"; +} + +.fa-print:before { + content: "\F02F"; +} + +.fa-procedures:before { + content: "\F487"; +} + +.fa-product-hunt:before { + content: "\F288"; +} + +.fa-project-diagram:before { + content: "\F542"; +} + +.fa-pump-medical:before { + content: "\F96A"; +} + +.fa-pump-soap:before { + content: "\F96B"; +} + +.fa-pushed:before { + content: "\F3E1"; +} + +.fa-puzzle-piece:before { + content: "\F12E"; +} + +.fa-python:before { + content: "\F3E2"; +} + +.fa-qq:before { + content: "\F1D6"; +} + +.fa-qrcode:before { + content: "\F029"; +} + +.fa-question:before { + content: "\F128"; +} + +.fa-question-circle:before { + content: "\F059"; +} + +.fa-quidditch:before { + content: "\F458"; +} + +.fa-quinscape:before { + content: "\F459"; +} + +.fa-quora:before { + content: "\F2C4"; +} + +.fa-quote-left:before { + content: "\F10D"; +} + +.fa-quote-right:before { + content: "\F10E"; +} + +.fa-quran:before { + content: "\F687"; +} + +.fa-r-project:before { + content: "\F4F7"; +} + +.fa-radiation:before { + content: "\F7B9"; +} + +.fa-radiation-alt:before { + content: "\F7BA"; +} + +.fa-rainbow:before { + content: "\F75B"; +} + +.fa-random:before { + content: "\F074"; +} + +.fa-raspberry-pi:before { + content: "\F7BB"; +} + +.fa-ravelry:before { + content: "\F2D9"; +} + +.fa-react:before { + content: "\F41B"; +} + +.fa-reacteurope:before { + content: "\F75D"; +} + +.fa-readme:before { + content: "\F4D5"; +} + +.fa-rebel:before { + content: "\F1D0"; +} + +.fa-receipt:before { + content: "\F543"; +} + +.fa-record-vinyl:before { + content: "\F8D9"; +} + +.fa-recycle:before { + content: "\F1B8"; +} + +.fa-red-river:before { + content: "\F3E3"; +} + +.fa-reddit:before { + content: "\F1A1"; +} + +.fa-reddit-alien:before { + content: "\F281"; +} + +.fa-reddit-square:before { + content: "\F1A2"; +} + +.fa-redhat:before { + content: "\F7BC"; +} + +.fa-redo:before { + content: "\F01E"; +} + +.fa-redo-alt:before { + content: "\F2F9"; +} + +.fa-registered:before { + content: "\F25D"; +} + +.fa-remove-format:before { + content: "\F87D"; +} + +.fa-renren:before { + content: "\F18B"; +} + +.fa-reply:before { + content: "\F3E5"; +} + +.fa-reply-all:before { + content: "\F122"; +} + +.fa-replyd:before { + content: "\F3E6"; +} + +.fa-republican:before { + content: "\F75E"; +} + +.fa-researchgate:before { + content: "\F4F8"; +} + +.fa-resolving:before { + content: "\F3E7"; +} + +.fa-restroom:before { + content: "\F7BD"; +} + +.fa-retweet:before { + content: "\F079"; +} + +.fa-rev:before { + content: "\F5B2"; +} + +.fa-ribbon:before { + content: "\F4D6"; +} + +.fa-ring:before { + content: "\F70B"; +} + +.fa-road:before { + content: "\F018"; +} + +.fa-robot:before { + content: "\F544"; +} + +.fa-rocket:before { + content: "\F135"; +} + +.fa-rocketchat:before { + content: "\F3E8"; +} + +.fa-rockrms:before { + content: "\F3E9"; +} + +.fa-route:before { + content: "\F4D7"; +} + +.fa-rss:before { + content: "\F09E"; +} + +.fa-rss-square:before { + content: "\F143"; +} + +.fa-ruble-sign:before { + content: "\F158"; +} + +.fa-ruler:before { + content: "\F545"; +} + +.fa-ruler-combined:before { + content: "\F546"; +} + +.fa-ruler-horizontal:before { + content: "\F547"; +} + +.fa-ruler-vertical:before { + content: "\F548"; +} + +.fa-running:before { + content: "\F70C"; +} + +.fa-rupee-sign:before { + content: "\F156"; +} + +.fa-sad-cry:before { + content: "\F5B3"; +} + +.fa-sad-tear:before { + content: "\F5B4"; +} + +.fa-safari:before { + content: "\F267"; +} + +.fa-salesforce:before { + content: "\F83B"; +} + +.fa-sass:before { + content: "\F41E"; +} + +.fa-satellite:before { + content: "\F7BF"; +} + +.fa-satellite-dish:before { + content: "\F7C0"; +} + +.fa-save:before { + content: "\F0C7"; +} + +.fa-schlix:before { + content: "\F3EA"; +} + +.fa-school:before { + content: "\F549"; +} + +.fa-screwdriver:before { + content: "\F54A"; +} + +.fa-scribd:before { + content: "\F28A"; +} + +.fa-scroll:before { + content: "\F70E"; +} + +.fa-sd-card:before { + content: "\F7C2"; +} + +.fa-search:before { + content: "\F002"; +} + +.fa-search-dollar:before { + content: "\F688"; +} + +.fa-search-location:before { + content: "\F689"; +} + +.fa-search-minus:before { + content: "\F010"; +} + +.fa-search-plus:before { + content: "\F00E"; +} + +.fa-searchengin:before { + content: "\F3EB"; +} + +.fa-seedling:before { + content: "\F4D8"; +} + +.fa-sellcast:before { + content: "\F2DA"; +} + +.fa-sellsy:before { + content: "\F213"; +} + +.fa-server:before { + content: "\F233"; +} + +.fa-servicestack:before { + content: "\F3EC"; +} + +.fa-shapes:before { + content: "\F61F"; +} + +.fa-share:before { + content: "\F064"; +} + +.fa-share-alt:before { + content: "\F1E0"; +} + +.fa-share-alt-square:before { + content: "\F1E1"; +} + +.fa-share-square:before { + content: "\F14D"; +} + +.fa-shekel-sign:before { + content: "\F20B"; +} + +.fa-shield-alt:before { + content: "\F3ED"; +} + +.fa-shield-virus:before { + content: "\F96C"; +} + +.fa-ship:before { + content: "\F21A"; +} + +.fa-shipping-fast:before { + content: "\F48B"; +} + +.fa-shirtsinbulk:before { + content: "\F214"; +} + +.fa-shoe-prints:before { + content: "\F54B"; +} + +.fa-shopify:before { + content: "\F957"; +} + +.fa-shopping-bag:before { + content: "\F290"; +} + +.fa-shopping-basket:before { + content: "\F291"; +} + +.fa-shopping-cart:before { + content: "\F07A"; +} + +.fa-shopware:before { + content: "\F5B5"; +} + +.fa-shower:before { + content: "\F2CC"; +} + +.fa-shuttle-van:before { + content: "\F5B6"; +} + +.fa-sign:before { + content: "\F4D9"; +} + +.fa-sign-in-alt:before { + content: "\F2F6"; +} + +.fa-sign-language:before { + content: "\F2A7"; +} + +.fa-sign-out-alt:before { + content: "\F2F5"; +} + +.fa-signal:before { + content: "\F012"; +} + +.fa-signature:before { + content: "\F5B7"; +} + +.fa-sim-card:before { + content: "\F7C4"; +} + +.fa-simplybuilt:before { + content: "\F215"; +} + +.fa-sistrix:before { + content: "\F3EE"; +} + +.fa-sitemap:before { + content: "\F0E8"; +} + +.fa-sith:before { + content: "\F512"; +} + +.fa-skating:before { + content: "\F7C5"; +} + +.fa-sketch:before { + content: "\F7C6"; +} + +.fa-skiing:before { + content: "\F7C9"; +} + +.fa-skiing-nordic:before { + content: "\F7CA"; +} + +.fa-skull:before { + content: "\F54C"; +} + +.fa-skull-crossbones:before { + content: "\F714"; +} + +.fa-skyatlas:before { + content: "\F216"; +} + +.fa-skype:before { + content: "\F17E"; +} + +.fa-slack:before { + content: "\F198"; +} + +.fa-slack-hash:before { + content: "\F3EF"; +} + +.fa-slash:before { + content: "\F715"; +} + +.fa-sleigh:before { + content: "\F7CC"; +} + +.fa-sliders-h:before { + content: "\F1DE"; +} + +.fa-slideshare:before { + content: "\F1E7"; +} + +.fa-smile:before { + content: "\F118"; +} + +.fa-smile-beam:before { + content: "\F5B8"; +} + +.fa-smile-wink:before { + content: "\F4DA"; +} + +.fa-smog:before { + content: "\F75F"; +} + +.fa-smoking:before { + content: "\F48D"; +} + +.fa-smoking-ban:before { + content: "\F54D"; +} + +.fa-sms:before { + content: "\F7CD"; +} + +.fa-snapchat:before { + content: "\F2AB"; +} + +.fa-snapchat-ghost:before { + content: "\F2AC"; +} + +.fa-snapchat-square:before { + content: "\F2AD"; +} + +.fa-snowboarding:before { + content: "\F7CE"; +} + +.fa-snowflake:before { + content: "\F2DC"; +} + +.fa-snowman:before { + content: "\F7D0"; +} + +.fa-snowplow:before { + content: "\F7D2"; +} + +.fa-soap:before { + content: "\F96E"; +} + +.fa-socks:before { + content: "\F696"; +} + +.fa-solar-panel:before { + content: "\F5BA"; +} + +.fa-sort:before { + content: "\F0DC"; +} + +.fa-sort-alpha-down:before { + content: "\F15D"; +} + +.fa-sort-alpha-down-alt:before { + content: "\F881"; +} + +.fa-sort-alpha-up:before { + content: "\F15E"; +} + +.fa-sort-alpha-up-alt:before { + content: "\F882"; +} + +.fa-sort-amount-down:before { + content: "\F160"; +} + +.fa-sort-amount-down-alt:before { + content: "\F884"; +} + +.fa-sort-amount-up:before { + content: "\F161"; +} + +.fa-sort-amount-up-alt:before { + content: "\F885"; +} + +.fa-sort-down:before { + content: "\F0DD"; +} + +.fa-sort-numeric-down:before { + content: "\F162"; +} + +.fa-sort-numeric-down-alt:before { + content: "\F886"; +} + +.fa-sort-numeric-up:before { + content: "\F163"; +} + +.fa-sort-numeric-up-alt:before { + content: "\F887"; +} + +.fa-sort-up:before { + content: "\F0DE"; +} + +.fa-soundcloud:before { + content: "\F1BE"; +} + +.fa-sourcetree:before { + content: "\F7D3"; +} + +.fa-spa:before { + content: "\F5BB"; +} + +.fa-space-shuttle:before { + content: "\F197"; +} + +.fa-speakap:before { + content: "\F3F3"; +} + +.fa-speaker-deck:before { + content: "\F83C"; +} + +.fa-spell-check:before { + content: "\F891"; +} + +.fa-spider:before { + content: "\F717"; +} + +.fa-spinner:before { + content: "\F110"; +} + +.fa-splotch:before { + content: "\F5BC"; +} + +.fa-spotify:before { + content: "\F1BC"; +} + +.fa-spray-can:before { + content: "\F5BD"; +} + +.fa-square:before { + content: "\F0C8"; +} + +.fa-square-full:before { + content: "\F45C"; +} + +.fa-square-root-alt:before { + content: "\F698"; +} + +.fa-squarespace:before { + content: "\F5BE"; +} + +.fa-stack-exchange:before { + content: "\F18D"; +} + +.fa-stack-overflow:before { + content: "\F16C"; +} + +.fa-stackpath:before { + content: "\F842"; +} + +.fa-stamp:before { + content: "\F5BF"; +} + +.fa-star:before { + content: "\F005"; +} + +.fa-star-and-crescent:before { + content: "\F699"; +} + +.fa-star-half:before { + content: "\F089"; +} + +.fa-star-half-alt:before { + content: "\F5C0"; +} + +.fa-star-of-david:before { + content: "\F69A"; +} + +.fa-star-of-life:before { + content: "\F621"; +} + +.fa-staylinked:before { + content: "\F3F5"; +} + +.fa-steam:before { + content: "\F1B6"; +} + +.fa-steam-square:before { + content: "\F1B7"; +} + +.fa-steam-symbol:before { + content: "\F3F6"; +} + +.fa-step-backward:before { + content: "\F048"; +} + +.fa-step-forward:before { + content: "\F051"; +} + +.fa-stethoscope:before { + content: "\F0F1"; +} + +.fa-sticker-mule:before { + content: "\F3F7"; +} + +.fa-sticky-note:before { + content: "\F249"; +} + +.fa-stop:before { + content: "\F04D"; +} + +.fa-stop-circle:before { + content: "\F28D"; +} + +.fa-stopwatch:before { + content: "\F2F2"; +} + +.fa-stopwatch-20:before { + content: "\F96F"; +} + +.fa-store:before { + content: "\F54E"; +} + +.fa-store-alt:before { + content: "\F54F"; +} + +.fa-store-alt-slash:before { + content: "\F970"; +} + +.fa-store-slash:before { + content: "\F971"; +} + +.fa-strava:before { + content: "\F428"; +} + +.fa-stream:before { + content: "\F550"; +} + +.fa-street-view:before { + content: "\F21D"; +} + +.fa-strikethrough:before { + content: "\F0CC"; +} + +.fa-stripe:before { + content: "\F429"; +} + +.fa-stripe-s:before { + content: "\F42A"; +} + +.fa-stroopwafel:before { + content: "\F551"; +} + +.fa-studiovinari:before { + content: "\F3F8"; +} + +.fa-stumbleupon:before { + content: "\F1A4"; +} + +.fa-stumbleupon-circle:before { + content: "\F1A3"; +} + +.fa-subscript:before { + content: "\F12C"; +} + +.fa-subway:before { + content: "\F239"; +} + +.fa-suitcase:before { + content: "\F0F2"; +} + +.fa-suitcase-rolling:before { + content: "\F5C1"; +} + +.fa-sun:before { + content: "\F185"; +} + +.fa-superpowers:before { + content: "\F2DD"; +} + +.fa-superscript:before { + content: "\F12B"; +} + +.fa-supple:before { + content: "\F3F9"; +} + +.fa-surprise:before { + content: "\F5C2"; +} + +.fa-suse:before { + content: "\F7D6"; +} + +.fa-swatchbook:before { + content: "\F5C3"; +} + +.fa-swift:before { + content: "\F8E1"; +} + +.fa-swimmer:before { + content: "\F5C4"; +} + +.fa-swimming-pool:before { + content: "\F5C5"; +} + +.fa-symfony:before { + content: "\F83D"; +} + +.fa-synagogue:before { + content: "\F69B"; +} + +.fa-sync:before { + content: "\F021"; +} + +.fa-sync-alt:before { + content: "\F2F1"; +} + +.fa-syringe:before { + content: "\F48E"; +} + +.fa-table:before { + content: "\F0CE"; +} + +.fa-table-tennis:before { + content: "\F45D"; +} + +.fa-tablet:before { + content: "\F10A"; +} + +.fa-tablet-alt:before { + content: "\F3FA"; +} + +.fa-tablets:before { + content: "\F490"; +} + +.fa-tachometer-alt:before { + content: "\F3FD"; +} + +.fa-tag:before { + content: "\F02B"; +} + +.fa-tags:before { + content: "\F02C"; +} + +.fa-tape:before { + content: "\F4DB"; +} + +.fa-tasks:before { + content: "\F0AE"; +} + +.fa-taxi:before { + content: "\F1BA"; +} + +.fa-teamspeak:before { + content: "\F4F9"; +} + +.fa-teeth:before { + content: "\F62E"; +} + +.fa-teeth-open:before { + content: "\F62F"; +} + +.fa-telegram:before { + content: "\F2C6"; +} + +.fa-telegram-plane:before { + content: "\F3FE"; +} + +.fa-temperature-high:before { + content: "\F769"; +} + +.fa-temperature-low:before { + content: "\F76B"; +} + +.fa-tencent-weibo:before { + content: "\F1D5"; +} + +.fa-tenge:before { + content: "\F7D7"; +} + +.fa-terminal:before { + content: "\F120"; +} + +.fa-text-height:before { + content: "\F034"; +} + +.fa-text-width:before { + content: "\F035"; +} + +.fa-th:before { + content: "\F00A"; +} + +.fa-th-large:before { + content: "\F009"; +} + +.fa-th-list:before { + content: "\F00B"; +} + +.fa-the-red-yeti:before { + content: "\F69D"; +} + +.fa-theater-masks:before { + content: "\F630"; +} + +.fa-themeco:before { + content: "\F5C6"; +} + +.fa-themeisle:before { + content: "\F2B2"; +} + +.fa-thermometer:before { + content: "\F491"; +} + +.fa-thermometer-empty:before { + content: "\F2CB"; +} + +.fa-thermometer-full:before { + content: "\F2C7"; +} + +.fa-thermometer-half:before { + content: "\F2C9"; +} + +.fa-thermometer-quarter:before { + content: "\F2CA"; +} + +.fa-thermometer-three-quarters:before { + content: "\F2C8"; +} + +.fa-think-peaks:before { + content: "\F731"; +} + +.fa-thumbs-down:before { + content: "\F165"; +} + +.fa-thumbs-up:before { + content: "\F164"; +} + +.fa-thumbtack:before { + content: "\F08D"; +} + +.fa-ticket-alt:before { + content: "\F3FF"; +} + +.fa-times:before { + content: "\F00D"; +} + +.fa-times-circle:before { + content: "\F057"; +} + +.fa-tint:before { + content: "\F043"; +} + +.fa-tint-slash:before { + content: "\F5C7"; +} + +.fa-tired:before { + content: "\F5C8"; +} + +.fa-toggle-off:before { + content: "\F204"; +} + +.fa-toggle-on:before { + content: "\F205"; +} + +.fa-toilet:before { + content: "\F7D8"; +} + +.fa-toilet-paper:before { + content: "\F71E"; +} + +.fa-toilet-paper-slash:before { + content: "\F972"; +} + +.fa-toolbox:before { + content: "\F552"; +} + +.fa-tools:before { + content: "\F7D9"; +} + +.fa-tooth:before { + content: "\F5C9"; +} + +.fa-torah:before { + content: "\F6A0"; +} + +.fa-torii-gate:before { + content: "\F6A1"; +} + +.fa-tractor:before { + content: "\F722"; +} + +.fa-trade-federation:before { + content: "\F513"; +} + +.fa-trademark:before { + content: "\F25C"; +} + +.fa-traffic-light:before { + content: "\F637"; +} + +.fa-trailer:before { + content: "\F941"; +} + +.fa-train:before { + content: "\F238"; +} + +.fa-tram:before { + content: "\F7DA"; +} + +.fa-transgender:before { + content: "\F224"; +} + +.fa-transgender-alt:before { + content: "\F225"; +} + +.fa-trash:before { + content: "\F1F8"; +} + +.fa-trash-alt:before { + content: "\F2ED"; +} + +.fa-trash-restore:before { + content: "\F829"; +} + +.fa-trash-restore-alt:before { + content: "\F82A"; +} + +.fa-tree:before { + content: "\F1BB"; +} + +.fa-trello:before { + content: "\F181"; +} + +.fa-tripadvisor:before { + content: "\F262"; +} + +.fa-trophy:before { + content: "\F091"; +} + +.fa-truck:before { + content: "\F0D1"; +} + +.fa-truck-loading:before { + content: "\F4DE"; +} + +.fa-truck-monster:before { + content: "\F63B"; +} + +.fa-truck-moving:before { + content: "\F4DF"; +} + +.fa-truck-pickup:before { + content: "\F63C"; +} + +.fa-tshirt:before { + content: "\F553"; +} + +.fa-tty:before { + content: "\F1E4"; +} + +.fa-tumblr:before { + content: "\F173"; +} + +.fa-tumblr-square:before { + content: "\F174"; +} + +.fa-tv:before { + content: "\F26C"; +} + +.fa-twitch:before { + content: "\F1E8"; +} + +.fa-twitter:before { + content: "\F099"; +} + +.fa-twitter-square:before { + content: "\F081"; +} + +.fa-typo3:before { + content: "\F42B"; +} + +.fa-uber:before { + content: "\F402"; +} + +.fa-ubuntu:before { + content: "\F7DF"; +} + +.fa-uikit:before { + content: "\F403"; +} + +.fa-umbraco:before { + content: "\F8E8"; +} + +.fa-umbrella:before { + content: "\F0E9"; +} + +.fa-umbrella-beach:before { + content: "\F5CA"; +} + +.fa-underline:before { + content: "\F0CD"; +} + +.fa-undo:before { + content: "\F0E2"; +} + +.fa-undo-alt:before { + content: "\F2EA"; +} + +.fa-uniregistry:before { + content: "\F404"; +} + +.fa-unity:before { + content: "\F949"; +} + +.fa-universal-access:before { + content: "\F29A"; +} + +.fa-university:before { + content: "\F19C"; +} + +.fa-unlink:before { + content: "\F127"; +} + +.fa-unlock:before { + content: "\F09C"; +} + +.fa-unlock-alt:before { + content: "\F13E"; +} + +.fa-untappd:before { + content: "\F405"; +} + +.fa-upload:before { + content: "\F093"; +} + +.fa-ups:before { + content: "\F7E0"; +} + +.fa-usb:before { + content: "\F287"; +} + +.fa-user:before { + content: "\F007"; +} + +.fa-user-alt:before { + content: "\F406"; +} + +.fa-user-alt-slash:before { + content: "\F4FA"; +} + +.fa-user-astronaut:before { + content: "\F4FB"; +} + +.fa-user-check:before { + content: "\F4FC"; +} + +.fa-user-circle:before { + content: "\F2BD"; +} + +.fa-user-clock:before { + content: "\F4FD"; +} + +.fa-user-cog:before { + content: "\F4FE"; +} + +.fa-user-edit:before { + content: "\F4FF"; +} + +.fa-user-friends:before { + content: "\F500"; +} + +.fa-user-graduate:before { + content: "\F501"; +} + +.fa-user-injured:before { + content: "\F728"; +} + +.fa-user-lock:before { + content: "\F502"; +} + +.fa-user-md:before { + content: "\F0F0"; +} + +.fa-user-minus:before { + content: "\F503"; +} + +.fa-user-ninja:before { + content: "\F504"; +} + +.fa-user-nurse:before { + content: "\F82F"; +} + +.fa-user-plus:before { + content: "\F234"; +} + +.fa-user-secret:before { + content: "\F21B"; +} + +.fa-user-shield:before { + content: "\F505"; +} + +.fa-user-slash:before { + content: "\F506"; +} + +.fa-user-tag:before { + content: "\F507"; +} + +.fa-user-tie:before { + content: "\F508"; +} + +.fa-user-times:before { + content: "\F235"; +} + +.fa-users:before { + content: "\F0C0"; +} + +.fa-users-cog:before { + content: "\F509"; +} + +.fa-usps:before { + content: "\F7E1"; +} + +.fa-ussunnah:before { + content: "\F407"; +} + +.fa-utensil-spoon:before { + content: "\F2E5"; +} + +.fa-utensils:before { + content: "\F2E7"; +} + +.fa-vaadin:before { + content: "\F408"; +} + +.fa-vector-square:before { + content: "\F5CB"; +} + +.fa-venus:before { + content: "\F221"; +} + +.fa-venus-double:before { + content: "\F226"; +} + +.fa-venus-mars:before { + content: "\F228"; +} + +.fa-viacoin:before { + content: "\F237"; +} + +.fa-viadeo:before { + content: "\F2A9"; +} + +.fa-viadeo-square:before { + content: "\F2AA"; +} + +.fa-vial:before { + content: "\F492"; +} + +.fa-vials:before { + content: "\F493"; +} + +.fa-viber:before { + content: "\F409"; +} + +.fa-video:before { + content: "\F03D"; +} + +.fa-video-slash:before { + content: "\F4E2"; +} + +.fa-vihara:before { + content: "\F6A7"; +} + +.fa-vimeo:before { + content: "\F40A"; +} + +.fa-vimeo-square:before { + content: "\F194"; +} + +.fa-vimeo-v:before { + content: "\F27D"; +} + +.fa-vine:before { + content: "\F1CA"; +} + +.fa-virus:before { + content: "\F974"; +} + +.fa-virus-slash:before { + content: "\F975"; +} + +.fa-viruses:before { + content: "\F976"; +} + +.fa-vk:before { + content: "\F189"; +} + +.fa-vnv:before { + content: "\F40B"; +} + +.fa-voicemail:before { + content: "\F897"; +} + +.fa-volleyball-ball:before { + content: "\F45F"; +} + +.fa-volume-down:before { + content: "\F027"; +} + +.fa-volume-mute:before { + content: "\F6A9"; +} + +.fa-volume-off:before { + content: "\F026"; +} + +.fa-volume-up:before { + content: "\F028"; +} + +.fa-vote-yea:before { + content: "\F772"; +} + +.fa-vr-cardboard:before { + content: "\F729"; +} + +.fa-vuejs:before { + content: "\F41F"; +} + +.fa-walking:before { + content: "\F554"; +} + +.fa-wallet:before { + content: "\F555"; +} + +.fa-warehouse:before { + content: "\F494"; +} + +.fa-water:before { + content: "\F773"; +} + +.fa-wave-square:before { + content: "\F83E"; +} + +.fa-waze:before { + content: "\F83F"; +} + +.fa-weebly:before { + content: "\F5CC"; +} + +.fa-weibo:before { + content: "\F18A"; +} + +.fa-weight:before { + content: "\F496"; +} + +.fa-weight-hanging:before { + content: "\F5CD"; +} + +.fa-weixin:before { + content: "\F1D7"; +} + +.fa-whatsapp:before { + content: "\F232"; +} + +.fa-whatsapp-square:before { + content: "\F40C"; +} + +.fa-wheelchair:before { + content: "\F193"; +} + +.fa-whmcs:before { + content: "\F40D"; +} + +.fa-wifi:before { + content: "\F1EB"; +} + +.fa-wikipedia-w:before { + content: "\F266"; +} + +.fa-wind:before { + content: "\F72E"; +} + +.fa-window-close:before { + content: "\F410"; +} + +.fa-window-maximize:before { + content: "\F2D0"; +} + +.fa-window-minimize:before { + content: "\F2D1"; +} + +.fa-window-restore:before { + content: "\F2D2"; +} + +.fa-windows:before { + content: "\F17A"; +} + +.fa-wine-bottle:before { + content: "\F72F"; +} + +.fa-wine-glass:before { + content: "\F4E3"; +} + +.fa-wine-glass-alt:before { + content: "\F5CE"; +} + +.fa-wix:before { + content: "\F5CF"; +} + +.fa-wizards-of-the-coast:before { + content: "\F730"; +} + +.fa-wolf-pack-battalion:before { + content: "\F514"; +} + +.fa-won-sign:before { + content: "\F159"; +} + +.fa-wordpress:before { + content: "\F19A"; +} + +.fa-wordpress-simple:before { + content: "\F411"; +} + +.fa-wpbeginner:before { + content: "\F297"; +} + +.fa-wpexplorer:before { + content: "\F2DE"; +} + +.fa-wpforms:before { + content: "\F298"; +} + +.fa-wpressr:before { + content: "\F3E4"; +} + +.fa-wrench:before { + content: "\F0AD"; +} + +.fa-x-ray:before { + content: "\F497"; +} + +.fa-xbox:before { + content: "\F412"; +} + +.fa-xing:before { + content: "\F168"; +} + +.fa-xing-square:before { + content: "\F169"; +} + +.fa-y-combinator:before { + content: "\F23B"; +} + +.fa-yahoo:before { + content: "\F19E"; +} + +.fa-yammer:before { + content: "\F840"; +} + +.fa-yandex:before { + content: "\F413"; +} + +.fa-yandex-international:before { + content: "\F414"; +} + +.fa-yarn:before { + content: "\F7E3"; +} + +.fa-yelp:before { + content: "\F1E9"; +} + +.fa-yen-sign:before { + content: "\F157"; +} + +.fa-yin-yang:before { + content: "\F6AD"; +} + +.fa-yoast:before { + content: "\F2B1"; +} + +.fa-youtube:before { + content: "\F167"; +} + +.fa-youtube-square:before { + content: "\F431"; +} + +.fa-zhihu:before { + content: "\F63F"; +} + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.sr-only-focusable:active, +.sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; +} + +/*! + * Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ + +@font-face { + font-family: "Font Awesome 5 Free"; + font-style: normal; + font-weight: 900; + font-display: block; + src: url(/fonts/fa-solid-900.eot?a0369ea57eb6d3843d6474c035111f29); + src: url(/fonts/fa-solid-900.eot?a0369ea57eb6d3843d6474c035111f29) format("embedded-opentype"), url(/fonts/fa-solid-900.woff2?b15db15f746f29ffa02638cb455b8ec0) format("woff2"), url(/fonts/fa-solid-900.woff?bea989e82b07e9687c26fc58a4805021) format("woff"), url(/fonts/fa-solid-900.ttf?1ab236ed440ee51810c56bd16628aef0) format("truetype"), url(/fonts/fa-solid-900.svg?ec763292e583294612f124c0b0def500) format("svg"); +} + +.fa, +.fas { + font-family: "Font Awesome 5 Free"; + font-weight: 900; +} + +/*! + * Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ + +@font-face { + font-family: "Font Awesome 5 Free"; + font-style: normal; + font-weight: 400; + font-display: block; + src: url(/fonts/fa-regular-400.eot?261d666b0147c6c5cda07265f98b8f8c); + src: url(/fonts/fa-regular-400.eot?261d666b0147c6c5cda07265f98b8f8c) format("embedded-opentype"), url(/fonts/fa-regular-400.woff2?c20b5b7362d8d7bb7eddf94344ace33e) format("woff2"), url(/fonts/fa-regular-400.woff?f89ea91ecd1ca2db7e09baa2c4b156d1) format("woff"), url(/fonts/fa-regular-400.ttf?db78b9359171f24936b16d84f63af378) format("truetype"), url(/fonts/fa-regular-400.svg?89ffa3aba80d30ee0a9371b25c968bbb) format("svg"); +} + +.far { + font-family: "Font Awesome 5 Free"; + font-weight: 400; +} + +.green { + color: #73ce29; +} + +.red { + color: #e44a5a; +} + +.status { + border-radius: 5px; + color: #FFF; + text-transform: uppercase; + font-size: 0.8em; + font-weight: bold; + padding: 3px 5px 2px; +} + +.status.checked { + background-color: #73ce29; +} + +.status.unchecked { + background-color: #f7b542; +} + +/* Chrome, Safari, Edge, Opera */ + +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none !important; + margin: 0 !important; +} + +/* Firefox */ + +input[type=number] { + -moz-appearance: textfield !important; +} + +.otp_fields { + display: flex; + justify-content: center; +} + +.otp_fields input { + width: 60px; + height: 60px; + text-align: center; + font-size: 35px; +} + +.otp_fields input:not(:last-child) { + margin-right: 10px; +} + diff --git a/public/js/app.js b/public/js/app.js index 624e4a4..e4473a4 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -1899,9 +1899,9 @@ module.exports = { /***/ }), -/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/ExampleComponent.vue?vue&type=script&lang=js&": +/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/OTPFormComponent.vue?vue&type=script&lang=js&": /*!***************************************************************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/ExampleComponent.vue?vue&type=script&lang=js& ***! + !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/OTPFormComponent.vue?vue&type=script&lang=js& ***! \***************************************************************************************************************************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -1924,9 +1924,65 @@ __webpack_require__.r(__webpack_exports__); // // // +// +// /* harmony default export */ __webpack_exports__["default"] = ({ mounted: function mounted() { console.log('Component mounted.'); + }, + props: ['csrf', 'action'], + data: function data() { + return { + otp1: '', + otp2: '', + otp3: '', + otp4: '', + otp5: '', + otp6: '', + showSubmitBtn: false, + blockInputs: false + }; + }, + watch: { + otp6: function otp6() { + if (this.otp6.length === 1) { + this.blockInputs = true; + this.submit(); + } + } + }, + methods: { + nextInput: function nextInput(id) { + switch (id) { + case 2: + this.$refs.otp2.focus(); + break; + + case 3: + this.$refs.otp3.focus(); + break; + + case 4: + this.$refs.otp4.focus(); + break; + + case 5: + this.$refs.otp5.focus(); + break; + + case 6: + this.$refs.otp6.focus(); + break; + } + }, + submit: function submit() { + if (this.otp1.length === 1 && this.otp2.length === 1 && this.otp3.length === 1 && this.otp4.length === 1 && this.otp5.length === 1 && this.otp6.length === 1) { + this.$refs.otp_form.submit(); + } else { + this.showSubmitBtn = true; + this.blockInputs = false; + } + } } }); @@ -37287,9 +37343,9 @@ exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) || /***/ }), -/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/ExampleComponent.vue?vue&type=template&id=299e239e&": +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/OTPFormComponent.vue?vue&type=template&id=3aeada99&": /*!*******************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/ExampleComponent.vue?vue&type=template&id=299e239e& ***! + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/OTPFormComponent.vue?vue&type=template&id=3aeada99& ***! \*******************************************************************************************************************************************************************************************************************/ /*! exports provided: render, staticRenderFns */ /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -37302,32 +37358,278 @@ var render = function() { var _vm = this var _h = _vm.$createElement var _c = _vm._self._c || _h - return _vm._m(0) + return _c( + "form", + { + ref: "otp_form", + staticClass: "d-inline", + attrs: { method: "POST", action: _vm.action } + }, + [ + _c( + "div", + { + directives: [ + { + name: "show", + rawName: "v-show", + value: _vm.showSubmitBtn, + expression: "showSubmitBtn" + } + ], + staticClass: "alert alert-danger", + attrs: { role: "alert" } + }, + [ + _vm._v( + "\n Vous devez remplir tous les champs, 1 caractère par case.\n " + ) + ] + ), + _vm._v(" "), + _c("input", { + attrs: { type: "hidden", name: "_token" }, + domProps: { value: _vm.csrf } + }), + _vm._v(" "), + _c("div", { staticClass: "otp_fields" }, [ + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.otp1, + expression: "otp1" + } + ], + ref: "otp1", + attrs: { + disabled: _vm.blockInputs, + name: "otp1", + type: "number", + min: "0", + max: "9", + maxlength: "1", + minlength: "1", + autofocus: "", + required: "" + }, + domProps: { value: _vm.otp1 }, + on: { + keypress: function($event) { + return _vm.nextInput(2) + }, + click: function($event) { + _vm.otp1 = "" + }, + input: function($event) { + if ($event.target.composing) { + return + } + _vm.otp1 = $event.target.value + } + } + }), + _vm._v(" "), + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.otp2, + expression: "otp2" + } + ], + ref: "otp2", + attrs: { + disabled: _vm.blockInputs, + name: "otp2", + type: "number", + min: "0", + max: "9", + maxlength: "1", + minlength: "1", + required: "" + }, + domProps: { value: _vm.otp2 }, + on: { + keypress: function($event) { + return _vm.nextInput(3) + }, + click: function($event) { + _vm.otp2 = "" + }, + input: function($event) { + if ($event.target.composing) { + return + } + _vm.otp2 = $event.target.value + } + } + }), + _vm._v(" "), + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.otp3, + expression: "otp3" + } + ], + ref: "otp3", + attrs: { + disabled: _vm.blockInputs, + name: "otp3", + type: "number", + min: "0", + max: "9", + maxlength: "1", + minlength: "1", + required: "" + }, + domProps: { value: _vm.otp3 }, + on: { + keypress: function($event) { + return _vm.nextInput(4) + }, + click: function($event) { + _vm.otp3 = "" + }, + input: function($event) { + if ($event.target.composing) { + return + } + _vm.otp3 = $event.target.value + } + } + }), + _vm._v(" "), + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.otp4, + expression: "otp4" + } + ], + ref: "otp4", + attrs: { + disabled: _vm.blockInputs, + name: "otp4", + type: "number", + min: "0", + max: "9", + maxlength: "1", + minlength: "1", + required: "" + }, + domProps: { value: _vm.otp4 }, + on: { + keypress: function($event) { + return _vm.nextInput(5) + }, + click: function($event) { + _vm.otp4 = "" + }, + input: function($event) { + if ($event.target.composing) { + return + } + _vm.otp4 = $event.target.value + } + } + }), + _vm._v(" "), + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.otp5, + expression: "otp5" + } + ], + ref: "otp5", + attrs: { + disabled: _vm.blockInputs, + name: "otp5", + type: "number", + min: "0", + max: "9", + maxlength: "1", + minlength: "1", + required: "" + }, + domProps: { value: _vm.otp5 }, + on: { + keypress: function($event) { + return _vm.nextInput(6) + }, + click: function($event) { + _vm.otp5 = "" + }, + input: function($event) { + if ($event.target.composing) { + return + } + _vm.otp5 = $event.target.value + } + } + }), + _vm._v(" "), + _c("input", { + directives: [ + { + name: "model", + rawName: "v-model", + value: _vm.otp6, + expression: "otp6" + } + ], + ref: "otp6", + attrs: { + disabled: _vm.blockInputs, + name: "otp6", + type: "number", + min: "0", + max: "9", + maxlength: "1", + minlength: "1" + }, + domProps: { value: _vm.otp6 }, + on: { + click: function($event) { + _vm.otp6 = "" + }, + input: function($event) { + if ($event.target.composing) { + return + } + _vm.otp6 = $event.target.value + } + } + }) + ]), + _vm._v(" "), + _c("input", { + directives: [ + { + name: "show", + rawName: "v-show", + value: _vm.showSubmitBtn, + expression: "showSubmitBtn" + } + ], + staticClass: "btn btn-primary", + staticStyle: { display: "block", margin: "10px auto 0" }, + attrs: { type: "submit", value: "Valider" } + }) + ] + ) } -var staticRenderFns = [ - function() { - var _vm = this - var _h = _vm.$createElement - var _c = _vm._self._c || _h - return _c("div", { staticClass: "container" }, [ - _c("div", { staticClass: "row justify-content-center" }, [ - _c("div", { staticClass: "col-md-8" }, [ - _c("div", { staticClass: "card" }, [ - _c("div", { staticClass: "card-header" }, [ - _vm._v("Example Component") - ]), - _vm._v(" "), - _c("div", { staticClass: "card-body" }, [ - _vm._v( - "\n I'm an example component.\n " - ) - ]) - ]) - ]) - ]) - ]) - } -] +var staticRenderFns = [] render._withStripped = true @@ -49516,7 +49818,7 @@ window.Vue = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.common. // const files = require.context('./', true, /\.vue$/i) // files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default)) -Vue.component('example-component', __webpack_require__(/*! ./components/ExampleComponent.vue */ "./resources/js/components/ExampleComponent.vue")["default"]); +Vue.component('otp-form', __webpack_require__(/*! ./components/OTPFormComponent.vue */ "./resources/js/components/OTPFormComponent.vue")["default"]); /** * Next, we will create a fresh Vue application instance and attach it to * the page. Then, you may begin adding components to this application @@ -49587,17 +49889,17 @@ if (token) { /***/ }), -/***/ "./resources/js/components/ExampleComponent.vue": +/***/ "./resources/js/components/OTPFormComponent.vue": /*!******************************************************!*\ - !*** ./resources/js/components/ExampleComponent.vue ***! + !*** ./resources/js/components/OTPFormComponent.vue ***! \******************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _ExampleComponent_vue_vue_type_template_id_299e239e___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ExampleComponent.vue?vue&type=template&id=299e239e& */ "./resources/js/components/ExampleComponent.vue?vue&type=template&id=299e239e&"); -/* harmony import */ var _ExampleComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ExampleComponent.vue?vue&type=script&lang=js& */ "./resources/js/components/ExampleComponent.vue?vue&type=script&lang=js&"); +/* harmony import */ var _OTPFormComponent_vue_vue_type_template_id_3aeada99___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./OTPFormComponent.vue?vue&type=template&id=3aeada99& */ "./resources/js/components/OTPFormComponent.vue?vue&type=template&id=3aeada99&"); +/* harmony import */ var _OTPFormComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./OTPFormComponent.vue?vue&type=script&lang=js& */ "./resources/js/components/OTPFormComponent.vue?vue&type=script&lang=js&"); /* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js"); @@ -49607,9 +49909,9 @@ __webpack_require__.r(__webpack_exports__); /* normalize component */ var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])( - _ExampleComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"], - _ExampleComponent_vue_vue_type_template_id_299e239e___WEBPACK_IMPORTED_MODULE_0__["render"], - _ExampleComponent_vue_vue_type_template_id_299e239e___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"], + _OTPFormComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"], + _OTPFormComponent_vue_vue_type_template_id_3aeada99___WEBPACK_IMPORTED_MODULE_0__["render"], + _OTPFormComponent_vue_vue_type_template_id_3aeada99___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"], false, null, null, @@ -49619,38 +49921,38 @@ var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_ /* hot reload */ if (false) { var api; } -component.options.__file = "resources/js/components/ExampleComponent.vue" +component.options.__file = "resources/js/components/OTPFormComponent.vue" /* harmony default export */ __webpack_exports__["default"] = (component.exports); /***/ }), -/***/ "./resources/js/components/ExampleComponent.vue?vue&type=script&lang=js&": +/***/ "./resources/js/components/OTPFormComponent.vue?vue&type=script&lang=js&": /*!*******************************************************************************!*\ - !*** ./resources/js/components/ExampleComponent.vue?vue&type=script&lang=js& ***! + !*** ./resources/js/components/OTPFormComponent.vue?vue&type=script&lang=js& ***! \*******************************************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_ExampleComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib??ref--4-0!../../../node_modules/vue-loader/lib??vue-loader-options!./ExampleComponent.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/ExampleComponent.vue?vue&type=script&lang=js&"); -/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_ExampleComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); +/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_OTPFormComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib??ref--4-0!../../../node_modules/vue-loader/lib??vue-loader-options!./OTPFormComponent.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/OTPFormComponent.vue?vue&type=script&lang=js&"); +/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_OTPFormComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), -/***/ "./resources/js/components/ExampleComponent.vue?vue&type=template&id=299e239e&": +/***/ "./resources/js/components/OTPFormComponent.vue?vue&type=template&id=3aeada99&": /*!*************************************************************************************!*\ - !*** ./resources/js/components/ExampleComponent.vue?vue&type=template&id=299e239e& ***! + !*** ./resources/js/components/OTPFormComponent.vue?vue&type=template&id=3aeada99& ***! \*************************************************************************************/ /*! exports provided: render, staticRenderFns */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_ExampleComponent_vue_vue_type_template_id_299e239e___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/vue-loader/lib??vue-loader-options!./ExampleComponent.vue?vue&type=template&id=299e239e& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/ExampleComponent.vue?vue&type=template&id=299e239e&"); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_ExampleComponent_vue_vue_type_template_id_299e239e___WEBPACK_IMPORTED_MODULE_0__["render"]; }); +/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_OTPFormComponent_vue_vue_type_template_id_3aeada99___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/vue-loader/lib??vue-loader-options!./OTPFormComponent.vue?vue&type=template&id=3aeada99& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/OTPFormComponent.vue?vue&type=template&id=3aeada99&"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_OTPFormComponent_vue_vue_type_template_id_3aeada99___WEBPACK_IMPORTED_MODULE_0__["render"]; }); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_ExampleComponent_vue_vue_type_template_id_299e239e___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_OTPFormComponent_vue_vue_type_template_id_3aeada99___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; }); diff --git a/resources/js/app.js b/resources/js/app.js index aa19e31..ca093f3 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -19,7 +19,7 @@ window.Vue = require('vue'); // const files = require.context('./', true, /\.vue$/i) // files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default)) -Vue.component('example-component', require('./components/ExampleComponent.vue').default); +Vue.component('otp-form', require('./components/OTPFormComponent.vue').default); /** * Next, we will create a fresh Vue application instance and attach it to diff --git a/resources/js/components/ExampleComponent.vue b/resources/js/components/ExampleComponent.vue deleted file mode 100644 index 3fb9f9a..0000000 --- a/resources/js/components/ExampleComponent.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - diff --git a/resources/js/components/OTPFormComponent.vue b/resources/js/components/OTPFormComponent.vue new file mode 100644 index 0000000..9ef4600 --- /dev/null +++ b/resources/js/components/OTPFormComponent.vue @@ -0,0 +1,78 @@ + + + diff --git a/resources/sass/app.scss b/resources/sass/app.scss index 3193ffa..230c33c 100644 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -6,3 +6,55 @@ // Bootstrap @import '~bootstrap/scss/bootstrap'; + +// FontAwesome +@import "fontawesome/fontawesome"; +@import "fontawesome/solid"; +@import "fontawesome/regular"; + +.green { + color: #73ce29; +} +.red { + color: #e44a5a; +} + +.status { + border-radius: 5px; + color: #FFF; + text-transform: uppercase; + font-size: 0.8em; + font-weight: bold; + padding: 3px 5px 2px; + &.checked { + background-color: #73ce29; + } + &.unchecked { + background-color: #f7b542; + } +} + +/* Chrome, Safari, Edge, Opera */ +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none !important; + margin: 0 !important; +} +/* Firefox */ +input[type=number] { + -moz-appearance: textfield !important; +} + +.otp_fields { + display: flex; + justify-content: center; + & input { + width: 60px; + height: 60px; + text-align: center; + font-size: 35px; + &:not(:last-child) { + margin-right: 10px; + } + } +} diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php deleted file mode 100644 index c12b97e..0000000 --- a/resources/views/auth/login.blade.php +++ /dev/null @@ -1,73 +0,0 @@ -@extends('layouts.app') - -@section('content') -
-
-
-
-
{{ __('Login') }}
- -
-
- @csrf - -
- - -
- - - @error('email') - - {{ $message }} - - @enderror -
-
- -
- - -
- - - @error('password') - - {{ $message }} - - @enderror -
-
- -
-
-
- - - -
-
-
- -
-
- - - @if (Route::has('password.request')) - - {{ __('Forgot Your Password?') }} - - @endif -
-
-
-
-
-
-
-
-@endsection diff --git a/resources/views/auth/passwords/email.blade.php b/resources/views/auth/passwords/email.blade.php deleted file mode 100644 index 1fea984..0000000 --- a/resources/views/auth/passwords/email.blade.php +++ /dev/null @@ -1,47 +0,0 @@ -@extends('layouts.app') - -@section('content') -
-
-
-
-
{{ __('Reset Password') }}
- -
- @if (session('status')) - - @endif - -
- @csrf - -
- - -
- - - @error('email') - - {{ $message }} - - @enderror -
-
- -
-
- -
-
-
-
-
-
-
-
-@endsection diff --git a/resources/views/auth/passwords/reset.blade.php b/resources/views/auth/passwords/reset.blade.php deleted file mode 100644 index 989931d..0000000 --- a/resources/views/auth/passwords/reset.blade.php +++ /dev/null @@ -1,65 +0,0 @@ -@extends('layouts.app') - -@section('content') -
-
-
-
-
{{ __('Reset Password') }}
- -
-
- @csrf - - - -
- - -
- - - @error('email') - - {{ $message }} - - @enderror -
-
- -
- - -
- - - @error('password') - - {{ $message }} - - @enderror -
-
- -
- - -
- -
-
- -
-
- -
-
-
-
-
-
-
-
-@endsection diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php deleted file mode 100644 index d236a48..0000000 --- a/resources/views/auth/register.blade.php +++ /dev/null @@ -1,77 +0,0 @@ -@extends('layouts.app') - -@section('content') -
-
-
-
-
{{ __('Register') }}
- -
-
- @csrf - -
- - -
- - - @error('name') - - {{ $message }} - - @enderror -
-
- -
- - -
- - - @error('email') - - {{ $message }} - - @enderror -
-
- -
- - -
- - - @error('password') - - {{ $message }} - - @enderror -
-
- -
- - -
- -
-
- -
-
- -
-
-
-
-
-
-
-
-@endsection diff --git a/resources/views/auth/unauthorized.blade.php b/resources/views/auth/unauthorized.blade.php new file mode 100644 index 0000000..caef3b7 --- /dev/null +++ b/resources/views/auth/unauthorized.blade.php @@ -0,0 +1,12 @@ +@extends('layouts.app') + +@section('content') +
+
+
+

Vous n'êtes pas autorisé à accéder à l'application.

+

Vous pouvez faire une demande à cette adresse : informatique.internet@ldc.fr

+
+
+
+@endsection diff --git a/resources/views/auth/verification_failed.blade.php b/resources/views/auth/verification_failed.blade.php new file mode 100644 index 0000000..cf0190f --- /dev/null +++ b/resources/views/auth/verification_failed.blade.php @@ -0,0 +1,11 @@ +@extends('layouts.app') + +@section('content') +
+
+
+

Code de vérification invalide.

+
+
+
+@endsection diff --git a/resources/views/auth/verify.blade.php b/resources/views/auth/verify.blade.php index 05433ef..c594d0e 100644 --- a/resources/views/auth/verify.blade.php +++ b/resources/views/auth/verify.blade.php @@ -5,21 +5,10 @@
-
{{ __('Verify Your Email Address') }}
+
Confirmation de connexion
- @if (session('resent')) - - @endif - - {{ __('Before proceeding, please check your email for a verification link.') }} - {{ __('If you did not receive the email') }}, -
- @csrf - . -
+
diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 05dfca9..1c5c95f 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -7,14 +7,22 @@
Dashboard
-
+
@if (session('status')) @endif - You are logged in! + +
+ EDL Web +
+ +
+ Status Checker +
+
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 7bcfd31..42cea59 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -39,34 +39,26 @@
diff --git a/resources/views/projects/edit.blade.php b/resources/views/projects/edit.blade.php new file mode 100644 index 0000000..b378a8d --- /dev/null +++ b/resources/views/projects/edit.blade.php @@ -0,0 +1,383 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{$project->name}} - {{$project->display_name}}
+ +
+ @if (session('status')) + + @endif +
+ @csrf +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+

DEV

+

PROD

+
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/projects/index.blade.php b/resources/views/projects/index.blade.php new file mode 100644 index 0000000..393a3a6 --- /dev/null +++ b/resources/views/projects/index.blade.php @@ -0,0 +1,49 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
EDL Web
+ +
+ @if (session('status')) + + @endif + + + + + + + + + + + + @foreach($projects as $project) + + + + + + + + @endforeach + +
ProjetNomPHPTypeHTTPS
{{$project->name}}{{$project->display_name}}{{$project->php}}{{$project->type}} + @if($project->https === 0) + + @else + + @endif +
+
+
+
+
+
+@endsection diff --git a/resources/views/status-checker/index.blade.php b/resources/views/status-checker/index.blade.php new file mode 100644 index 0000000..738bc2e --- /dev/null +++ b/resources/views/status-checker/index.blade.php @@ -0,0 +1,78 @@ +@extends('layouts.app') + +@section('content') +
+
+
+ + + + + + + + + + + + + + + + @foreach($projects as $project) + + + + + + + + + + + + @endforeach + +
StatusHTTPSSitePHPTypeCodeSitemapRobots.txtLog d'erreurs
+ @if ($project->checked === 'missing') + + @elseif($project->checked === 'true') +
checked
+ @else +
unchecked
+ @endif +
+ @if($project->https === 0) + + @else + + @endif + {{$project->display_name}}{{$project->php}}{{$project->type}} + @if ($project->sitemap_checked === 'missing') + + @elseif($project->sitemap_checked === 'true') + + @else + + @endif + + @if ($project->robots_checked === 'missing') + + @elseif($project->robots_checked === 'true') + + @else + + @endif + + @if ($project->logs_checked === 'missing') + + @elseif($project->logs_checked === 0) + + @else + {{$project->logs_checked}} B + @endif +
+
+
+
+@endsection diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php deleted file mode 100644 index 3fb48cc..0000000 --- a/resources/views/welcome.blade.php +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - Laravel - - - - - - - - -
- @if (Route::has('login')) - - @endif - -
-
- Laravel -
- - -
-
- - diff --git a/routes/api.php b/routes/api.php index c641ca5..83e78f1 100644 --- a/routes/api.php +++ b/routes/api.php @@ -16,3 +16,5 @@ use Illuminate\Http\Request; Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); }); + +Route::post('/status-checker', 'API\StatusCheckerController@index'); diff --git a/routes/web.php b/routes/web.php index 12fc04c..cf252ff 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,10 +11,17 @@ | */ -Route::get('/', function () { - return view('welcome'); +Route::get('/login/verify', 'OTPController@verify')->name('auth.verify'); +Route::post('/login/checkOTP', 'OTPController@check')->name('auth.otp'); +Route::view('/login/verification_failed', 'auth.verification_failed')->name('verification_failed'); +Route::view('/login/unauthorized', 'auth.unauthorized')->name('unauthorized'); + +Route::group(['middleware' => ['auth']], function () { + Route::get('/', 'HomeController@index')->name('home'); + /* STATUS CHECKER */ + Route::get('/status-checker', 'StatusCheckerController@index'); + /* EDL WEB */ + Route::get('/projects', 'ProjectsController@index'); + Route::get('/projects/{uuid}/edit', 'ProjectsController@edit')->name('projects.edit'); + Route::post('/projects/{uuid}/update', 'ProjectsController@update'); }); - -Auth::routes(); - -Route::get('/home', 'HomeController@index')->name('home');