当前位置:网站首页>Nuxtjs actual combat case

Nuxtjs actual combat case

2022-06-25 10:44:00 Houhai 0_ o


Continuous road construction is the best way to settle down , Be willing to travel around the world , If you don't succeed, you'll be better off alone , Calm and easy


 Insert picture description here


One 、 Case introduction

Purpose : Implement a blog project , Able to register / Sign in / sign out 、 Article published / modify / list / Pagination / label / details / give the thumbs-up / Cancel likes 、 Personal center , Personal information update .






Two 、 Project initialization

1. Create project

#  Create project directory 
mkdir realworld-nuxtjs
​
#  Enter project directory 
cd realworld-nuxtjs
​
#  Generate  package.json  file 
npm init -y
​
#  install  nuxt  rely on 
npm i nuxt

stay package.json Add a startup script to the :

"scripts": {
    
	"dev": "nuxt"
}

establish pages/index.vue Entrance file :

<template>
  <div class="home"> home page </div>
</template>

Start the service :

npm run dev


2. Import styles

 Insert picture description here

be based on layout/header Introducing styles , Need to pass through jsdelivr Convert to domestic address , Improve reference speed ;


newly build root directory /app.html View template file :

<!DOCTYPE html>
<html {
     {
      HTML_ATTRS }}>
  <head {
     {
      HEAD_ATTRS }}>
    {
   { HEAD }}
    <!-- Import Ionicon icons & Google Fonts our Bootstrap theme relies on -->
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/css/ionicons.min.css" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Titillium+Web:700|Source+Serif+Pro:400,700|Merriweather+Sans:400,700|Source+Sans+Pro:400,300,600,700,300italic,400italic,600italic,700italic" rel="stylesheet" type="text/css">
    <!-- Import the custom Bootstrap 4 theme from our hosted CDN -->
    <!-- <link rel="stylesheet" href="//demo.productionready.io/main.css"> -->
    <link rel="stylesheet" href="/index.css">
  </head>
  <body {
     {
      BODY_ATTRS }}>
    {
   { APP }}  <!--  this body Inside is the location of the rendered view , This app Is the root component  -->
  </body>
</html>

newly build static/index.css Custom style file :

.logo-font{
    font-family:titillium web,sans-serif}html{
    position:relative;min-height:100vh;padding-bottom:100px}/*!* Bootstrap v4.0.0-alpha.2 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)*//*!normalize.css commit fe56763 | MIT License | github.com/necolas/normalize.css*/html{
    font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{
    margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{
    display:block}audio,canvas,progress,video{
    display:inline-block;vertical-align:baseline}audio:not([controls]){
    display:none;height:0}[hidden],template{
    display:none}a{
    background-color:transparent}a:active{
    outline:0}a:hover{
    outline:0}abbr[title]{
    border-bottom:1px dotted}b,strong{
    font-weight:700}dfn{
    font-style:italic}h1{
    font-size:2em;margin:.67em 0}mark{
    background:#ff0;color:#000}small{
    font-size:80%}sub,sup{
    font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{
    top:-.5em}sub{
    bottom:-.25em}img{
    border:0}svg:not(:root){
    overflow:hidden}figure{
    margin:1em 40px}hr{
    box-sizing:content-box;height:0}pre{
    overflow:auto}code,kbd,pre,samp{
    font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{
    color:inherit;font:inherit;margin:0}button{
    overflow:visible}button,select{
    text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{
    -webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{
    cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{
    border:0;padding:0}input{
    line-height:normal}input[type=checkbox],input[type=radio]{
    box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{
    height:auto}input[type=search]{
    -webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{
    -webkit-appearance:none}fieldset{
    border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{
    border:0;padding:0}textarea{
    overflow:auto}optgroup{
    font-weight:700}table{
    border-collapse:collapse;border-spacing:0}td,th{
    padding:0}@media print{
    *,*::before,*::after,*::first-letter,*::first-line{
    text-shadow:none!important;box-shadow:none!important}a,a:visited{
    text-decoration:underline}abbr[title]::after{
    content:" (" attr(title) ")"}pre,blockquote{
    border:1px solid #999;page-break-inside:avoid}thead{
    display:table-header-group}tr,img{
    page-break-inside:avoid}p,h2,h3{
    orphans:3;widows:3}h2,h3{
    page-break-after:avoid}.navbar{
    display:none}.btn>.caret,.dropup>.btn>.caret{
    border-top-color:#000!important}.tag{
    border:1px solid #000}.table{
    border-collapse:collapse!important}.table td,.table th{
    background-color:#fff!important}.table-bordered th,.table-bordered td{
    border:1px solid #ddd!important}}html{
    box-sizing:border-box}*,*::before,*::after{
    box-sizing:inherit}@-ms-viewport{
    width:device-width;}html{
    font-size:16px;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{
    font-family:source sans pro,sans-serif;font-size:1rem;line-height:1.5;color:#373a3c;background-color:#fff}[tabindex="-1"]:focus{
    outline:none!important}h1,h2,h3,h4,h5,h6{
    margin-top:0;margin-bottom:.5rem}p{
    margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{
    cursor:help;border-bottom:1px dotted #818a91}address{
    margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{
    margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{
    margin-bottom:0}dt{
    font-weight:700}dd{
    margin-bottom:.5rem;margin-left:0}blockquote{
    margin:0 0 1rem}a{
    color:#5cb85c;text-decoration:none}a:focus,a:hover{
    color:#3d8b3d;text-decoration:underline}a:focus{
    outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:not([href]){
    color:inherit;text-decoration:none}a:not([href]):focus,a:not([href]):hover{
    color:inherit;text-decoration:none}a:not([href]):focus{
    outline:none}pre{
    margin-top:0;margin-bottom:1rem}figure{
    margin:0 0 1rem}img{
    vertical-align:middle}[role=button]{
    cursor:pointer}a,area,button,[role=button],input,label,select,summary,textarea{
    touch-action:manipulation}table{
    background-color:transparent}caption{
    padding-top:.75rem;padding-bottom:.75rem;color:#818a91;text-align:left;caption-side:bottom}th{
    text-align:left}label{
    display:inline-block;margin-bottom:.5rem}button:focus{
    outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,textarea{
    margin:0;line-height:inherit;border-radius:0}textarea{
    resize:vertical}fieldset{
    min-width:0;padding:0;margin:0;border:0}legend{
    display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type=search]{
    -webkit-appearance:none}output{
    display:inline-block}[hidden]{
    display:none!important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{
    margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1,.h1{
    font-size:2.5rem}h2,.h2{
    font-size:2rem}h3,.h3{
    font-size:1.75rem}h4,.h4{
    font-size:1.5rem}h5,.h5{
    font-size:1.25rem}h6,.h6{
    font-size:1rem}.lead{
    font-size:1.25rem;font-weight:300}.display-1{
    font-size:6rem;font-weight:300}.display-2{
    font-size:5.5rem;font-weight:300}.display-3{
    font-size:4.5rem;font-weight:300}.display-4{
    font-size:3.5rem;font-weight:300}hr{
    margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}small,.small{
    font-size:80%;font-weight:400}mark,.mark{
    padding:.2em;background-color:#fcf8e3}.list-unstyled{
    padding-left:0;list-style:none}.list-inline{
    padding-left:0;list-style:none}.list-inline-item{
    display:inline-block}.list-inline-item:not(:last-child){
    margin-right:5px}.initialism{
    font-size:90%;text-transform:uppercase}.blockquote{
    padding:.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:.25rem solid #eceeef}.blockquote-footer{
    display:block;font-size:80%;color:#818a91}.blockquote-footer::before{
    content:"\2014 \00A0"}.blockquote-reverse{
    padding-right:1rem;padding-left:0;text-align:right;border-right:.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{
    content:""}.blockquote-reverse .blockquote-footer::after{
    content:"\00A0 \2014"}.img-fluid,.carousel-inner>.carousel-item>img,.carousel-inner>.carousel-item>a>img{
    display:block;max-width:100%;height:auto}.img-rounded{
    border-radius:.3rem}.img-thumbnail{
    padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{
    border-radius:50%}.figure{
    display:inline-block}.figure-img{
    margin-bottom:.5rem;line-height:1}.figure-caption{
    font-size:90%;color:#818a91}code,kbd,pre,samp{
    font-family:Menlo,Monaco,Consolas,liberation mono,courier new,monospace}code{
    padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f7f7f9;border-radius:.25rem}kbd{
    padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#333;border-radius:.2rem}kbd kbd{
    padding:0;font-size:100%;font-weight:700}pre{
    display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#373a3c}pre code{
    padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{
    max-height:340px;overflow-y:scroll}.container{
    margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}@media(min-width:544px){
    .container{
    max-width:576px}}@media(min-width:768px){
    .container{
    max-width:720px}}@media(min-width:992px){
    .container{
    max-width:940px}}@media(min-width:1200px){
    .container{
    max-width:1140px}}.container-fluid{
    margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}.row{
    display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.col-xs{
    position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-xs-2{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-xs-3{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-xs-4{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-xs-5{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-xs-6{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-xs-7{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-xs-8{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-xs-9{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-xs-10{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-xs-11{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-xs-12{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-xs-0{
    right:auto}.pull-xs-1{
    right:8.33333%}.pull-xs-2{
    right:16.66667%}.pull-xs-3{
    right:25%}.pull-xs-4{
    right:33.33333%}.pull-xs-5{
    right:41.66667%}.pull-xs-6{
    right:50%}.pull-xs-7{
    right:58.33333%}.pull-xs-8{
    right:66.66667%}.pull-xs-9{
    right:75%}.pull-xs-10{
    right:83.33333%}.pull-xs-11{
    right:91.66667%}.pull-xs-12{
    right:100%}.push-xs-0{
    left:auto}.push-xs-1{
    left:8.33333%}.push-xs-2{
    left:16.66667%}.push-xs-3{
    left:25%}.push-xs-4{
    left:33.33333%}.push-xs-5{
    left:41.66667%}.push-xs-6{
    left:50%}.push-xs-7{
    left:58.33333%}.push-xs-8{
    left:66.66667%}.push-xs-9{
    left:75%}.push-xs-10{
    left:83.33333%}.push-xs-11{
    left:91.66667%}.push-xs-12{
    left:100%}.offset-xs-1{
    margin-left:8.33333%}.offset-xs-2{
    margin-left:16.66667%}.offset-xs-3{
    margin-left:25%}.offset-xs-4{
    margin-left:33.33333%}.offset-xs-5{
    margin-left:41.66667%}.offset-xs-6{
    margin-left:50%}.offset-xs-7{
    margin-left:58.33333%}.offset-xs-8{
    margin-left:66.66667%}.offset-xs-9{
    margin-left:75%}.offset-xs-10{
    margin-left:83.33333%}.offset-xs-11{
    margin-left:91.66667%}@media(min-width:544px){
    .col-sm{
    position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-sm-1{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-sm-4{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-sm-7{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-sm-10{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-sm-0{
    right:auto}.pull-sm-1{
    right:8.33333%}.pull-sm-2{
    right:16.66667%}.pull-sm-3{
    right:25%}.pull-sm-4{
    right:33.33333%}.pull-sm-5{
    right:41.66667%}.pull-sm-6{
    right:50%}.pull-sm-7{
    right:58.33333%}.pull-sm-8{
    right:66.66667%}.pull-sm-9{
    right:75%}.pull-sm-10{
    right:83.33333%}.pull-sm-11{
    right:91.66667%}.pull-sm-12{
    right:100%}.push-sm-0{
    left:auto}.push-sm-1{
    left:8.33333%}.push-sm-2{
    left:16.66667%}.push-sm-3{
    left:25%}.push-sm-4{
    left:33.33333%}.push-sm-5{
    left:41.66667%}.push-sm-6{
    left:50%}.push-sm-7{
    left:58.33333%}.push-sm-8{
    left:66.66667%}.push-sm-9{
    left:75%}.push-sm-10{
    left:83.33333%}.push-sm-11{
    left:91.66667%}.push-sm-12{
    left:100%}.offset-sm-0{
    margin-left:0%}.offset-sm-1{
    margin-left:8.33333%}.offset-sm-2{
    margin-left:16.66667%}.offset-sm-3{
    margin-left:25%}.offset-sm-4{
    margin-left:33.33333%}.offset-sm-5{
    margin-left:41.66667%}.offset-sm-6{
    margin-left:50%}.offset-sm-7{
    margin-left:58.33333%}.offset-sm-8{
    margin-left:66.66667%}.offset-sm-9{
    margin-left:75%}.offset-sm-10{
    margin-left:83.33333%}.offset-sm-11{
    margin-left:91.66667%}}@media(min-width:768px){
    .col-md{
    position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-md-1{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-md-4{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-md-7{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-md-10{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-md-0{
    right:auto}.pull-md-1{
    right:8.33333%}.pull-md-2{
    right:16.66667%}.pull-md-3{
    right:25%}.pull-md-4{
    right:33.33333%}.pull-md-5{
    right:41.66667%}.pull-md-6{
    right:50%}.pull-md-7{
    right:58.33333%}.pull-md-8{
    right:66.66667%}.pull-md-9{
    right:75%}.pull-md-10{
    right:83.33333%}.pull-md-11{
    right:91.66667%}.pull-md-12{
    right:100%}.push-md-0{
    left:auto}.push-md-1{
    left:8.33333%}.push-md-2{
    left:16.66667%}.push-md-3{
    left:25%}.push-md-4{
    left:33.33333%}.push-md-5{
    left:41.66667%}.push-md-6{
    left:50%}.push-md-7{
    left:58.33333%}.push-md-8{
    left:66.66667%}.push-md-9{
    left:75%}.push-md-10{
    left:83.33333%}.push-md-11{
    left:91.66667%}.push-md-12{
    left:100%}.offset-md-0{
    margin-left:0%}.offset-md-1{
    margin-left:8.33333%}.offset-md-2{
    margin-left:16.66667%}.offset-md-3{
    margin-left:25%}.offset-md-4{
    margin-left:33.33333%}.offset-md-5{
    margin-left:41.66667%}.offset-md-6{
    margin-left:50%}.offset-md-7{
    margin-left:58.33333%}.offset-md-8{
    margin-left:66.66667%}.offset-md-9{
    margin-left:75%}.offset-md-10{
    margin-left:83.33333%}.offset-md-11{
    margin-left:91.66667%}}@media(min-width:992px){
    .col-lg{
    position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-lg-1{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-lg-4{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-lg-7{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-lg-10{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-lg-0{
    right:auto}.pull-lg-1{
    right:8.33333%}.pull-lg-2{
    right:16.66667%}.pull-lg-3{
    right:25%}.pull-lg-4{
    right:33.33333%}.pull-lg-5{
    right:41.66667%}.pull-lg-6{
    right:50%}.pull-lg-7{
    right:58.33333%}.pull-lg-8{
    right:66.66667%}.pull-lg-9{
    right:75%}.pull-lg-10{
    right:83.33333%}.pull-lg-11{
    right:91.66667%}.pull-lg-12{
    right:100%}.push-lg-0{
    left:auto}.push-lg-1{
    left:8.33333%}.push-lg-2{
    left:16.66667%}.push-lg-3{
    left:25%}.push-lg-4{
    left:33.33333%}.push-lg-5{
    left:41.66667%}.push-lg-6{
    left:50%}.push-lg-7{
    left:58.33333%}.push-lg-8{
    left:66.66667%}.push-lg-9{
    left:75%}.push-lg-10{
    left:83.33333%}.push-lg-11{
    left:91.66667%}.push-lg-12{
    left:100%}.offset-lg-0{
    margin-left:0%}.offset-lg-1{
    margin-left:8.33333%}.offset-lg-2{
    margin-left:16.66667%}.offset-lg-3{
    margin-left:25%}.offset-lg-4{
    margin-left:33.33333%}.offset-lg-5{
    margin-left:41.66667%}.offset-lg-6{
    margin-left:50%}.offset-lg-7{
    margin-left:58.33333%}.offset-lg-8{
    margin-left:66.66667%}.offset-lg-9{
    margin-left:75%}.offset-lg-10{
    margin-left:83.33333%}.offset-lg-11{
    margin-left:91.66667%}}@media(min-width:1200px){
    .col-xl{
    position:relative;flex-basis:0;flex-grow:1;max-width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col-xl-1{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 25%;max-width:25%}.col-xl-4{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 50%;max-width:50%}.col-xl-7{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 75%;max-width:75%}.col-xl-10{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{
    position:relative;min-height:1px;padding-right:15px;padding-left:15px;flex:0 0 100%;max-width:100%}.pull-xl-0{
    right:auto}.pull-xl-1{
    right:8.33333%}.pull-xl-2{
    right:16.66667%}.pull-xl-3{
    right:25%}.pull-xl-4{
    right:33.33333%}.pull-xl-5{
    right:41.66667%}.pull-xl-6{
    right:50%}.pull-xl-7{
    right:58.33333%}.pull-xl-8{
    right:66.66667%}.pull-xl-9{
    right:75%}.pull-xl-10{
    right:83.33333%}.pull-xl-11{
    right:91.66667%}.pull-xl-12{
    right:100%}.push-xl-0{
    left:auto}.push-xl-1{
    left:8.33333%}.push-xl-2{
    left:16.66667%}.push-xl-3{
    left:25%}.push-xl-4{
    left:33.33333%}.push-xl-5{
    left:41.66667%}.push-xl-6{
    left:50%}.push-xl-7{
    left:58.33333%}.push-xl-8{
    left:66.66667%}.push-xl-9{
    left:75%}.push-xl-10{
    left:83.33333%}.push-xl-11{
    left:91.66667%}.push-xl-12{
    left:100%}.offset-xl-0{
    margin-left:0%}.offset-xl-1{
    margin-left:8.33333%}.offset-xl-2{
    margin-left:16.66667%}.offset-xl-3{
    margin-left:25%}.offset-xl-4{
    margin-left:33.33333%}.offset-xl-5{
    margin-left:41.66667%}.offset-xl-6{
    margin-left:50%}.offset-xl-7{
    margin-left:58.33333%}.offset-xl-8{
    margin-left:66.66667%}.offset-xl-9{
    margin-left:75%}.offset-xl-10{
    margin-left:83.33333%}.offset-xl-11{
    margin-left:91.66667%}}.table{
    width:100%;max-width:100%;margin-bottom:1rem}.table th,.table td{
    padding:.75rem;vertical-align:top;border-top:1px solid #eceeef}.table thead th{
    vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody{
    border-top:2px solid #eceeef}.table .table{
    background-color:#fff}.table-sm th,.table-sm td{
    padding:.3rem}.table-bordered{
    border:1px solid #eceeef}.table-bordered th,.table-bordered td{
    border:1px solid #eceeef}.table-bordered thead th,.table-bordered thead td{
    border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){
    background-color:#f9f9f9}.table-hover tbody tr:hover{
    background-color:#f5f5f5}.table-active,.table-active>th,.table-active>td{
    background-color:#f5f5f5}.table-hover .table-active:hover{
    background-color:#e8e8e8}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{
    background-color:#e8e8e8}.table-success,.table-success>th,.table-success>td{
    background-color:#dff0d8}.table-hover .table-success:hover{
    background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{
    background-color:#d0e9c6}.table-info,.table-info>th,.table-info>td{
    background-color:#d9edf7}.table-hover .table-info:hover{
    background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{
    background-color:#c4e3f3}.table-warning,.table-warning>th,.table-warning>td{
    background-color:#fcf8e3}.table-hover .table-warning:hover{
    background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{
    background-color:#faf2cc}.table-danger,.table-danger>th,.table-danger>td{
    background-color:#f2dede}.table-hover .table-danger:hover{
    background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{
    background-color:#ebcccc}.table-responsive{
    display:block;width:100%;min-height:.01%;overflow-x:auto}.thead-inverse th{
    color:#fff;background-color:#373a3c}.thead-default th{
    color:#55595c;background-color:#eceeef}.table-inverse{
    color:#eceeef;background-color:#373a3c}.table-inverse.table-bordered{
    border:0}.table-inverse th,.table-inverse td,.table-inverse thead th{
    border-color:#55595c}.table-reflow thead{
    float:left}.table-reflow tbody{
    display:block;white-space:nowrap}.table-reflow th,.table-reflow td{
    border-top:1px solid #eceeef;border-left:1px solid #eceeef}.table-reflow th:last-child,.table-reflow td:last-child{
    border-right:1px solid #eceeef}.table-reflow thead:last-child tr:last-child th,.table-reflow thead:last-child tr:last-child td,.table-reflow tbody:last-child tr:last-child th,.table-reflow tbody:last-child tr:last-child td,.table-reflow tfoot:last-child tr:last-child th,.table-reflow tfoot:last-child tr:last-child td{
    border-bottom:1px solid #eceeef}.table-reflow tr{
    float:left}.table-reflow tr th,.table-reflow tr td{
    display:block!important;border:1px solid #eceeef}.form-control{
    display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#55595c;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.form-control::-ms-expand{
    background-color:transparent;border:0}.form-control:focus{
    border-color:#66afe9;outline:none}.form-control::placeholder{
    color:#999;opacity:1}.form-control:disabled,.form-control[readonly]{
    background-color:#eceeef;opacity:1}.form-control:disabled{
    cursor:not-allowed}select.form-control:not([size]):not([multiple]){
    height:2.5rem}.form-control-file,.form-control-range{
    display:block}.form-control-label{
    padding:.5rem .75rem;margin-bottom:0}.form-control-legend{
    padding:.5rem .75rem;margin-bottom:0;font-size:1rem}_::-webkit-full-page-media.form-control,input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{
    line-height:2.5rem}_::-webkit-full-page-media.input-sm,.input-group-sm _::-webkit-full-page-media.form-control,input[type=date].input-sm,.input-group-sm input[type=date].form-control,input[type=time].input-sm,.input-group-sm input[type=time].form-control,input[type=datetime-local].input-sm,.input-group-sm input[type=datetime-local].form-control,input[type=month].input-sm,.input-group-sm input[type=month].form-control{
    line-height:1.8125rem}_::-webkit-full-page-media.input-lg,.input-group-lg _::-webkit-full-page-media.form-control,input[type=date].input-lg,.input-group-lg input[type=date].form-control,input[type=time].input-lg,.input-group-lg input[type=time].form-control,input[type=datetime-local].input-lg,.input-group-lg input[type=datetime-local].form-control,input[type=month].input-lg,.input-group-lg input[type=month].form-control{
    line-height:3.16667rem}.form-control-static{
    min-height:2.5rem;padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0}.form-control-static.form-control-sm,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn,.form-control-static.form-control-lg,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn{
    padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{
    padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{
    padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.form-group{
    margin-bottom:1rem}.radio,.checkbox{
    position:relative;display:block;margin-bottom:.75rem}.radio label,.checkbox label{
    padding-left:1.25rem;margin-bottom:0;cursor:pointer}.radio label input:only-child,.checkbox label input:only-child{
    position:static}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{
    position:absolute;margin-top:.25rem;margin-left:-1.25rem}.radio+.radio,.checkbox+.checkbox{
    margin-top:-.25rem}.radio-inline,.checkbox-inline{
    position:relative;display:inline-block;padding-left:1.25rem;margin-bottom:0;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{
    margin-top:0;margin-left:.75rem}input[type=radio]:disabled,input[type=radio].disabled,input[type=checkbox]:disabled,input[type=checkbox].disabled{
    cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled{
    cursor:not-allowed}.radio.disabled label,.checkbox.disabled label{
    cursor:not-allowed}.form-control-success,.form-control-warning,.form-control-danger{
    padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .625rem;background-size:1.25rem 1.25rem}.has-success .text-help,.has-success .form-control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .custom-control{
    color:#5cb85c}.has-success .form-control{
    border-color:#5cb85c}.has-success .input-group-addon{
    color:#5cb85c;border-color:#5cb85c;background-color:#eaf6ea}.has-success .form-control-feedback{
    color:#5cb85c}.has-success .form-control-success{
    background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyM1Y2I4NWMnIGQ9J00yLjMgNi43M0wuNiA0LjUzYy0uNC0xLjA0LjQ2LTEuNCAxLjEtLjhsMS4xIDEuNCAzLjQtMy44Yy42LS42MyAxLjYtLjI3IDEuMi43bC00IDQuNmMtLjQzLjUtLjguNC0xLjEuMXonLz48L3N2Zz4=)}.has-warning .text-help,.has-warning .form-control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .custom-control{
    color:#f0ad4e}.has-warning .form-control{
    border-color:#f0ad4e}.has-warning .input-group-addon{
    color:#f0ad4e;border-color:#f0ad4e;background-color:#fff}.has-warning .form-control-feedback{
    color:#f0ad4e}.has-warning .form-control-warning{
    background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyNmMGFkNGUnIGQ9J000LjQgNS4zMjRoLS44di0yLjQ2aC44em0wIDEuNDJoLS44VjUuODloLjh6TTMuNzYuNjNMLjA0IDcuMDc1Yy0uMTE1LjIuMDE2LjQyNS4yNi40MjZoNy4zOTdjLjI0MiAwIC4zNzItLjIyNi4yNTgtLjQyNkM2LjcyNiA0LjkyNCA1LjQ3IDIuNzkgNC4yNTMuNjNjLS4xMTMtLjE3NC0uMzktLjE3NC0uNDk0IDB6Jy8+PC9zdmc+)}.has-danger .text-help,.has-danger .form-control-label,.has-danger .radio,.has-danger .checkbox,.has-danger .radio-inline,.has-danger .checkbox-inline,.has-danger.radio label,.has-danger.checkbox label,.has-danger.radio-inline label,.has-danger.checkbox-inline label,.has-danger .custom-control{
    color:#b85c5c}.has-danger .form-control{
    border-color:#b85c5c}.has-danger .input-group-addon{
    color:#b85c5c;border-color:#b85c5c;background-color:#f6eaea}.has-danger .form-control-feedback{
    color:#b85c5c}.has-danger .form-control-danger{
    background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9JyNkOTUzNGYnIHZpZXdCb3g9Jy0yIC0yIDcgNyc+PHBhdGggc3Ryb2tlPScjZDk1MzRmJyBkPSdNMCAwbDMgM20wLTNMMCAzJy8+PGNpcmNsZSByPScuNScvPjxjaXJjbGUgY3g9JzMnIHI9Jy41Jy8+PGNpcmNsZSBjeT0nMycgcj0nLjUnLz48Y2lyY2xlIGN4PSczJyBjeT0nMycgcj0nLjUnLz48L3N2Zz4=)}@media(min-width:544px){
    .form-inline .form-group{
    display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{
    display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{
    display:inline-block}.form-inline .input-group{
    display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{
    width:auto}.form-inline .input-group>.form-control{
    width:100%}.form-inline .form-control-label{
    margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{
    display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{
    padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{
    position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{
    top:0}}.btn{
    display:inline-block;font-weight:400;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;border-radius:.25rem}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.focus{
    outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{
    text-decoration:none}.btn.focus{
    text-decoration:none}.btn:active,.btn.active{
    background-image:none;outline:0}.btn.disabled,.btn:disabled{
    cursor:not-allowed;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{
    pointer-events:none}.btn-primary{
    color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-primary:hover{
    color:#fff;background-color:#449d44;border-color:#419641}.btn-primary:focus,.btn-primary.focus{
    color:#fff;background-color:#449d44;border-color:#419641}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{
    color:#fff;background-color:#449d44;border-color:#419641;background-image:none}.btn-primary:active:hover,.btn-primary:active:focus,.btn-primary:active.focus,.btn-primary.active:hover,.btn-primary.active:focus,.btn-primary.active.focus,.open>.btn-primary.dropdown-toggle:hover,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle.focus{
    color:#fff;background-color:#398439;border-color:#2d672d}.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary:disabled:focus,.btn-primary:disabled.focus{
    background-color:#5cb85c;border-color:#5cb85c}.btn-primary.disabled:hover,.btn-primary:disabled:hover{
    background-color:#5cb85c;border-color:#5cb85c}.btn-secondary{
    color:#373a3c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{
    color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:focus,.btn-secondary.focus{
    color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary:active,.btn-secondary.active,.open>.btn-secondary.dropdown-toggle{
    color:#373a3c;background-color:#e6e6e6;border-color:#adadad;background-image:none}.btn-secondary:active:hover,.btn-secondary:active:focus,.btn-secondary:active.focus,.btn-secondary.active:hover,.btn-secondary.active:focus,.btn-secondary.active.focus,.open>.btn-secondary.dropdown-toggle:hover,.open>.btn-secondary.dropdown-toggle:focus,.open>.btn-secondary.dropdown-toggle.focus{
    color:#373a3c;background-color:#d4d4d4;border-color:#8c8c8c}.btn-secondary.disabled:focus,.btn-secondary.disabled.focus,.btn-secondary:disabled:focus,.btn-secondary:disabled.focus{
    background-color:#fff;border-color:#ccc}.btn-secondary.disabled:hover,.btn-secondary:disabled:hover{
    background-color:#fff;border-color:#ccc}.btn-info{
    color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{
    color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:focus,.btn-info.focus{
    color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{
    color:#fff;background-color:#31b0d5;border-color:#2aabd2;background-image:none}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{
    color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info:disabled:focus,.btn-info:disabled.focus{
    background-color:#5bc0de;border-color:#5bc0de}.btn-info.disabled:hover,.btn-info:disabled:hover{
    background-color:#5bc0de;border-color:#5bc0de}.btn-success{
    color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{
    color:#fff;background-color:#449d44;border-color:#419641}.btn-success:focus,.btn-success.focus{
    color:#fff;background-color:#449d44;border-color:#419641}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{
    color:#fff;background-color:#449d44;border-color:#419641;background-image:none}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{
    color:#fff;background-color:#398439;border-color:#2d672d}.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success:disabled:focus,.btn-success:disabled.focus{
    background-color:#5cb85c;border-color:#5cb85c}.btn-success.disabled:hover,.btn-success:disabled:hover{
    background-color:#5cb85c;border-color:#5cb85c}.btn-warning{
    color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{
    color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:focus,.btn-warning.focus{
    color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{
    color:#fff;background-color:#ec971f;border-color:#eb9316;background-image:none}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{
    color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning:disabled:focus,.btn-warning:disabled.focus{
    background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.disabled:hover,.btn-warning:disabled:hover{
    background-color:#f0ad4e;border-color:#f0ad4e}.btn-danger{
    color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-danger:hover{
    color:#fff;background-color:#9d4444;border-color:#964141}.btn-danger:focus,.btn-danger.focus{
    color:#fff;background-color:#9d4444;border-color:#964141}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{
    color:#fff;background-color:#9d4444;border-color:#964141;background-image:none}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{
    color:#fff;background-color:#843939;border-color:#672d2d}.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger:disabled:focus,.btn-danger:disabled.focus{
    background-color:#b85c5c;border-color:#b85c5c}.btn-danger.disabled:hover,.btn-danger:disabled:hover{
    background-color:#b85c5c;border-color:#b85c5c}.btn-outline-primary{
    color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.btn-outline-primary:hover{
    color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-primary:focus,.btn-outline-primary.focus{
    color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-primary:active,.btn-outline-primary.active,.open>.btn-outline-primary.dropdown-toggle{
    color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-primary:active:hover,.btn-outline-primary:active:focus,.btn-outline-primary:active.focus,.btn-outline-primary.active:hover,.btn-outline-primary.active:focus,.btn-outline-primary.active.focus,.open>.btn-outline-primary.dropdown-toggle:hover,.open>.btn-outline-primary.dropdown-toggle:focus,.open>.btn-outline-primary.dropdown-toggle.focus{
    color:#fff;background-color:#398439;border-color:#2d672d}.btn-outline-primary.disabled:focus,.btn-outline-primary.disabled.focus,.btn-outline-primary:disabled:focus,.btn-outline-primary:disabled.focus{
    border-color:#a3d7a3}.btn-outline-primary.disabled:hover,.btn-outline-primary:disabled:hover{
    border-color:#a3d7a3}.btn-outline-secondary{
    color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.btn-outline-secondary:hover{
    color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:focus,.btn-outline-secondary.focus{
    color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:active,.btn-outline-secondary.active,.open>.btn-outline-secondary.dropdown-toggle{
    color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary:active:hover,.btn-outline-secondary:active:focus,.btn-outline-secondary:active.focus,.btn-outline-secondary.active:hover,.btn-outline-secondary.active:focus,.btn-outline-secondary.active.focus,.open>.btn-outline-secondary.dropdown-toggle:hover,.open>.btn-outline-secondary.dropdown-toggle:focus,.open>.btn-outline-secondary.dropdown-toggle.focus{
    color:#fff;background-color:#a1a1a1;border-color:#8c8c8c}.btn-outline-secondary.disabled:focus,.btn-outline-secondary.disabled.focus,.btn-outline-secondary:disabled:focus,.btn-outline-secondary:disabled.focus{
    border-color:#fff}.btn-outline-secondary.disabled:hover,.btn-outline-secondary:disabled:hover{
    border-color:#fff}.btn-outline-info{
    color:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.btn-outline-info:hover{
    color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:focus,.btn-outline-info.focus{
    color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:active,.btn-outline-info.active,.open>.btn-outline-info.dropdown-toggle{
    color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info:active:hover,.btn-outline-info:active:focus,.btn-outline-info:active.focus,.btn-outline-info.active:hover,.btn-outline-info.active:focus,.btn-outline-info.active.focus,.open>.btn-outline-info.dropdown-toggle:hover,.open>.btn-outline-info.dropdown-toggle:focus,.open>.btn-outline-info.dropdown-toggle.focus{
    color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-outline-info.disabled:focus,.btn-outline-info.disabled.focus,.btn-outline-info:disabled:focus,.btn-outline-info:disabled.focus{
    border-color:#b0e1ef}.btn-outline-info.disabled:hover,.btn-outline-info:disabled:hover{
    border-color:#b0e1ef}.btn-outline-success{
    color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.btn-outline-success:hover{
    color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success:focus,.btn-outline-success.focus{
    color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success:active,.btn-outline-success.active,.open>.btn-outline-success.dropdown-toggle{
    color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success:active:hover,.btn-outline-success:active:focus,.btn-outline-success:active.focus,.btn-outline-success.active:hover,.btn-outline-success.active:focus,.btn-outline-success.active.focus,.open>.btn-outline-success.dropdown-toggle:hover,.open>.btn-outline-success.dropdown-toggle:focus,.open>.btn-outline-success.dropdown-toggle.focus{
    color:#fff;background-color:#398439;border-color:#2d672d}.btn-outline-success.disabled:focus,.btn-outline-success.disabled.focus,.btn-outline-success:disabled:focus,.btn-outline-success:disabled.focus{
    border-color:#a3d7a3}.btn-outline-success.disabled:hover,.btn-outline-success:disabled:hover{
    border-color:#a3d7a3}.btn-outline-warning{
    color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.btn-outline-warning:hover{
    color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:focus,.btn-outline-warning.focus{
    color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:active,.btn-outline-warning.active,.open>.btn-outline-warning.dropdown-toggle{
    color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:active:hover,.btn-outline-warning:active:focus,.btn-outline-warning:active.focus,.btn-outline-warning.active:hover,.btn-outline-warning.active:focus,.btn-outline-warning.active.focus,.open>.btn-outline-warning.dropdown-toggle:hover,.open>.btn-outline-warning.dropdown-toggle:focus,.open>.btn-outline-warning.dropdown-toggle.focus{
    color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-outline-warning.disabled:focus,.btn-outline-warning.disabled.focus,.btn-outline-warning:disabled:focus,.btn-outline-warning:disabled.focus{
    border-color:#f8d9ac}.btn-outline-warning.disabled:hover,.btn-outline-warning:disabled:hover{
    border-color:#f8d9ac}.btn-outline-danger{
    color:#b85c5c;background-image:none;background-color:transparent;border-color:#b85c5c}.btn-outline-danger:hover{
    color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:focus,.btn-outline-danger.focus{
    color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:active,.btn-outline-danger.active,.open>.btn-outline-danger.dropdown-toggle{
    color:#fff;background-color:#b85c5c;border-color:#b85c5c}.btn-outline-danger:active:hover,.btn-outline-danger:active:focus,.btn-outline-danger:active.focus,.btn-outline-danger.active:hover,.btn-outline-danger.active:focus,.btn-outline-danger.active.focus,.open>.btn-outline-danger.dropdown-toggle:hover,.open>.btn-outline-danger.dropdown-toggle:focus,.open>.btn-outline-danger.dropdown-toggle.focus{
    color:#fff;background-color:#843939;border-color:#672d2d}.btn-outline-danger.disabled:focus,.btn-outline-danger.disabled.focus,.btn-outline-danger:disabled:focus,.btn-outline-danger:disabled.focus{
    border-color:#d7a3a3}.btn-outline-danger.disabled:hover,.btn-outline-danger:disabled:hover{
    border-color:#d7a3a3}.btn-link{
    font-weight:400;color:#5cb85c;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link:disabled{
    background-color:transparent}.btn-link,.btn-link:focus,.btn-link:active{
    border-color:transparent}.btn-link:hover{
    border-color:transparent}.btn-link:focus,.btn-link:hover{
    color:#3d8b3d;text-decoration:underline;background-color:transparent}.btn-link:disabled:focus,.btn-link:disabled:hover{
    color:#818a91;text-decoration:none}.btn-lg,.btn-group-lg>.btn{
    padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{
    padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.btn-block{
    display:block;width:100%}.btn-block+.btn-block{
    margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{
    width:100%}.fade{
    opacity:0;transition:opacity .15s linear}.fade.in{
    opacity:1}.collapse{
    display:none}.collapse.in{
    display:block}.collapsing{
    position:relative;height:0;overflow:hidden;transition-timing-function:ease;transition-duration:.35s;transition-property:height}.dropup,.dropdown{
    position:relative}.dropdown-toggle::after{
    display:inline-block;width:0;height:0;margin-right:.25rem;margin-left:.25rem;vertical-align:middle;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:focus{
    outline:0}.dropup .dropdown-toggle::after{
    border-top:0;border-bottom:.3em solid}.dropdown-menu{
    position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:1rem;color:#373a3c;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{
    height:1px;margin:.5rem 0;overflow:hidden;background-color:#e5e5e5}.dropdown-item{
    display:block;width:100%;padding:3px 20px;clear:both;font-weight:400;color:#373a3c;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{
    color:#2b2d2f;text-decoration:none;background-color:#f5f5f5}.dropdown-item.active,.dropdown-item.active:focus,.dropdown-item.active:hover{
    color:#fff;text-decoration:none;background-color:#5cb85c;outline:0}.dropdown-item.disabled,.dropdown-item.disabled:focus,.dropdown-item.disabled:hover{
    color:#818a91}.dropdown-item.disabled:focus,.dropdown-item.disabled:hover{
    text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:"progid:DXImageTransform.Microsoft.gradient(enabled = false)"}.open>.dropdown-menu{
    display:block}.open>a{
    outline:0}.dropdown-menu-right{
    right:0;left:auto}.dropdown-menu-left{
    right:auto;left:0}.dropdown-header{
    display:block;padding:5px 20px;font-size:.875rem;color:#818a91;white-space:nowrap}.dropdown-backdrop{
    position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{
    content:"";border-top:0;border-bottom:.3em solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{
    top:auto;bottom:100%;margin-bottom:2px}.btn-group,.btn-group-vertical{
    position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{
    position:relative;float:left}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{
    z-index:2}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{
    z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{
    margin-left:-1px}.btn-toolbar{
    margin-left:-5px}.btn-toolbar::after{
    content:"";display:table;clear:both}.btn-toolbar .btn-group,.btn-toolbar .input-group{
    float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{
    margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){
    border-radius:0}.btn-group>.btn:first-child{
    margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){
    border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){
    border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{
    float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{
    border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{
    border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{
    border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{
    outline:0}.btn-group>.btn+.dropdown-toggle{
    padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle{
    padding-right:12px;padding-left:12px}.btn .caret{
    margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret{
    border-width:.3em .3em 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .caret{
    border-width:0 .3em .3em}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{
    display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group::after{
    content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn{
    float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{
    margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){
    border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){
    border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){
    border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{
    border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{
    border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{
    border-top-right-radius:0;border-top-left-radius:0}[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{
    position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{
    position:relative;width:100%;display:flex}.input-group .form-control{
    position:relative;z-index:2;flex:1;margin-bottom:0}.input-group .form-control:focus,.input-group .form-control:active,.input-group .form-control:hover{
    z-index:3}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){
    border-radius:0}.input-group-addon,.input-group-btn{
    white-space:nowrap;vertical-align:middle}.input-group-addon{
    padding:.5rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#55595c;text-align:center;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{
    padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{
    padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{
    margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn{
    border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:not(:last-child){
    border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn:not(:first-child),.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn{
    border-bottom-left-radius:0;border-top-left-radius:0}.form-control+.input-group-addon:not(:first-child){
    border-left:0}.input-group-btn{
    position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{
    position:relative}.input-group-btn>.btn+.btn{
    margin-left:-1px}.input-group-btn>.btn:focus,.input-group-btn>.btn:active,.input-group-btn>.btn:hover{
    z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{
    margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{
    z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:hover,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:hover{
    z-index:3}.custom-control{
    position:relative;display:inline;padding-left:1.5rem;cursor:pointer}.custom-control+.custom-control{
    margin-left:1rem}.custom-control-input{
    position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{
    color:#fff;background-color:#0074d9}.custom-control-input:focus~.custom-control-indicator{
    box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #0074d9}.custom-control-input:active~.custom-control-indicator{
    color:#fff;background-color:#84c6ff}.custom-control-input:disabled~.custom-control-indicator{
    cursor:not-allowed;background-color:#eee}.custom-control-input:disabled~.custom-control-description{
    color:#767676;cursor:not-allowed}.custom-control-indicator{
    position:absolute;top:.0625rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-indicator{
    border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{
    background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA4IDgnPjxwYXRoIGZpbGw9JyNmZmYnIGQ9J002LjU2NC43NWwtMy41OSAzLjYxMi0xLjUzOC0xLjU1TDAgNC4yNiAyLjk3NCA3LjI1IDggMi4xOTN6Jy8+PC9zdmc+)}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{
    background-color:#0074d9;background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDQnPjxwYXRoIHN0cm9rZT0nI2ZmZicgZD0nTTAgMmg0Jy8+PC9zdmc+)}.custom-radio .custom-control-indicator{
    border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{
    background-image:url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9Jy00IC00IDggOCc+PGNpcmNsZSByPSczJyBmaWxsPScjZmZmJy8+PC9zdmc+)}.custom-controls-stacked .custom-control{
    display:inline}.custom-controls-stacked .custom-control::after{
    display:block;margin-bottom:.25rem;content:""}.custom-controls-stacked .custom-control+.custom-control{
    margin-left:0}.custom-select{
    display:inline-block;max-width:100%;padding:.375rem 1.75rem .375rem .75rem;padding-right:.75rem \9;color:#55595c;vertical-align:middle;background:#fff url(data:image/svg+xml;charset=utf8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDUnPjxwYXRoIGZpbGw9JyMzMzMnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLz48L3N2Zz4=) no-repeat right .75rem center;background-image:none \9;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-moz-appearance:none;-webkit-appearance:none}.custom-select:focus{
    border-color:#51a7e8;outline:none}.custom-select::-ms-expand{
    opacity:0}.custom-select-sm{
    padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{
    position:relative;display:inline-block;max-width:100%;height:2.5rem;cursor:pointer}.custom-file-input{
    min-width:14rem;max-width:100%;margin:0;filter:alpha(opacity=0);opacity:0}.custom-file-control{
    position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#555;user-select:none;background-color:#fff;border:1px solid #ddd;border-radius:.25rem}.custom-file-control:lang(en)::after{
    content:"Choose file..."}.custom-file-control::before{
    position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#555;background-color:#eee;border:1px solid #ddd;border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{
    content:"Browse"}.nav{
    padding-left:0;margin-bottom:0;list-style:none}.nav-link{
    display:inline-block}.nav-link:focus,.nav-link:hover{
    text-decoration:none}.nav-link.disabled{
    color:#818a91}.nav-link.disabled,.nav-link.disabled:focus,.nav-link.disabled:hover{
    color:#818a91;cursor:not-allowed;background-color:transparent}.nav-inline .nav-item{
    display:inline-block}.nav-inline .nav-item+.nav-item,.nav-inline .nav-link+.nav-link{
    margin-left:1rem}.nav-tabs{
    border-bottom:1px solid #ddd}.nav-tabs::after{
    content:"";display:table;clear:both}.nav-tabs .nav-item{
    float:left;margin-bottom:-1px}.nav-tabs .nav-item+.nav-item{
    margin-left:.2rem}.nav-tabs .nav-link{
    display:block;padding:.5em 1em;border:1px solid transparent;border-radius:.25rem .25rem 0 0}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{
    border-color:#eceeef #eceeef #ddd}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link.disabled:focus,.nav-tabs .nav-link.disabled:hover{
    color:#818a91;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover,.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link:hover{
    color:#55595c;background-color:#fff;border-color:#ddd #ddd transparent}.nav-tabs .dropdown-menu{
    margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.nav-pills::after{
    content:"";display:table;clear:both}.nav-pills .nav-item{
    float:left}.nav-pills .nav-item+.nav-item{
    margin-left:.2rem}.nav-pills .nav-link{
    display:block;padding:.5em 1em;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .nav-link.active:focus,.nav-pills .nav-link.active:hover,.nav-pills .nav-item.open .nav-link,.nav-pills .nav-item.open .nav-link:focus,.nav-pills .nav-item.open .nav-link:hover{
    color:#fff;cursor:default;background-color:#5cb85c}.nav-stacked .nav-item{
    display:block;float:none}.nav-stacked .nav-item+.nav-item{
    margin-top:.2rem;margin-left:0}.tab-content>.tab-pane{
    display:none}.tab-content>.active{
    display:block}.navbar{
    position:relative;padding:.5rem 1rem}.navbar::after{
    content:"";display:table;clear:both}@media(min-width:544px){
    .navbar{
    border-radius:.25rem}}.navbar-full{
    z-index:1000}@media(min-width:544px){
    .navbar-full{
    border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{
    position:fixed;right:0;left:0;z-index:1030}@media(min-width:544px){
    .navbar-fixed-top,.navbar-fixed-bottom{
    border-radius:0}}.navbar-fixed-top{
    top:0}.navbar-fixed-bottom{
    bottom:0}.navbar-sticky-top{
    position:sticky;top:0;z-index:1030;width:100%}@media(min-width:544px){
    .navbar-sticky-top{
    border-radius:0}}.navbar-brand{
    float:left;padding-top:.25rem;padding-bottom:.25rem;margin-right:1rem;font-size:1.25rem}.navbar-brand:focus,.navbar-brand:hover{
    text-decoration:none}.navbar-brand>img{
    display:block}.navbar-divider{
    float:left;width:1px;padding-top:.425rem;padding-bottom:.425rem;margin-right:1rem;margin-left:1rem;overflow:hidden}.navbar-divider::before{
    content:"\00a0"}.navbar-toggler{
    padding:.5rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{
    text-decoration:none}@media(min-width:544px){
    .navbar-toggleable-xs{
    display:block!important}}@media(min-width:768px){
    .navbar-toggleable-sm{
    display:block!important}}@media(min-width:992px){
    .navbar-toggleable-md{
    display:block!important}}.navbar-nav .nav-item{
    float:left}.navbar-nav .nav-link{
    display:block;padding-top:.425rem;padding-bottom:.425rem}.navbar-nav .nav-link+.nav-link{
    margin-left:1rem}.navbar-nav .nav-item+.nav-item{
    margin-left:1rem}.navbar-light .navbar-brand{
    color:rgba(0,0,0,.8)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{
    color:rgba(0,0,0,.8)}.navbar-light .navbar-nav .nav-link{
    color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{
    color:rgba(0,0,0,.6)}.navbar-light .navbar-nav .open>.nav-link,.navbar-light .navbar-nav .open>.nav-link:focus,.navbar-light .navbar-nav .open>.nav-link:hover,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .active>.nav-link:focus,.navbar-light .navbar-nav .active>.nav-link:hover,.navbar-light .navbar-nav .nav-link.open,.navbar-light .navbar-nav .nav-link.open:focus,.navbar-light .navbar-nav .nav-link.open:hover,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.active:focus,.navbar-light .navbar-nav .nav-link.active:hover{
    color:rgba(0,0,0,.8)}.navbar-light .navbar-divider{
    background-color:rgba(0,0,0,.075)}.navbar-dark .navbar-brand{
    color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{
    color:#fff}.navbar-dark .navbar-nav .nav-link{
    color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{
    color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .open>.nav-link,.navbar-dark .navbar-nav .open>.nav-link:focus,.navbar-dark .navbar-nav .open>.nav-link:hover,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .active>.nav-link:focus,.navbar-dark .navbar-nav .active>.nav-link:hover,.navbar-dark .navbar-nav .nav-link.open,.navbar-dark .navbar-nav .nav-link.open:focus,.navbar-dark .navbar-nav .nav-link.open:hover,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.active:focus,.navbar-dark .navbar-nav .nav-link.active:hover{
    color:#fff}.navbar-dark .navbar-divider{
    background-color:rgba(255,255,255,.075)}.card{
    position:relative;display:block;margin-bottom:.75rem;background-color:#fff;border-radius:.25rem;box-shadow:inset 0 0 0 1px rgba(0,0,0,.125)}.card-block{
    padding:1.25rem}.card-block::after{
    content:"";display:table;clear:both}.card-title{
    margin-bottom:.75rem}.card-subtitle{
    margin-top:-.375rem;margin-bottom:0}.card-text:last-child{
    margin-bottom:0}.card-link:hover{
    text-decoration:none}.card-link+.card-link{
    margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{
    border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{
    border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{
    padding:.75rem 1.25rem;background-color:#f5f5f5;box-shadow:inset 0 0 0 1px rgba(0,0,0,.125)}.card-header::after{
    content:"";display:table;clear:both}.card-header:first-child{
    border-radius:.25rem .25rem 0 0}.card-footer{
    padding:.75rem 1.25rem;background-color:#f5f5f5;box-shadow:inset 0 0 0 1px rgba(0,0,0,.125)}.card-footer::after{
    content:"";display:table;clear:both}.card-footer:last-child{
    border-radius:0 0 .25rem .25rem}.card-header-tabs{
    margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-tabs .nav-item{
    margin-bottom:0}.card-header-pills{
    margin-right:-.625rem;margin-left:-.625rem}.card-primary{
    background-color:#5cb85c;border-color:#5cb85c}.card-success{
    background-color:#5cb85c;border-color:#5cb85c}.card-info{
    background-color:#5bc0de;border-color:#5bc0de}.card-warning{
    background-color:#f0ad4e;border-color:#f0ad4e}.card-danger{
    background-color:#b85c5c;border-color:#b85c5c}.card-outline-primary{
    background-color:transparent;border-color:#5cb85c}.card-outline-secondary{
    background-color:transparent;border-color:#ccc}.card-outline-info{
    background-color:transparent;border-color:#5bc0de}.card-outline-success{
    background-color:transparent;border-color:#5cb85c}.card-outline-warning{
    background-color:transparent;border-color:#f0ad4e}.card-outline-danger{
    background-color:transparent;border-color:#b85c5c}.card-inverse .card-header,.card-inverse .card-footer{
    border-bottom:1px solid rgba(255,255,255,.2)}.card-inverse .card-header,.card-inverse .card-footer,.card-inverse .card-title,.card-inverse .card-blockquote{
    color:#fff}.card-inverse .card-link,.card-inverse .card-text,.card-inverse .card-blockquote>footer{
    color:rgba(255,255,255,.65)}.card-inverse .card-link:focus,.card-inverse .card-link:hover{
    color:#fff}.card-blockquote{
    padding:0;margin-bottom:0;border-left:0}.card-img{
    border-radius:.25rem}.card-img-overlay{
    position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img-top{
    border-radius:.25rem .25rem 0 0}.card-img-bottom{
    border-radius:0 0 .25rem .25rem}@media(min-width:544px){
    .card-deck{
    display:flex;flex-flow:row wrap;margin-right:-.625rem;margin-left:-.625rem}.card-deck .card{
    flex:1 0 0;margin-right:.625rem;margin-left:.625rem}}@media(min-width:544px){
    .card-group{
    display:flex;flex-flow:row wrap}.card-group .card{
    flex:1 0 0}.card-group .card+.card{
    margin-left:0;border-left:0}.card-group .card:first-child{
    border-bottom-right-radius:0;border-top-right-radius:0}.card-group .card:first-child .card-img-top{
    border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{
    border-bottom-right-radius:0}.card-group .card:last-child{
    border-bottom-left-radius:0;border-top-left-radius:0}.card-group .card:last-child .card-img-top{
    border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{
    border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){
    border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-top,.card-group .card:not(:first-child):not(:last-child) .card-img-bottom{
    border-radius:0}}@media(min-width:544px){
    .card-columns{
    column-count:3;column-gap:1.25rem}.card-columns .card{
    display:inline-block;width:100%}}.breadcrumb{
    padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eceeef;border-radius:.25rem}.breadcrumb::after{
    content:"";display:table;clear:both}.breadcrumb-item{
    float:left}.breadcrumb-item+.breadcrumb-item::before{
    display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#818a91;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{
    text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{
    text-decoration:none}.breadcrumb-item.active{
    color:#818a91}.pagination{
    display:inline-block;padding-left:0;margin-top:1rem;margin-bottom:1rem;border-radius:.25rem}.page-item{
    display:inline}.page-item:first-child .page-link{
    margin-left:0;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.page-item:last-child .page-link{
    border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link,.page-item.active .page-link:focus,.page-item.active .page-link:hover{
    z-index:2;color:#fff;cursor:default;background-color:#5cb85c;border-color:#5cb85c}.page-item.disabled .page-link,.page-item.disabled .page-link:focus,.page-item.disabled .page-link:hover{
    color:#818a91;pointer-events:none;cursor:not-allowed;background-color:#fff;border-color:#ddd}.page-link{
    position:relative;float:left;padding:.5rem .75rem;margin-left:-1px;color:#5cb85c;text-decoration:none;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{
    color:#3d8b3d;background-color:#eceeef;border-color:#ddd}.pagination-lg .page-link{
    padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{
    border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{
    border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.pagination-sm .page-link{
    padding:.275rem .75rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{
    border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{
    border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.tag{
    display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.tag:empty{
    display:none}.btn .tag{
    position:relative;top:-1px}a.tag:focus,a.tag:hover{
    color:#fff;text-decoration:none;cursor:pointer}.tag-pill{
    padding-right:.6em;padding-left:.6em;border-radius:10rem}.tag-default{
    background-color:#818a91}.tag-default[href]:focus,.tag-default[href]:hover{
    background-color:#687077}.tag-primary{
    background-color:#5cb85c}.tag-primary[href]:focus,.tag-primary[href]:hover{
    background-color:#449d44}.tag-success{
    background-color:#5cb85c}.tag-success[href]:focus,.tag-success[href]:hover{
    background-color:#449d44}.tag-info{
    background-color:#5bc0de}.tag-info[href]:focus,.tag-info[href]:hover{
    background-color:#31b0d5}.tag-warning{
    background-color:#f0ad4e}.tag-warning[href]:focus,.tag-warning[href]:hover{
    background-color:#ec971f}.tag-danger{
    background-color:#b85c5c}.tag-danger[href]:focus,.tag-danger[href]:hover{
    background-color:#9d4444}.jumbotron{
    padding:2rem 1rem;margin-bottom:2rem;background-color:#eceeef;border-radius:.3rem}@media(min-width:544px){
    .jumbotron{
    padding:4rem 2rem}}.jumbotron-hr{
    border-top-color:#d0d5d8}.jumbotron-fluid{
    padding-right:0;padding-left:0;border-radius:0}.alert{
    padding:15px;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{
    color:inherit}.alert-link{
    font-weight:700}.alert-dismissible{
    padding-right:35px}.alert-dismissible .close{
    position:relative;top:-2px;right:-21px;color:inherit}.alert-success{
    background-color:#dff0d8;border-color:#d0e9c6;color:#3c763d}.alert-success hr{
    border-top-color:#c1e2b3}.alert-success .alert-link{
    color:#2b542c}.alert-info{
    background-color:#d9edf7;border-color:#bcdff1;color:#31708f}.alert-info hr{
    border-top-color:#a6d5ec}.alert-info .alert-link{
    color:#245269}.alert-warning{
    background-color:#fcf8e3;border-color:#faf2cc;color:#8a6d3b}.alert-warning hr{
    border-top-color:#f7ecb5}.alert-warning .alert-link{
    color:#66512c}.alert-danger{
    background-color:#f2dede;border-color:#ebcccc;color:#a94442}.alert-danger hr{
    border-top-color:#e4b9b9}.alert-danger .alert-link{
    color:#843534}@keyframes progress-bar-stripes{
    from{
    background-position:1rem 0}to{
    background-position:0 0}}.progress{
    display:block;width:100%;height:1rem;margin-bottom:1rem}.progress[value]{
    background-color:#eee;border:0;appearance:none;border-radius:.25rem}.progress[value]::-ms-fill{
    background-color:#0074d9;border:0}.progress[value]::-moz-progress-bar{
    background-color:#0074d9;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.progress[value]::-webkit-progress-value{
    background-color:#0074d9;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.progress[value="100"]::-moz-progress-bar{
    border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.progress[value="100"]::-webkit-progress-value{
    border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.progress[value]::-webkit-progress-bar{
    background-color:#eee;border-radius:.25rem}base::-moz-progress-bar,.progress[value]{
    background-color:#eee;border-radius:.25rem}@media screen and (min-width:0\0){
    .progress{
    background-color:#eee;border-radius:.25rem}.progress-bar{
    display:inline-block;height:1rem;text-indent:-999rem;background-color:#0074d9;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.progress[width="100%"]{
    border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}}.progress-striped[value]::-webkit-progress-value{
    background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-striped[value]::-moz-progress-bar{
    background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-striped[value]::-ms-fill{
    background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}@media screen and (min-width:0\0){
    .progress-bar-striped{
    background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}}.progress-animated[value]::-webkit-progress-value{
    animation:progress-bar-stripes 2s linear infinite}.progress-animated[value]::-moz-progress-bar{
    animation:progress-bar-stripes 2s linear infinite}@media screen and (min-width:0\0){
    .progress-animated .progress-bar-striped{
    animation:progress-bar-stripes 2s linear infinite}}.progress-success[value]::-webkit-progress-value{
    background-color:#5cb85c}.progress-success[value]::-moz-progress-bar{
    background-color:#5cb85c}.progress-success[value]::-ms-fill{
    background-color:#5cb85c}@media screen and (min-width:0\0){
    .progress-success .progress-bar{
    background-color:#5cb85c}}.progress-info[value]::-webkit-progress-value{
    background-color:#5bc0de}.progress-info[value]::-moz-progress-bar{
    background-color:#5bc0de}.progress-info[value]::-ms-fill{
    background-color:#5bc0de}@media screen and (min-width:0\0){
    .progress-info .progress-bar{
    background-color:#5bc0de}}.progress-warning[value]::-webkit-progress-value{
    background-color:#f0ad4e}.progress-warning[value]::-moz-progress-bar{
    background-color:#f0ad4e}.progress-warning[value]::-ms-fill{
    background-color:#f0ad4e}@media screen and (min-width:0\0){
    .progress-warning .progress-bar{
    background-color:#f0ad4e}}.progress-danger[value]::-webkit-progress-value{
    background-color:#b85c5c}.progress-danger[value]::-moz-progress-bar{
    background-color:#b85c5c}.progress-danger[value]::-ms-fill{
    background-color:#b85c5c}@media screen and (min-width:0\0){
    .progress-danger .progress-bar{
    background-color:#b85c5c}}.media{
    display:flex;margin-bottom:1rem}.media-body{
    flex:1}.media-middle{
    align-self:center}.media-bottom{
    align-self:flex-end}.media-object{
    display:block}.media-object.img-thumbnail{
    max-width:none}.media-right{
    padding-left:10px}.media-left{
    padding-right:10px}.media-heading{
    margin-top:0;margin-bottom:5px}.media-list{
    padding-left:0;list-style:none}.list-group{
    padding-left:0;margin-bottom:0}.list-group-item{
    position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{
    border-top-right-radius:.25rem;border-top-left-radius:.25rem}.list-group-item:last-child{
    margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{
    color:#818a91;cursor:not-allowed;background-color:#eceeef}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{
    color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{
    color:#818a91}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{
    z-index:2;color:#fff;text-decoration:none;background-color:#5cb85c;border-color:#5cb85c}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>.small{
    color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{
    color:#eaf6ea}.list-group-flush .list-group-item{
    border-radius:0}.list-group-item-action{
    width:100%;color:#555;text-align:inherit}.list-group-item-action .list-group-item-heading{
    color:#333}.list-group-item-action:focus,.list-group-item-action:hover{
    color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item-success{
    color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{
    color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{
    color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{
    color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{
    color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{
    color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{
    color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{
    color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{
    color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{
    color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{
    color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{
    color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{
    color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{
    color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{
    color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{
    color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{
    color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{
    color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{
    color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{
    color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{
    margin-top:0;margin-bottom:5px}.list-group-item-text{
    margin-bottom:0;line-height:1.3}.embed-responsive{
    position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{
    position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9{
    padding-bottom:42.85714%}.embed-responsive-16by9{
    padding-bottom:56.25%}.embed-responsive-4by3{
    padding-bottom:75%}.embed-responsive-1by1{
    padding-bottom:100%}.close{
    float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{
    color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{
    padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{
    overflow:hidden}.modal{
    position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0;-webkit-overflow-scrolling:touch}.modal.fade .modal-dialog{
    transition:transform .3s ease-out;transform:translate(0,-25%)}.modal.in .modal-dialog{
    transform:translate(0,0)}.modal-open .modal{
    overflow-x:hidden;overflow-y:auto}.modal-dialog{
    position:relative;width:auto;margin:10px}.modal-content{
    position:relative;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{
    position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{
    opacity:0}.modal-backdrop.in{
    opacity:.5}.modal-header{
    padding:15px;border-bottom:1px solid #e5e5e5}.modal-header::after{
    content:"";display:table;clear:both}.modal-header .close{
    margin-top:-2px}.modal-title{
    margin:0;line-height:1.5}.modal-body{
    position:relative;padding:15px}.modal-footer{
    padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer::after{
    content:"";display:table;clear:both}.modal-scrollbar-measure{
    position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width:544px){
    .modal-dialog{
    max-width:600px;margin:30px auto}.modal-sm{
    max-width:300px}}@media(min-width:992px){
    .modal-lg{
    max-width:900px}}.tooltip{
    position:absolute;z-index:1070;display:block;font-family:source sans pro,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.in{
    opacity:.9}.tooltip.tooltip-top,.tooltip.bs-tether-element-attached-bottom{
    padding:5px 0;margin-top:-3px}.tooltip.tooltip-top .tooltip-arrow,.tooltip.bs-tether-element-attached-bottom .tooltip-arrow{
    bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.tooltip-right,.tooltip.bs-tether-element-attached-left{
    padding:0 5px;margin-left:3px}.tooltip.tooltip-right .tooltip-arrow,.tooltip.bs-tether-element-attached-left .tooltip-arrow{
    top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.tooltip-bottom,.tooltip.bs-tether-element-attached-top{
    padding:5px 0;margin-top:3px}.tooltip.tooltip-bottom .tooltip-arrow,.tooltip.bs-tether-element-attached-top .tooltip-arrow{
    top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.tooltip-left,.tooltip.bs-tether-element-attached-right{
    padding:0 5px;margin-left:-3px}.tooltip.tooltip-left .tooltip-arrow,.tooltip.bs-tether-element-attached-right .tooltip-arrow{
    top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{
    max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.tooltip-arrow{
    position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{
    position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:source sans pro,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.popover-top,.popover.bs-tether-element-attached-bottom{
    margin-top:-10px}.popover.popover-top .popover-arrow,.popover.bs-tether-element-attached-bottom .popover-arrow{
    bottom:-11px;left:50%;margin-left:-11px;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.popover-top .popover-arrow::after,.popover.bs-tether-element-attached-bottom .popover-arrow::after{
    bottom:1px;margin-left:-10px;content:"";border-top-color:#fff;border-bottom-width:0}.popover.popover-right,.popover.bs-tether-element-attached-left{
    margin-left:10px}.popover.popover-right .popover-arrow,.popover.bs-tether-element-attached-left .popover-arrow{
    top:50%;left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.popover-right .popover-arrow::after,.popover.bs-tether-element-attached-left .popover-arrow::after{
    bottom:-10px;left:1px;content:"";border-right-color:#fff;border-left-width:0}.popover.popover-bottom,.popover.bs-tether-element-attached-top{
    margin-top:10px}.popover.popover-bottom .popover-arrow,.popover.bs-tether-element-attached-top .popover-arrow{
    top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,.25)}.popover.popover-bottom .popover-arrow::after,.popover.bs-tether-element-attached-top .popover-arrow::after{
    top:1px;margin-left:-10px;content:"";border-top-width:0;border-bottom-color:#fff}.popover.popover-left,.popover.bs-tether-element-attached-right{
    margin-left:-10px}.popover.popover-left .popover-arrow,.popover.bs-tether-element-attached-right .popover-arrow{
    top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,.25)}.popover.popover-left .popover-arrow::after,.popover.bs-tether-element-attached-right .popover-arrow::after{
    right:1px;bottom:-10px;content:"";border-right-width:0;border-left-color:#fff}.popover-title{
    padding:8px 14px;margin:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:.2375rem .2375rem 0 0}.popover-content{
    padding:9px 14px}.popover-arrow,.popover-arrow::after{
    position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover-arrow{
    border-width:11px}.popover-arrow::after{
    content:"";border-width:10px}.carousel{
    position:relative}.carousel-inner{
    position:relative;width:100%;overflow:hidden}.carousel-inner>.carousel-item{
    position:relative;display:none;transition:.6s ease-in-out left}.carousel-inner>.carousel-item>img,.carousel-inner>.carousel-item>a>img{
    line-height:1}@media all and (transform-3d),(-webkit-transform-3d){
    .carousel-inner>.carousel-item{
    transition:transform .6s ease-in-out;backface-visibility:hidden;perspective:1000px}.carousel-inner>.carousel-item.next,.carousel-inner>.carousel-item.active.right{
    left:0;transform:translate3d(100%,0,0)}.carousel-inner>.carousel-item.prev,.carousel-inner>.carousel-item.active.left{
    left:0;transform:translate3d(-100%,0,0)}.carousel-inner>.carousel-item.next.left,.carousel-inner>.carousel-item.prev.right,.carousel-inner>.carousel-item.active{
    left:0;transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{
    display:block}.carousel-inner>.active{
    left:0}.carousel-inner>.next,.carousel-inner>.prev{
    position:absolute;top:0;width:100%}.carousel-inner>.next{
    left:100%}.carousel-inner>.prev{
    left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{
    left:0}.carousel-inner>.active.left{
    left:-100%}.carousel-inner>.active.right{
    left:100%}.carousel-control{
    position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5}.carousel-control.left{
    background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0%,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{
    right:0;left:auto;background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0%,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:focus,.carousel-control:hover{
    color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next{
    position:absolute;top:50%;z-index:5;display:inline-block;width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev{
    left:50%;margin-left:-10px}.carousel-control .icon-next{
    right:50%;margin-right:-10px}.carousel-control .icon-prev::before{
    content:"\2039"}.carousel-control .icon-next::before{
    content:"\203a"}.carousel-indicators{
    position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{
    display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:transparent;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{
    width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{
    position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{
    text-shadow:none}@media(min-width:544px){
    .carousel-control .icon-prev,.carousel-control .icon-next{
    width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .icon-prev{
    margin-left:-15px}.carousel-control .icon-next{
    margin-right:-15px}.carousel-caption{
    right:20%;left:20%;padding-bottom:30px}.carousel-indicators{
    bottom:20px}}.bg-inverse{
    color:#eceeef;background-color:#373a3c}.bg-faded{
    background-color:#f7f7f9}.bg-primary{
    color:#fff!important;background-color:#5cb85c!important}a.bg-primary:focus,a.bg-primary:hover{
    background-color:#449d44!important}.bg-success{
    color:#fff!important;background-color:#5cb85c!important}a.bg-success:focus,a.bg-success:hover{
    background-color:#449d44!important}.bg-info{
    color:#fff!important;background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{
    background-color:#31b0d5!important}.bg-warning{
    color:#fff!important;background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{
    background-color:#ec971f!important}.bg-danger{
    color:#fff!important;background-color:#b85c5c!important}a.bg-danger:focus,a.bg-danger:hover{
    background-color:#9d4444!important}.clearfix::after{
    content:"";display:table;clear:both}.pull-xs-left{
    float:left!important}.pull-xs-right{
    float:right!important}.pull-xs-none{
    float:none!important}@media(min-width:544px){
    .pull-sm-left{
    float:left!important}.pull-sm-right{
    float:right!important}.pull-sm-none{
    float:none!important}}@media(min-width:768px){
    .pull-md-left{
    float:left!important}.pull-md-right{
    float:right!important}.pull-md-none{
    float:none!important}}@media(min-width:992px){
    .pull-lg-left{
    float:left!important}.pull-lg-right{
    float:right!important}.pull-lg-none{
    float:none!important}}@media(min-width:1200px){
    .pull-xl-left{
    float:left!important}.pull-xl-right{
    float:right!important}.pull-xl-none{
    float:none!important}}.sr-only{
    position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{
    position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.m-x-auto{
    margin-right:auto!important;margin-left:auto!important}.m-a-0{
    margin:0!important}.m-t-0{
    margin-top:0!important}.m-r-0{
    margin-right:0!important}.m-b-0{
    margin-bottom:0!important}.m-l-0{
    margin-left:0!important}.m-x-0{
    margin-right:0!important;margin-left:0!important}.m-y-0{
    margin-top:0!important;margin-bottom:0!important}.m-a-1{
    margin:1rem!important}.m-t-1{
    margin-top:1rem!important}.m-r-1{
    margin-right:1rem!important}.m-b-1{
    margin-bottom:1rem!important}.m-l-1{
    margin-left:1rem!important}.m-x-1{
    margin-right:1rem!important;margin-left:1rem!important}.m-y-1{
    margin-top:1rem!important;margin-bottom:1rem!important}.m-a-2{
    margin:1.5rem!important}.m-t-2{
    margin-top:1.5rem!important}.m-r-2{
    margin-right:1.5rem!important}.m-b-2{
    margin-bottom:1.5rem!important}.m-l-2{
    margin-left:1.5rem!important}.m-x-2{
    margin-right:1.5rem!important;margin-left:1.5rem!important}.m-y-2{
    margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-a-3{
    margin:3rem!important}.m-t-3{
    margin-top:3rem!important}.m-r-3{
    margin-right:3rem!important}.m-b-3{
    margin-bottom:3rem!important}.m-l-3{
    margin-left:3rem!important}.m-x-3{
    margin-right:3rem!important;margin-left:3rem!important}.m-y-3{
    margin-top:3rem!important;margin-bottom:3rem!important}.p-a-0{
    padding:0!important}.p-t-0{
    padding-top:0!important}.p-r-0{
    padding-right:0!important}.p-b-0{
    padding-bottom:0!important}.p-l-0{
    padding-left:0!important}.p-x-0{
    padding-right:0!important;padding-left:0!important}.p-y-0{
    padding-top:0!important;padding-bottom:0!important}.p-a-1{
    padding:1rem!important}.p-t-1{
    padding-top:1rem!important}.p-r-1{
    padding-right:1rem!important}.p-b-1{
    padding-bottom:1rem!important}.p-l-1{
    padding-left:1rem!important}.p-x-1{
    padding-right:1rem!important;padding-left:1rem!important}.p-y-1{
    padding-top:1rem!important;padding-bottom:1rem!important}.p-a-2{
    padding:1.5rem!important}.p-t-2{
    padding-top:1.5rem!important}.p-r-2{
    padding-right:1.5rem!important}.p-b-2{
    padding-bottom:1.5rem!important}.p-l-2{
    padding-left:1.5rem!important}.p-x-2{
    padding-right:1.5rem!important;padding-left:1.5rem!important}.p-y-2{
    padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-a-3{
    padding:3rem!important}.p-t-3{
    padding-top:3rem!important}.p-r-3{
    padding-right:3rem!important}.p-b-3{
    padding-bottom:3rem!important}.p-l-3{
    padding-left:3rem!important}.p-x-3{
    padding-right:3rem!important;padding-left:3rem!important}.p-y-3{
    padding-top:3rem!important;padding-bottom:3rem!important}.pos-f-t{
    position:fixed;top:0;right:0;left:0;z-index:1030}.text-justify{
    text-align:justify!important}.text-nowrap{
    white-space:nowrap!important}.text-truncate{
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-xs-left{
    text-align:left!important}.text-xs-right{
    text-align:right!important}.text-xs-center{
    text-align:center!important}@media(min-width:544px){
    .text-sm-left{
    text-align:left!important}.text-sm-right{
    text-align:right!important}.text-sm-center{
    text-align:center!important}}@media(min-width:768px){
    .text-md-left{
    text-align:left!important}.text-md-right{
    text-align:right!important}.text-md-center{
    text-align:center!important}}@media(min-width:992px){
    .text-lg-left{
    text-align:left!important}.text-lg-right{
    text-align:right!important}.text-lg-center{
    text-align:center!important}}@media(min-width:1200px){
    .text-xl-left{
    text-align:left!important}.text-xl-right{
    text-align:right!important}.text-xl-center{
    text-align:center!important}}.text-lowercase{
    text-transform:lowercase!important}.text-uppercase{
    text-transform:uppercase!important}.text-capitalize{
    text-transform:capitalize!important}.font-weight-normal{
    font-weight:400}.font-weight-bold{
    font-weight:700}.font-italic{
    font-style:italic}.text-muted{
    color:#818a91!important}a.text-muted:focus,a.text-muted:hover{
    color:#687077}.text-primary{
    color:#5cb85c!important}a.text-primary:focus,a.text-primary:hover{
    color:#449d44}.text-success{
    color:#5cb85c!important}a.text-success:focus,a.text-success:hover{
    color:#449d44}.text-info{
    color:#5bc0de!important}a.text-info:focus,a.text-info:hover{
    color:#31b0d5}.text-warning{
    color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{
    color:#ec971f}.text-danger{
    color:#b85c5c!important}a.text-danger:focus,a.text-danger:hover{
    color:#9d4444}.text-hide{
    font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.invisible{
    visibility:hidden!important}.hidden-xs-up{
    display:none!important}@media(max-width:543px){
    .hidden-xs-down{
    display:none!important}}@media(min-width:544px){
    .hidden-sm-up{
    display:none!important}}@media(max-width:767px){
    .hidden-sm-down{
    display:none!important}}@media(min-width:768px){
    .hidden-md-up{
    display:none!important}}@media(max-width:991px){
    .hidden-md-down{
    display:none!important}}@media(min-width:992px){
    .hidden-lg-up{
    display:none!important}}@media(max-width:1199px){
    .hidden-lg-down{
    display:none!important}}@media(min-width:1200px){
    .hidden-xl-up{
    display:none!important}}.hidden-xl-down{
    display:none!important}.visible-print-block{
    display:none!important}@media print{
    .visible-print-block{
    display:block!important}}.visible-print-inline{
    display:none!important}@media print{
    .visible-print-inline{
    display:inline!important}}.visible-print-inline-block{
    display:none!important}@media print{
    .visible-print-inline-block{
    display:inline-block!important}}@media print{
    .hidden-print{
    display:none!important}}.flex-xs-first{
    order:-1}.flex-xs-last{
    order:1}.flex-items-xs-top{
    align-items:flex-start}.flex-items-xs-middle{
    align-items:center}.flex-items-xs-bottom{
    align-items:flex-end}.flex-xs-top{
    align-self:flex-start}.flex-xs-middle{
    align-self:center}.flex-xs-bottom{
    align-self:flex-end}.flex-items-xs-left{
    justify-content:flex-start}.flex-items-xs-center{
    justify-content:center}.flex-items-xs-right{
    justify-content:flex-end}.flex-items-xs-around{
    justify-content:space-around}.flex-items-xs-between{
    justify-content:space-between}@media(min-width:544px){
    .flex-sm-first{
    order:-1}.flex-sm-last{
    order:1}}@media(min-width:544px){
    .flex-items-sm-top{
    align-items:flex-start}.flex-items-sm-middle{
    align-items:center}.flex-items-sm-bottom{
    align-items:flex-end}}@media(min-width:544px){
    .flex-sm-top{
    align-self:flex-start}.flex-sm-middle{
    align-self:center}.flex-sm-bottom{
    align-self:flex-end}}@media(min-width:544px){
    .flex-items-sm-left{
    justify-content:flex-start}.flex-items-sm-center{
    justify-content:center}.flex-items-sm-right{
    justify-content:flex-end}.flex-items-sm-around{
    justify-content:space-around}.flex-items-sm-between{
    justify-content:space-between}}@media(min-width:768px){
    .flex-md-first{
    order:-1}.flex-md-last{
    order:1}}@media(min-width:768px){
    .flex-items-md-top{
    align-items:flex-start}.flex-items-md-middle{
    align-items:center}.flex-items-md-bottom{
    align-items:flex-end}}@media(min-width:768px){
    .flex-md-top{
    align-self:flex-start}.flex-md-middle{
    align-self:center}.flex-md-bottom{
    align-self:flex-end}}@media(min-width:768px){
    .flex-items-md-left{
    justify-content:flex-start}.flex-items-md-center{
    justify-content:center}.flex-items-md-right{
    justify-content:flex-end}.flex-items-md-around{
    justify-content:space-around}.flex-items-md-between{
    justify-content:space-between}}@media(min-width:992px){
    .flex-lg-first{
    order:-1}.flex-lg-last{
    order:1}}@media(min-width:992px){
    .flex-items-lg-top{
    align-items:flex-start}.flex-items-lg-middle{
    align-items:center}.flex-items-lg-bottom{
    align-items:flex-end}}@media(min-width:992px){
    .flex-lg-top{
    align-self:flex-start}.flex-lg-middle{
    align-self:center}.flex-lg-bottom{
    align-self:flex-end}}@media(min-width:992px){
    .flex-items-lg-left{
    justify-content:flex-start}.flex-items-lg-center{
    justify-content:center}.flex-items-lg-right{
    justify-content:flex-end}.flex-items-lg-around{
    justify-content:space-around}.flex-items-lg-between{
    justify-content:space-between}}@media(min-width:1200px){
    .flex-xl-first{
    order:-1}.flex-xl-last{
    order:1}}@media(min-width:1200px){
    .flex-items-xl-top{
    align-items:flex-start}.flex-items-xl-middle{
    align-items:center}.flex-items-xl-bottom{
    align-items:flex-end}}@media(min-width:1200px){
    .flex-xl-top{
    align-self:flex-start}.flex-xl-middle{
    align-self:center}.flex-xl-bottom{
    align-self:flex-end}}@media(min-width:1200px){
    .flex-items-xl-left{
    justify-content:flex-start}.flex-items-xl-center{
    justify-content:center}.flex-items-xl-right{
    justify-content:flex-end}.flex-items-xl-around{
    justify-content:space-around}.flex-items-xl-between{
    justify-content:space-between}}.tag-default{
    color:#fff!important;font-size:.8rem;padding-top:.1rem;padding-bottom:.1rem;white-space:nowrap;margin-right:3px;margin-bottom:.2rem;display:inline-block}.tag-default:hover{
    text-decoration:none}.tag-default.tag-outline{
    border:1px solid #ddd;color:#aaa!important;background:0 0!important}ul.tag-list{
    padding-left:0!important;display:inline-block;list-style:none!important}ul.tag-list li{
    display:inline-block!important}.navbar-brand{
    font-family:titillium web,sans-serif;font-size:1.5rem!important;padding-top:0!important;margin-right:2rem!important;color:#5cb85c!important}.nav-link .user-pic{
    height:26px;border-radius:50px;float:left;margin-right:5px}.nav-link:hover{
    transition:.1s all}.nav-pills.outline-active .nav-link{
    border-radius:0;border:none;border-bottom:2px solid transparent;background:0 0;color:#aaa}.nav-pills.outline-active .nav-link:hover{
    color:#555}.nav-pills.outline-active .nav-link.active{
    background:#fff!important;border-bottom:2px solid #5cb85c!important;color:#5cb85c!important}footer{
    background:#f3f3f3;margin-top:3rem;padding:1rem 0;position:absolute;bottom:0;width:100%}footer .logo-font{
    vertical-align:middle}footer .attribution{
    vertical-align:middle;margin-left:10px;font-size:.8rem;color:#bbb;font-weight:300}.error-messages{
    color:#b85c5c!important;font-weight:700}.banner{
    color:#fff;background:#333;padding:2rem;margin-bottom:2rem}.banner h1{
    text-shadow:0 1px 3px rgba(0,0,0,.3);margin-bottom:0}.container.page{
    margin-top:1.5rem}.preview-link{
    color:inherit!important}.preview-link:hover{
    text-decoration:inherit!important}.article-meta{
    display:block;position:relative;font-weight:300}.article-meta img{
    display:inline-block;vertical-align:middle;height:32px;width:32px;border-radius:30px}.article-meta .info{
    margin:0 1.5rem 0 .3rem;display:inline-block;vertical-align:middle;line-height:1rem}.article-meta .info .author{
    display:block;font-weight:500!important}.article-meta .info .date{
    color:#bbb;font-size:.8rem;display:block}.article-preview{
    border-top:1px solid rgba(0,0,0,.1);padding:1.5rem 0}.article-preview .article-meta{
    margin:0 0 1rem}.article-preview .preview-link h1{
    font-weight:600!important;font-size:1.5rem!important;margin-bottom:3px}.article-preview .preview-link p{
    font-weight:300;font-size:24px;color:#999;margin-bottom:15px;font-size:1rem;line-height:1.3rem}.article-preview .preview-link span{
    max-width:30%;font-size:.8rem;font-weight:300;color:#bbb;vertical-align:middle}.article-preview .preview-link ul{
    float:right;max-width:50%;vertical-align:top}.article-preview .preview-link ul li{
    font-weight:300;font-size:.8rem!important;padding-top:0!important;padding-bottom:0!important}.btn .counter{
    font-size:.8rem!important}.home-page .banner{
    background:#5cb85c;box-shadow:inset 0 8px 8px -8px rgba(0,0,0,.3),inset 0 -8px 8px -8px rgba(0,0,0,.3)}.home-page .banner p{
    color:#fff;text-align:center;font-size:1.5rem;font-weight:300!important;margin-bottom:0}.home-page .banner h1{
    text-shadow:0 1px 3px rgba(0,0,0,.3);font-weight:700!important;text-align:center;font-size:3.5rem;padding-bottom:.5rem}.home-page .feed-toggle{
    margin-bottom:-1px}.home-page .sidebar{
    padding:5px 10px 10px;background:#f3f3f3;border-radius:4px}.home-page .sidebar p{
    margin-bottom:.2rem}.article-page .banner{
    padding:2rem 0}.article-page .banner h1{
    font-size:2.8rem;font-weight:600}.article-page .banner .btn{
    opacity:.8}.article-page .banner .btn:hover{
    transition:.1s all;opacity:1}.article-page .banner .article-meta{
    margin:2rem 0 0}.article-page .banner .article-meta .author{
    color:#fff}.article-page .article-content p{
    font-family:'source serif pro',serif;font-size:1.2rem;line-height:1.8rem;margin-bottom:2rem}.article-page .article-content h1,.article-page .article-content h2,.article-page .article-content h3,.article-page .article-content h4,.article-page .article-content h5,.article-page .article-content h6{
    font-weight:500!important;margin:1.6rem 0 1rem}.article-page .article-actions{
    text-align:center;margin:1.5rem 0 3rem}.article-page .article-actions .article-meta .info{
    text-align:left}.article-page .comment-form .card-block{
    padding:0}.article-page .comment-form .card-block textarea{
    border:0;padding:1.25rem}.article-page .comment-form .card-footer .btn{
    font-weight:700;float:right}.article-page .comment-form .card-footer .comment-author-img{
    height:30px;width:30px}.article-page .card{
    border:1px solid #e5e5e5;box-shadow:none!important}.article-page .card .card-footer{
    border-top:1px solid #e5e5e5;box-shadow:none!important;font-size:.8rem;font-weight:300}.article-page .card .comment-author-img{
    display:inline-block;vertical-align:middle;height:20px;width:20px;border-radius:30px}.article-page .card .comment-author{
    display:inline-block;vertical-align:middle}.article-page .card .date-posted{
    display:inline-block;vertical-align:middle;margin-left:5px;color:#bbb}.article-page .card .mod-options{
    float:right;color:#333;font-size:1rem}.article-page .card .mod-options i{
    margin-left:5px;opacity:.6;cursor:pointer}.article-page .card .mod-options i:hover{
    opacity:1}.profile-page .user-info{
    text-align:center;background:#f3f3f3;padding:2rem 0 1rem}.profile-page .user-info .user-img{
    width:100px;height:100px;border-radius:100px;margin-bottom:1rem}.profile-page .user-info h4{
    font-weight:700}.profile-page .user-info p{
    margin:0 auto .5rem;color:#aaa;max-width:450px;font-weight:300}.profile-page .user-info .action-btn{
    float:right;color:#999;border:1px solid #999}.profile-page .articles-toggle{
    margin:1.5rem 0 -1px}.editor-page .tag-list i{
    font-size:.6rem;margin-right:5px;cursor:pointer}


3. layout Layout

be based on realWorld Template page for , The embedded header、footer、 Sub route

newly added layout/index.vue Layout components :

<template>
  <div>
    <!--  Top navigation bar  -->
    <nav class="navbar navbar-light">
        <div class="container">
            <!-- <a class="navbar-brand" href="index.html">conduit</a> -->
            <!-- <a class="navbar-brand" href="/">Home</a> -->
            <nuxt-link class="navbar-brand" to="/">Home</nuxt-link>
            <ul class="nav navbar-nav pull-xs-right">
                <li class="nav-item">
                    <!-- Add "active" class when you're on that page" -->
                    <nuxt-link class="nav-link active" to="/">Home</nuxt-link>
                </li>
                <li class="nav-item">
                    <nuxt-link class="nav-link" to="/editor">
                        <i class="ion-compose"></i>&nbsp;New Article
                    </nuxt-link>
                </li>
                <li class="nav-item">
                    <nuxt-link class="nav-link" to="/settings">
                        <i class="ion-gear-a"></i>&nbsp;Settings
                    </nuxt-link>
                </li>
                <li class="nav-item">
                    <nuxt-link class="nav-link" to="/login">Sign in</nuxt-link>
                </li>
                <li class="nav-item">
                    <nuxt-link class="nav-link" to="/register">Sign up</nuxt-link>
                </li>
                <li class="nav-item">
                  <nuxt-link class="nav-link" to="profile/123">
                    <img class="user-pic" src="https://gimg3.baidu.com/search/src=http%3A%2F%2Fpics0.baidu.com%2Ffeed%2F72f082025aafa40f5a84eff1fb197f4579f019e6.jpeg%3Ftoken%3Dd27ba594bee0f90becf417f2d9490d2e&refer=http%3A%2F%2Fwww.baidu.com&app=2021&size=f360,240&n=0&g=0n&q=75&fmt=auto?sec=1655312400&t=9bc0b5f298c9f18e3e6eb19ed2cddb3c" >
                    username
                  </nuxt-link>
                </li>
            </ul>
        </div>
    </nav>

    <!--  Sub route  -->
    <nuxt-child/>

    <!--  Bottom information bar  -->
    <footer>
        <div class="container">
            <nuxt-link to="/" class="logo-font">conduit</nuxt-link>
            <span class="attribution">
              An interactive learning project from <nuxt-link to="https://thinkster.io">Thinkster</nuxt-link>. Code &amp; design licensed under MIT.
            </span>
        </div>
    </footer>
  </div>
</template>

<script> export default {
       name: 'LayoutIndex' } </script>


4. Custom routing

Reference resources NuxtJS Official documents :

/** * Nuxt.js  The configuration file  */
​
module.exports = {
    
  router: {
    
    //  Custom routing table rules 
    // routes:  An array , Routing configuration table 
    // resolve:  Resolve routing component path 
    extendRoutes(routes, resolve) {
    
      //  This routes The parameter is an array , This is the default routing rule configured by file path 
      //  eliminate  Nuxt.js  be based on  pages  The routing table rules generated by the directory by default 
      routes.splice(0)
      //  Add your own routing rules 
      routes.push(...[
        {
    
          path: '/',
          component: resolve(__dirname, 'pages/layout/')  
        }
      ])
    }    
  }
}

newly build root directory /nuxt.config.js Routing file :

export default {
    
  router: {
    
    extendRoutes(routes, resolve) {
    
      //  eliminate  Nuxt.js  be based on  pages  The routing table rules generated by the directory by default 
      routes.splice(0)

      routes.push(...[
        {
    
          path: '/',
          component: 'pages/layout/index.vue',
          children: [
            {
    
              path: '', //  Default route 
              component: 'pages/home/index.vue',
              name: 'home'
            },{
    
              path: '/login',
              component: 'pages/login/index.vue',
              name: 'login'
            },{
    
              path: '/register',
              component: 'pages/login/index.vue',
              name: 'register'
            },{
    
              path: '/settings',
              component: 'pages/settings/index.vue',
              name: 'settings'
            },{
    
              path: '/editor',
              component: 'pages/editor/index.vue',
              name: 'editor'
            },{
    
              path: '/article/:slug',
              component: 'pages/article/index.vue',
              name: 'article'
            },{
    
              path: '/profile/:username',
              component: 'pages/profile/index.vue',
              name: 'profile'
            }
          ]
        }
      ])
    }
  }
}


5. Import the remaining pages

Import login 、 Registration page , User settings page , Article page, etc , The correspondence is as follows

route page
/ home page
/login Sign in
/register register
/settings User Settings
/editor Publish articles
/editor/:slug Edit the article
/article/:slug Article details
/profile/:username User page
/profile/:username/favorites User page / Favorite articles


6. Navigation bar link style

edit nuxt.config.js Routing file ( The corresponding title of the navigation bar is highlighted ):

router: {
    
  linkActiveClass: 'active',
  ...
}

edit layout/index.vue Routing file (Home Title off highlight ):

<!--  Exactly match , Only route is equal to '/' Will highlight  -->
<nuxt-link class="nav-link" to="/" exact>Home</nuxt-link>




3、 ... and 、 Log in to register

1. Request to packaging

newly build utils/request.js Request module :

// utils/request.js

/** *  be based on  axios  Encapsulated request module  */

import axios from 'axios'

const request = axios.create({
    
  baseURL: 'https://conduit.productionready.io/'
})

export default request


2. Basic login function

  • Implement data binding
  • Realize basic login function
  • Prompt the user with the reason for the error

edit pages/login/login Login component :

<template>
  <div class="auth-page">
    <div class="container page">
      <div class="row">
        <div class="col-md-6 offset-md-3 col-xs-12">
          <h1 class="text-xs-center">{
   { isLogin ? "Sign in" : "Sign up" }}</h1>
          <p class="text-xs-center">
            <nuxt-link to='/register' v-if="isLogin" href="">Have an account?</nuxt-link>
            <nuxt-link to='/login' v-else href="">Need an account?</nuxt-link>
          </p>

          <ul class="error-messages" v-for="(messages, reason, index) in this.errors" :key="index">
            <li v-for="(message, index) in messages" :key="index">{
   {reason}}{
   {message}}</li>
          </ul>

          <form @submit.prevent="onSubmit">
            <fieldset v-if="!isLogin" class="form-group">
              <input v-model="user.username" class="form-control form-control-lg" type="text" placeholder="Your Name" required />
            </fieldset>
            <fieldset class="form-group">
              <input v-model="user.email" class="form-control form-control-lg" type="email" placeholder="Email" required />
            </fieldset>
            <fieldset class="form-group">
              <input v-model="user.password" class="form-control form-control-lg" type="password" placeholder="Password" minlength="8" required />
            </fieldset>
            <button class="btn btn-lg btn-primary pull-xs-right">
              Sign up
            </button>
          </form>
        </div>
      </div>
    </div>
  </div>
</template>

<script> import request from "@/utils/request.js"; export default {
       name: "LoginIndex", computed: {
       isLogin() {
       return this.$route.name === "login"; }, }, data() {
       return {
       user: {
       username: "", email: "", password: "", }, errors: {
      } }; }, methods: {
       async onSubmit() {
       try {
       const {
       data } = await request({
       method: 'POST', url: '/api/users/login', data: this.user }) console.log("data=>", data); this.$router.push("/"); } catch (error) {
       this.errors = error.response.data.errors } }, }, }; </script>


3. api Request to packaging

newly build api/index.js file :

import request from '../plugins/request'

export const login = data => {
     //  Sign in 
  return request ({
    
    method: 'POST',
    url: '/api/users/login',
    data
  })
}
export const register = data => {
     //  register 
  return request ({
    
    method: 'POST',
    url: '/api/users',
    data
  })
}


4. Registration function

edit pages/login/login Login component :

<template>
  <div class="auth-page">
    <div class="container page">
      <div class="row">
        <div class="col-md-6 offset-md-3 col-xs-12">
          <h1 class="text-xs-center">{
   { isLogin ? "Sign in" : "Sign up" }}</h1>
          <p class="text-xs-center">
            <nuxt-link to='/register' v-if="isLogin" href="">Have an account?</nuxt-link>
            <nuxt-link to='/login' v-else href="">Need an account?</nuxt-link>
          </p>

          <ul class="error-messages" v-for="(messages, reason, index) in this.errors" :key="index">
            <li v-for="(message, index) in messages" :key="index">{
   {reason}}{
   {message}}</li>
          </ul>

          <form @submit.prevent="onSubmit">
            <fieldset v-if="!isLogin" class="form-group">
              <input v-model="user.username" class="form-control form-control-lg" type="text" placeholder="Your Name" required />
            </fieldset>
            <fieldset class="form-group">
              <input v-model="user.email" class="form-control form-control-lg" type="email" placeholder="Email" required />
            </fieldset>
            <fieldset class="form-group">
              <input v-model="user.password" class="form-control form-control-lg" type="password" placeholder="Password" minlength="8" required />
            </fieldset>
            <button class="btn btn-lg btn-primary pull-xs-right">
              Sign up
            </button>
          </form>
        </div>
      </div>
    </div>
  </div>
</template>

<script> import {
       login, register } from "@/api/index"; export default {
       name: "LoginIndex", computed: {
       isLogin() {
       return this.$route.name === "login"; }, }, data() {
       return {
       user: {
       username: "", email: "", password: "", }, errors: {
      } }; }, methods: {
       async onSubmit() {
       try {
       const {
       data } = this.isLogin ? await login({
       user: this.user }) : await register({
       user: this.user }) console.log("data=>", data); this.$router.push("/"); } catch (error) {
       this.errors = error.response.data.errors } }, }, }; </script>


5. vuex

Log the user into login status ( Information ) Store in vuex in

newly build store/index.js vuex Status management file :

//  The same instance runs during rendering on the server 
//  To prevent data conflicts , Be sure to put  state  Defined as a function , Return data object 
export const state = () => {
    
  return {
    
    user: null //  User information 
  }
}

export const mutations = {
    
    setUser(state, data) {
    
      state.user = data
    }
}

export const actions = {
    
}

edit pages/login/index.vue Login file :

...

//  Save user login status 
this.$store.commit('setUser', data.user)


6. Identity status information

Different from previous projects , Use nuxt When processing the status of a project, you need to consider : You should not only get the login status in the client rendering, but also get the login status in the server rendering

  1. Will be logged in ( User information ) Store in Vue Of store In the container , The client goes first to vuex Save once in
  2. At this point, the data is only stored in memory , It will disappear after refresh , So the next step is to persist the login state .
  3. But it can't be stored locally , Because only the client can get the local storage , The data can be obtained by both the client and the server
  4. So put the data in cookie, In this way, both front and rear ends can obtain

NuxtJS Official cases , Solve the problem of login status : Cross domain authentication (JWT)

js-cookie

js-cookie It's a simple one , Lightweight processing cookies Of js API, Used for processing cookie Related plug-ins

When rendering on the server side, it will automatically call nuxtServerInit Method ( This method is only executed on the server ), This method will check whether there is in the request header cookie, If there is cookie And determine whether it is in the server environment , If the server-side environment is loaded cookieparser This package , And parse this cookie , Get user data , And the user data is commit Submit mutation , Synchronize user information to Vuex Of state in , Persistence of state 【 The server is going to vuex Update once in 】


//  install  js-cookie
npm i js-cookie

edit pages/login/index.vue Login file :

<script>
//  Load only on the client 
const Cookie = process.client ? require('js-cookie') : undefined

...

//  Data persistence 
Cookie.set('user', data.user)

edit store/index.js vuex Status management file :

const cookieparser = process.server ? require('cookieparser') : undefined

...

export const actions = {
    
  // nuxtServerInit  It's a special one  action  Method , Will be called automatically during server rendering 
  //  effect :  Initialize container data , Pass to the client for use 
  nuxtServerInit ({
      commit }, {
      req }) {
    
    let user = null
    if (req.headers.cookie) {
    
      const parsed = cookieparser.parse(req.headers.cookie)
      try {
    
        user = JSON.parse(parsed.user)
      } catch (err) {
    
        // No valid cookie found
      }
    }
    //  Submit  mutation  modify  cookie
    commit('setUser', user)
  }
}


preview :

Refresh the page ,Vuex The status of is not lost

 Insert picture description here



7. Page access rights

nuxtJS Official route processing scheme : middleware

newly build middleware/authenticated.js Middleware files :

/** *  Verify whether the middleware is logged in  */
export default function ({
      store, redirect }) {
    
  // If the user is not authenticated
  if (!store.state.user) {
    
    return redirect('/login')
  }
}

Configure page permissions ( Modify routing , Will be blocked , Force jump to The login page ):

<script> export default {
       name: 'xxx', middleware: "authenticated", } </script>

newly build middleware/notAuthenticated.js Middleware files :

export default function ({
      store, redirect }) {
    
  // If the user is authenticated redirect to home page
  if (store.state.user) {
    
    return redirect('/')
  }
}

edit pages/login/index.vue Login entry :

<script>
...
export default {
  name: "LoginIndex",
  middleware: "notAuthenticated",
...  




Four 、 home page

1. The article lists

Configure article list routing , newly build api/article.js file :

import request from '../plugins/request'

export const getArticles = params => {
     //  Get article list 
  return request ({
    
    method: 'GET',
    url: '/api/articles',
    params
  })
}
export const getTags = () => {
     //  Get a list of tags 
  return request ({
    
    method: 'GET',
    url: '/api/tags'
  })
}

edit pages/home/index.vue Home page entry file :

<template>
  <div class="home-page">
    <div class="banner">
      <div class="container">
        <h1 class="logo-font">conduit</h1>
        <p>A place to share your knowledge.</p>
      </div>
    </div>

    <div class="container page">
      <div class="row">
        <div class="col-md-9">
          <div class="feed-toggle">
            <ul class="nav nav-pills outline-active">
              <li class="nav-item">
                <a class="nav-link disabled" href="">Your Feed</a>
              </li>
              <li class="nav-item">
                <a class="nav-link active" href="">Global Feed</a>
              </li>
            </ul>
          </div>

          <div v-for="article in articles" :key="article.slug" class="article-preview" >
            <div class="article-meta">
              <nuxt-link :to="{ name: 'profile', params: { username: article.author.username }, }" >
                <img :src="article.author.image" />
              </nuxt-link>
              <div class="info">
                <nuxt-link :to="{ name: 'profile', params: { username: article.author.username }, }" class="author" >{
   { article.author.username }}
                </nuxt-link>
                <span class="date">{
   { article.createdAt }}</span>
              </div>
              <button class="btn btn-outline-primary btn-sm pull-xs-right" :class="{ active: article.favorited }" >
                <i class="ion-heart"></i>
                {
   { article.favoritesCount }}
              </button>
            </div>
            <nuxt-link :to="{ name: 'article', params: { slug: article.slug }, }" class="preview-link" >
              <h1>{
   { article.title }}</h1>
              <p>{
   { article.description }}</p>
              <span>Read more...</span>
            </nuxt-link>
          </div>
          <nav>
            <ul class="pagination">
              <li class="page-item" :class="{ active: item === page, }" v-for="item in totalPage" :key="item" >
                <nuxt-link class="page-link" :to="{ name: 'home', query: { page: item, tag: $route.query.tag, }, }" >{
   { item }}</nuxt-link >
              </li>
            </ul>
          </nav>
        </div>

        <div class="col-md-3">
          <div class="sidebar">
            <p>Popular Tags</p>

            <div v-for="item in tags" class="tag-list" :key="item">
              <nuxt-link :to="{ name: 'home', query: { tag: item, }, }" class="tag-pill tag-default" >
                {
   { item }}
              </nuxt-link>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script> import {
       getArticles, getTags } from "@/api/article.js"; export default {
       //  Listen for parameter string changes  watchQuery: ["page"], name: "HomeIndex", // query  The parameter object of the query string  async asyncData({
        query }) {
       const page = Number.parseInt(query.page || 1); const limit = 1; const [articleRes, tagRes] = await Promise.all([ getArticles({
       limit, offset: (page - 1) * limit, }), getTags(), ]); const {
       articles, articlesCount } = articleRes.data; const {
       tags } = tagRes.data; return {
       articles, articlesCount, limit, page, tags }; }, computed: {
       totalPage() {
       return Math.ceil(this.articlesCount / this.limit); }, }, }; </script>


2. Article list navigation bar

  • What I care about : Show a list of articles by the author of interest
  • All : Show all the articles
  • label : Show articles about this type of tag

edit pages/home/index.vue Home page entry file :

<template>
  <div class="home-page">
    <div class="banner">
      <div class="container">
        <h1 class="logo-font">conduit</h1>
        <p>A place to share your knowledge.</p>
      </div>
    </div>

    <div class="container page">
      <div class="row">
        <div class="col-md-9">
          <div class="feed-toggle">
            <ul class="nav nav-pills outline-active">
              <li v-if="user" class="nav-item">
                <nuxt-link class="nav-link" :class="{active: tab === 'your_feed'}" exact :to="{ name: 'home', query: { tab: 'your_feed' }, }" >Your Feed</nuxt-link>
              </li>
              <li class="nav-item">
                <nuxt-link class="nav-link" :class="{active: tab === 'tag'}" exact :to="{ name: 'home', query: { tab: 'tag', tag }, }" >Global Feed</nuxt-link>
              </li>
              <li v-if="tag" class="nav-item">
                <nuxt-link class="nav-link" :class="{active: tab === 'global_feed'}" :to="{ name: 'home', query: { } }" exact ># {
   {tag}}</nuxt-link>
              </li>
            </ul>
          </div>

          <div v-for="article in articles" :key="article.slug" class="article-preview" >
            <div class="article-meta">
              <nuxt-link :to="{ name: 'profile', params: { username: article.author.username }, }" >
                <img :src="article.author.image" />
              </nuxt-link>
              <div class="info">
                <nuxt-link :to="{ name: 'profile', params: { username: article.author.username }, }" class="author" >{
   { article.author.username }}
                </nuxt-link>
                <span class="date">{
   { article.createdAt | date }}</span>
              </div>
              <button class="btn btn-outline-primary btn-sm pull-xs-right" :class="{ active: article.favorited }" @click="onFavorite(article)" :disabled="article.favoriteDisabled" >
                <i class="ion-heart"></i>
                {
   { article.favoritesCount }}
              </button>
            </div>
            <nuxt-link :to="{ name: 'article', params: { slug: article.slug }, }" class="preview-link" >
              <h1>{
   { article.title }}</h1>
              <p>{
   { article.description }}</p>
              <span>Read more...</span>
            </nuxt-link>
          </div>
          <nav>
            <ul class="pagination">
              <li class="page-item" :class="{ active: item === page, }" v-for="item in totalPage" :key="item" >
                <nuxt-link class="page-link" :to="{ name: 'home', query: { page: item, tag: $route.query.tag, tab }, }" >{
   { item }}</nuxt-link >
              </li>
            </ul>
          </nav>
        </div>

        <div class="col-md-3">
          <div class="sidebar">
            <p>Popular Tags</p>

            <div v-for="item in tags" class="tag-list" :key="item">
              <nuxt-link :to="{ name: 'home', query: { tag: item, tab: 'tag' }, }" class="tag-pill tag-default" >
                {
   { item }}
              </nuxt-link>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script> import {
       getArticles, getFeedArticles, getTags, addFavorite, deleteFavorite } from "@/api/article.js"; import {
       mapState } from 'vuex' export default {
       //  Listen for parameter string changes  watchQuery: ["page", 'tag', 'tab'], name: "HomeIndex", // query  The parameter object of the query string  async asyncData({
        query }) {
       const page = Number.parseInt(query.page || 1); const limit = 1; const {
       tag } = query const {
       tab } = query.tab || 'global_feed' const loadArticle = tab === 'your_feed' ? getFeedArticles : getArticles const [articleRes, tagRes] = await Promise.all([ loadArticle({
       limit, offset: (page - 1) * limit, tag, }), getTags(), ]); const {
       articles, articlesCount } = articleRes.data; articles.forEach(article => {
       article.favoriteDisabled = false }); const {
       tags } = tagRes.data; return {
       articles, articlesCount, limit, page, tags, tag, tab }; }, computed: {
       totalPage() {
       return Math.ceil(this.articlesCount / this.limit); }, ...mapState(['user']) }, methods: {
       async onFavorite(article) {
       article.favoriteDisabled = true if(!article.favorited) {
       await addFavorite(article.slug) article.favoritesCount += 1 article.favorited = true } else {
       await deleteFavorite(article.slug) article.favoritesCount += -1 article.favorited = false } article.favoriteDisabled = false } } }; </script>


3. Time format (Dayjs)

Day.js Designed for use in browsers and Node.js Work in China . All code should work in both environments , All unit tests should run in both environments . Currently used for ci The browser of the system has :Windows XP Upper Chrome, Windows 7 Upper IE 8、ie9 and 10,Windows 10 Upper IE 11, Linux Latest on Firefox, as well as OSX 10.8 and 10.11 Latest on Safari. If you want to try the sample code , Just open the browser console and enter them .

Day.js The official website of the Chinese website



4. Set up users uniformly Token

cookie-js Usage method

edit pages/login/index.vue Login file :

<template>
  <div class="auth-page">
    <div class="container page">
      <div class="row">
        <div class="col-md-6 offset-md-3 col-xs-12">
          <h1 class="text-xs-center">{
   { isLogin ? "Sign in" : "Sign up" }}</h1>
          <p class="text-xs-center">
            <nuxt-link to="/register" v-if="isLogin" href="" >Have an account?</nuxt-link >
            <nuxt-link to="/login" v-else href="">Need an account?</nuxt-link>
          </p>

          <ul class="error-messages" v-for="(messages, reason, index) in this.errors" :key="index" >
            <li v-for="(message, index) in messages" :key="index">
              {
   { reason }}{
   { message }}
            </li>
          </ul>

          <form @submit.prevent="onSubmit">
            <fieldset v-if="!isLogin" class="form-group">
              <input v-model="user.username" class="form-control form-control-lg" type="text" placeholder="Your Name" required />
            </fieldset>
            <fieldset class="form-group">
              <input v-model="user.email" class="form-control form-control-lg" type="email" placeholder="Email" required />
            </fieldset>
            <fieldset class="form-group">
              <input v-model="user.password" class="form-control form-control-lg" type="password" placeholder="Password" required />
            </fieldset>
            <button class="btn btn-lg btn-primary pull-xs-right">
              Sign up
            </button>
          </form>
        </div>
      </div>
    </div>
  </div>
</template>

<script> import {
       login, register } from "@/api/index"; //  Load only on the client  const Cookie = process.client ? require("js-cookie") : undefined; export default {
       name: "LoginIndex", middleware: "notAuthenticated", computed: {
       isLogin() {
       return this.$route.name === "login"; }, }, data() {
       return {
       user: {
       username: "", email: "[email protected]", password: "123456", }, errors: {
      }, }; }, mounted() {
      }, methods: {
       async onSubmit() {
       try {
       const {
       data } = this.isLogin ? await login({
       user: this.user }) : await register({
       user: this.user }); //  Save user login status  this.$store.commit("setUser", data.user); //  Data persistence  Cookie.set("user", data.user); this.$router.push("/"); } catch (error) {
       this.errors = error.response.data.errors; } }, }, }; </script>




5、 ... and 、 Article details page

1. markdown-it

markdown-it It's a front-end one markdown Parsing library , take markdown It can be interpreted as Token flow

markdown-it GItHub Official documents



2. Article details

edit pages/article/index.vue Article details entry file :

<template>
  <div class="article-page">
    <div class="banner">
      <div class="container">
        <h1>{
   { article.title }}</h1>
        <ArticleMeta :article="article" />
      </div>
    </div>

    <div class="container page">
      <div class="row article-content">
        <div class="col-md-12" v-html="article.body"></div>
      </div>

      <hr />

      <div class="article-actions">
        <ArticleMeta :article="article" />
      </div>

      <div class="row">
        <div class="col-xs-12 col-md-8 offset-md-2">
          <form class="card comment-form">
            <div class="card-block">
              <textarea class="form-control" placeholder="Write a comment..." rows="3" ></textarea>
            </div>
            <div class="card-footer">
              <img src="http://i.imgur.com/Qr71crq.jpg" class="comment-author-img" />
              <button class="btn btn-sm btn-primary">Post Comment</button>
            </div>
          </form>

          <ArticleComponent :article="article" />
        </div>
      </div>
    </div>
  </div>
</template>

<script> import {
       getArticle } from "@/api/article"; import MarkdownIt from "markdown-it"; import ArticleMeta from "./components/article-meta.vue"; import ArticleComponent from "./components/article-component.vue"; export default {
       name: "ArticleIndex", components: {
       ArticleMeta, ArticleComponent }, async asyncData({
        params }) {
       const {
       data } = await getArticle(params.slug); const {
       article } = data; const md = new MarkdownIt(); article.body = md.render(article.body); return {
       article, }; }, head() {
       //  Set the header label of the current page  return {
       title: `${
        this.article.title} - RealWorld`, meta: [ {
       hid: "description", name: "description", content: this.article.description, }, ], }; }, }; </script>


3. Author information component

newly build pages/article/components/article-meta.vue file :

<template>
  <div>
    <div class="article-meta">
      <nuxt-link :to="{ name: 'profile', params: { username: article.author.username }, }" >
        <img :src="article.author.image" />
      </nuxt-link>
      <div class="info">
        <nuxt-link :to="{ name: 'profile', params: { username: article.author.username }, }" class="author" >
          {
   { article.author.username }}
        </nuxt-link>
        <span class="date">{
   { article.createdAt | date("MMM DD, YYYY") }}</span>
      </div>
      <button class="btn btn-sm btn-outline-secondary" :class="{ active: article.author.following }" >
        <i class="ion-plus-round"></i>
        &nbsp; Follow Eric Simons <span class="counter">(10)</span>
      </button>
      &nbsp;&nbsp;
      <button class="btn btn-sm btn-outline-primary" :class="{ active: article.favorited }" >
        <i class="ion-heart"></i>
        &nbsp; Favorite Post
        <span class="counter">({
   { article.favoritesCount }})</span>
      </button>
    </div>
  </div>
</template>

<script> export default {
       name: "articleMeta", props: {
       article: {
       type: Object, required: true, }, }, }; </script>


4. Article comment component

newly build pages/article/components/article-component.vue file :

<template>
  <div>
    <div class="card" v-for="comment in comments" :key="comment.id">
      <div class="card-block">
        <p class="card-text">{
   {comment.body}}</p>
      </div>
      <div class="card-footer">
        <nuxt-link :to="{ name: 'profile', params: { username: article.author.username }, }" class="comment-author">
          <img :src="comment.author.image" class="comment-author-img" />
        </nuxt-link>
        &nbsp;
        <nuxt-link :to="{ name: 'profile', params: {username: article.author.username} }" class="comment-author">{
   {comment.author.username}}</nuxt-link>
        <span class="date-posted">{
   {comment.createdAt | date('MMM DD, YYYY')}}</span>
      </div>
    </div>
  </div>
</template>

<script> import {
       getComponents } from '@/api/article' export default {
       name: "articleComponent", props: {
       article: {
       type: Object, required: true } }, data() {
       return {
       comments: [] } }, async mounted () {
       const {
       data } = await getComponents(this.article.slug) this.comments = data.comments } }; </script>




6、 ... and 、 Release deployment

1. Simple deployment

⑴. To configure Host + Post:

edit nuxt.config.js

server: {
    
  host: '0.0.0.0', //  Default localhost
  port: 3000
}

⑵. Upload the server

  • Files that need to be transferred to the server :( And use computer compression software to compress , Generate a compressed package and deliver it to the server )
  • Whole .nuxt Folder :Nuxt Package the generated resource file
  • static: Static resources
  • nuxt.config.js: Provide to Nuxt service
  • package.json: It is used to install the third-party package on the server
  • package-lock.json: It is used to install the third-party package on the server

⑶. Send the release package to the server

obtain realworld-nuxtjs.zip Deliver to the server

ssh [email protected]   //  Link server 

mkdir realworld-nuxtjs  //  Create project directory 

cd realworld-nuxtjs/     //  Go to the current directory 

pwd  //  Print current path , And copy 

Copy path path and exit Exit Service

scp .\realworld-nuxtjs.zip [email protected]:/root/realworld-nuxtjs

⑷. decompression

ssh [email protected]  //  Reconnect the server 

cd realworld-nuxtjs/     //  Go to the project directory 

unzip realworld-nuxtjs.zip    //  Unzip the uploaded compressed package 

ls -a		//  Display with . The hidden file at the beginning 

npm i //  Installation dependency 

npm run start //  Start the service 


2. Use PM2 start-up Node service

⑴. PM2

PM2 What is it? ?

Just now, we passed the server directly npm run start Command to start Web service , If we start it this way , At this time, the command line is occupied . We want it to run the application in the background , So you need to use pm2 Tools :

⑵. Use PM2 Start the service

  • GitHub Warehouse address :https://github.com/Unitech/pm2
  • Official documents :https://pm2.io/
  • install :npm install --global pm2
  • start-up :pm2 start Script path
#  No, node Environment 
# wget -qO- https://getpm2.com/install.sh | bash

npm install --global pm2

pm2 start npm -- start  //  Equivalent to using pm2 Guard execution  npm run start

⑶. PM2 Common commands

command explain
pm2 list Check out the list of apps
pm2 start Start the application
pm2 stop Stop applying
pm2 reload Overloaded applications
pm2 restart restart app
pm2 delete Delete app


3. Deploy

⑴. Traditional deployment

Traditional deployment methods need to be updated repeatedly 、 structure 、 Release , It seems very troublesome , So automated deployment is introduced

⑵. Modern deployment mode (CI/CD)

  • CI : Continuous integration
  • CD: Continuous deployment

⑶. Use GitHub Actions To achieve automatic deployment

  • To configure GitHub Access Token
  • Configuration to project Secrets in
  • To configure GitHub Actions Execute the script
    • Create in project root .github/workflows Catalog

    • download main.yml To workflows Directory , Be sure that the suffix is yml

    • newly added pm2 Configuration file for :pm2.config.json

      {
              
        "apps": [
          {
              
            "name": "RealWorld",
            "script": "npm",
            "args": "start"
          }
        ]
      }
      
    • Submit update

      git add .
      
      git commit -m " Release deployment - test "
      
      git tag v0.1.0
      
      git push origin v0.1.0
      
    • View Auto deployment status

    • Access the network

    • Submit update



4. Online address

The final project online deployment address is :http://117.50.98.227:3306/



原网站

版权声明
本文为[Houhai 0_ o]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/176/202206251019484954.html